Zbernica i2c: EEPROM: Rozdiel medzi revíziami
Zo stránky SensorWiki
| (5 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
| Riadok 35: | Riadok 35: | ||
=== 1. Schéma zapojenia ===  | === 1. Schéma zapojenia ===  | ||
[[Súbor:i2c_schematic.png|400px|center]]  | [[Súbor:i2c_schematic.png|400px|center]][[Súbor:i2c_breadboard.png|400px|center]]  | ||
[[Súbor:i2c_breadboard.png|400px|center]]  | |||
Správnosť zapojenia si môžete vyskúšať programom [[Médiá:i2c_scan.ino]] - nájde všetky obvody pripojené na zbernici.  | Správnosť zapojenia si môžete vyskúšať programom [[Médiá:i2c_scan.ino]] - nájde všetky obvody pripojené na zbernici.  | ||
Nachádza sa aj priamo vo vývojovom prostredí Arduino, pozri Examples -> Wire -> i2c_scan.  | |||
=== 2. Device address ===  | === 2. Device address ===  | ||
| Riadok 93: | Riadok 92: | ||
   /*  Precitame hodnotu zapisanu v predchadzajucom kroku z EEPROM addresy 0   */  |    /*  Precitame hodnotu zapisanu v predchadzajucom kroku z EEPROM addresy 0   */  | ||
      i2c_start_wait( (EEPROM_ADDR << 1) | I2C_WRITE);      // set device address and write mode  |       i2c_start_wait( (EEPROM_ADDR << 1) | I2C_WRITE);      // 1: set device address and write mode  | ||
      i2c_write(0x00);                                      // write address = 0  |       i2c_write(0x00);                                      // 2: write address = 0  | ||
      i2c_rep_start( (EEPROM_ADDR << 1) | I2C_READ );       // set device address and read mode  |       i2c_rep_start( (EEPROM_ADDR << 1) | I2C_READ );       // 3: set device address and read mode  | ||
      val = i2c_readNak();                                  // read one byte from EEPROM  |       val = i2c_readNak();                                  // 4: read one byte from EEPROM  | ||
      i2c_stop();  |       i2c_stop();                                           // 5: stop  | ||
</source>  | </source>  | ||
| Riadok 106: | Riadok 105: | ||
<div style='text-align: center;'>  | <div style='text-align: center;'>  | ||
   [[Súbor:  |    [[Súbor:i2c_read.png|600px|center]]<br>  | ||
''Postupnosť pre čítanie hodnoty z EEPROM pamäte.''  | ''Postupnosť pre čítanie hodnoty z EEPROM pamäte.''  | ||
</div>  | </div>  | ||
Jednoduchý program na prečítanie 1 byte z pamäte pre Arduino s využitím knižnice [https://www.arduino.cc/reference/en/libraries/i2c_eeprom/ I2C_EEPROM] je tu:  | |||
<source lang="c">  | |||
#include <I2C_eeprom.h>  | |||
#define MAXBYTES 2048/8         // it's only 2Kbit  | |||
#define DEVICEADDRESS (0x50)   // the address of your EEPROM  | |||
I2C_eeprom eeprom(DEVICEADDRESS,MAXBYTES);  | |||
byte value;  | |||
byte adresa = 0x00;  | |||
void setup()  | |||
{  | |||
  Serial.begin(9600);  | |||
  Serial.println("*** Reading memory content: ***");  | |||
  Wire.begin();  | |||
  eeprom.begin();  | |||
  value = eeprom.readByte(adresa);  | |||
  Serial.print((char)value);   | |||
  Serial.println("\nDone...");  | |||
}  | |||
void loop()  | |||
{  | |||
  // Nothing to do during loop  | |||
}  | |||
</source>  | |||
[[Category:DVPS]][[Category:AVR]][[Category:MMP]][[Category:I2C]][[Category:MIPS]]  | [[Category:DVPS]][[Category:AVR]][[Category:MMP]][[Category:I2C]][[Category:MIPS]]  | ||
Aktuálna revízia z 07:08, 26. apríl 2024
Oboznámenie so zbernicou i2c
Úlohy:
- Pripojte k procesoru pamäť podľa schémy zapojenia
 - Schému upravte tak, aby adresa zariadenia bola ?? - určí cvičiaci
 - Zapíšte na prvé pamäťové miesto (adresa 0x00) znak 'A'
 - Prečítajte, či je znak správne zapísaný
 - Prečítajte obsah celej pamäte a vypíšte ho na terminál PC
 - Zapíšte do pamäte 10 bytov nejakej informácie a zistite, ako dlho trvá zápis jedného byte, t.j. aká veľká musí byť prestávka medzi jednotlivými zápismi.
 
Literatúra
- Official I2C Specification Version 6 http://www.nxp.com/documents/user_manual/UM10204.pdf
 - Official List of assigned NXP / Philips I2C addresses http://www.diolan.com/downloads/i2c-address-allocation-table.pdf
 - Mitchell Kahn: Programming the i2c interface. Dr. Dobb's Journal, June 1992.
 - Example using the two-wire interface (TWI). AVRlibc demo projects.
 
Datasheets
1. Schéma zapojenia


Správnosť zapojenia si môžete vyskúšať programom Médiá:i2c_scan.ino - nájde všetky obvody pripojené na zbernici.
Nachádza sa aj priamo vo vývojovom prostredí Arduino, pozri Examples -> Wire -> i2c_scan.
2. Device address

3. Inicializácia
Pri tvorbe programu pre modul budeme využívať už hotovú knižnicu i2cmaster dostupnú odtiaľto http://senzor.robotika.sk/mmp/src/i2c/
Najprv je potrebné zbernicu inicializovať:
         i2c_init();                                       // initialize I2C library
4. Zápis
Zápis je jednoduchší, preto ním začneme:
       // zapis hodnotu  0x41 ('A') to EEPROM address 00 (Byte Write) 
     i2c_start_wait( (EEPROM_ADDR << 1) | I2C_WRITE);     // 1: set device address and write mode
     i2c_write(0x00);                                     // 2: write address = 0
     i2c_write(0x41);                                     // 3: write value 0x41 to EEPROM
     i2c_stop();                                          // 4: set stop conditon = release bus
5. Čítanie
Čítanie vyžaduje trocha viac krokov, pretože najprv musíme smerom do EEPROM nastaviť adresu, z ktorej chceme čítať a potom obrátime smer komunikácie a počkáme na data z pamäti.
  /*  Precitame hodnotu zapisanu v predchadzajucom kroku z EEPROM addresy 0   */
     i2c_start_wait( (EEPROM_ADDR << 1) | I2C_WRITE);      // 1: set device address and write mode
     i2c_write(0x00);                                      // 2: write address = 0
     i2c_rep_start( (EEPROM_ADDR << 1) | I2C_READ );       // 3: set device address and read mode
     val = i2c_readNak();                                  // 4: read one byte from EEPROM
     i2c_stop();                                           // 5: stop
Program je samozrejme vhodné doplniť o zobrazenie prečítanej hodnoty v termináli cez sériové rozhranie.
Jednoduchý program na prečítanie 1 byte z pamäte pre Arduino s využitím knižnice I2C_EEPROM je tu:
#include <I2C_eeprom.h>
#define MAXBYTES 2048/8         // it's only 2Kbit
#define DEVICEADDRESS (0x50)   // the address of your EEPROM
I2C_eeprom eeprom(DEVICEADDRESS,MAXBYTES);
byte value;
byte adresa = 0x00;
void setup()
{
  Serial.begin(9600);
  Serial.println("*** Reading memory content: ***");
  
  Wire.begin();
  eeprom.begin();
  
  value = eeprom.readByte(adresa);
  Serial.print((char)value); 
 
  Serial.println("\nDone...");
}
void loop()
{
  // Nothing to do during loop
}



