Zbernica i2c: EEPROM: Rozdiel medzi revíziami
Z SensorWiki
(→1. Schéma zapojenia) |
|||
(12 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 6: | Riadok 6: | ||
# Pripojte k procesoru pamäť podľa schémy zapojenia | # Pripojte k procesoru pamäť podľa schémy zapojenia | ||
− | # Schému upravte tak, aby adresa zariadenia bola ?? | + | # Schému upravte tak, aby adresa zariadenia bola ?? - určí cvičiaci |
# Zapíšte na prvé pamäťové miesto (adresa 0x00) znak 'A' | # Zapíšte na prvé pamäťové miesto (adresa 0x00) znak 'A' | ||
# Prečítajte, či je znak správne zapísaný | # Prečítajte, či je znak správne zapísaný | ||
− | # Prečítajte obsah celej pamäte a vypíšte ho na terminál | + | # 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. | # 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. | ||
Riadok 17: | Riadok 17: | ||
* Official I2C Specification Version 6 http://www.nxp.com/documents/user_manual/UM10204.pdf | * 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 | * Official List of assigned NXP / Philips I2C addresses http://www.diolan.com/downloads/i2c-address-allocation-table.pdf | ||
− | * | + | * Mitchell Kahn: ''[http://ap.urpi.fei.stuba.sk/mmp/doc/prog_i2c.pdf Programming the i2c interface].'' Dr. Dobb's Journal, June 1992. |
− | + | * [http://www.nongnu.org/avr-libc/user-manual/group__twi__demo.html Example using the two-wire interface (TWI)]. AVRlibc demo projects. | |
− | * [ | + | |
+ | |||
=== Datasheets === | === Datasheets === | ||
+ | |||
* [http://www.atmel.com/images/doc0180.pdf AT24C02 EEPROM memory] | * [http://www.atmel.com/images/doc0180.pdf AT24C02 EEPROM memory] | ||
+ | * [http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00001163.pdf M24C02 Datasheet] | ||
+ | |||
+ | [[Obrázok:i2c_M24C02.jpg]] [[Obrázok:i2c_M24C02_pinout.jpg]] | ||
− | |||
=== 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 42: | Riadok 45: | ||
[[Súbor:i2c_address.png|400px|center]] | [[Súbor:i2c_address.png|400px|center]] | ||
− | |||
− | |||
− | |||
− | |||
− | + | === 3. Inicializácia === | |
− | |||
− | + | Pri tvorbe programu pre modul budeme využívať už hotovú knižnicu <code>i2cmaster</code> dostupnú odtiaľto http://senzor.robotika.sk/mmp/src/i2c/ | |
− | |||
− | |||
− | |||
− | |||
− | + | Najprv je potrebné zbernicu inicializovať: | |
+ | <source lang="c"> | ||
− | + | i2c_init(); // initialize I2C library | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | === 4. Zápis === | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Zápis je jednoduchší, preto ním začneme: | |
− | |||
− | |||
− | + | <source lang="c"> | |
− | + | // 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 | ||
</source> | </source> | ||
− | + | <div style='text-align: center;'> | |
− | + | [[Súbor:i2c_write.png|600px|center]]<br> | |
− | + | ''Postupnosť pre zápis hodnoty z EEPROM pamäte.'' | |
− | + | </div> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | [[ | ||
− | |||
− | '' | ||
− | |||
− | |||
− | |||
+ | === 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. | ||
<source lang="c"> | <source lang="c"> | ||
− | + | /* 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 | ||
+ | </source> | ||
− | + | Program je samozrejme vhodné doplniť o zobrazenie prečítanej hodnoty v termináli cez sériové rozhranie. | |
− | |||
+ | <div style='text-align: center;'> | ||
+ | [[Súbor:i2c_read.png|600px|center]]<br> | ||
+ | ''Postupnosť pre čítanie hodnoty z EEPROM pamäte.'' | ||
+ | </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: | + | [[Category:DVPS]][[Category:AVR]][[Category:MMP]][[Category:I2C]][[Category:MIPS]] |
Aktuálna revízia z 07:08, 26. apríl 2024
Obsah
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
}