Zbernica i2c: EEPROM
Zo stránky SensorWiki
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
![](/sensorwiki/images/thumb/4/4b/I2c_schematic.png/400px-I2c_schematic.png)
![](/sensorwiki/images/thumb/1/1e/I2c_breadboard.png/400px-I2c_breadboard.png)
Správnosť zapojenia si môžete vyskúšať programom Médiá:i2c_scan.ino - nájde všetky obvody pripojené na zbernici.
2. Device address
![](/sensorwiki/images/thumb/1/11/I2c_address.png/400px-I2c_address.png)
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); // set device address and write mode
i2c_write(0x00); // write address = 0
i2c_write(0x41); // write value 0x41 to EEPROM
i2c_stop(); // 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); // set device address and write mode
i2c_write(0x00); // write address = 5
i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
val = i2c_readNak(); // read one byte from EEPROM
i2c_stop();
for(;;);
Program je samozrejme vhodné doplniť o zobrazenie prečítanej hodnoty v termináli cez sériové rozhranie.