Operácie

Zbernica i2c: EEPROM: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
Balogh (diskusia | príspevky)
 
(9 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 66: Riadok 65:


=== 4. Zápis ===
=== 4. Zápis ===
[[Súbor:i2c_write.png|600px|center]]


Zápis je jednoduchší, preto ním začneme:
Zápis je jednoduchší, preto ním začneme:
Riadok 75: Riadok 72:
       // zapis hodnotu  0x41 ('A') to EEPROM address 00 (Byte Write)  
       // 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_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_write(0x41);                                    // write value 0x41 to EEPROM
     i2c_write(0x41);                                    // 3: write value 0x41 to EEPROM
     i2c_stop();                                          // set stop conditon = release bus
     i2c_stop();                                          // 4: set stop conditon = release bus


</source>
</source>


             
<div style='text-align: center;'>
<div style='text-align: center;'>
[[File:EEPROM_ReadValue.png]]<br>
  [[Súbor:i2c_write.png|600px|center]]<br>
''Postupnosť pre čítanie hodnoty z EEPROM pamäte.''
''Postupnosť pre zápis hodnoty z EEPROM pamäte.''
</div>
</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.


<div style='text-align: center;'>
<source lang="c">
[[File:EEPROM_WriteValue.png]]<br>
 
''Postupnosť pre zápis hodnoty do obvodu 8591.''
  /*  Precitame hodnotu zapisanu v predchadzajucom kroku z EEPROM addresy 0  */
</div>


    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


=== 5. Čítanie ===
</source>


[[Súbor:i2c_read.png|600px|center]]
Program je samozrejme vhodné doplniť o zobrazenie prečítanej hodnoty v termináli cez sériové rozhranie.  


[[Súbor:i2c_readRandom.png|400px|center]]
<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">
<source lang="c">
#include <I2C_eeprom.h>


   /*  Precitame hodnotu zapisanu v predchadzajucom kroku z EEPROM addresy 0  */
#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;


    i2c_start_wait( (EEPROM_ADDR << 1) | I2C_WRITE);     // set device address and write mode
void setup()
{
  Serial.begin(9600);
  Serial.println("*** Reading memory content: ***");
 
  Wire.begin();
  eeprom.begin();
 
  value = eeprom.readByte(adresa);
  Serial.print((char)value);  
   
   
    i2c_write(0x00);                       // write address = 5
  Serial.println("\nDone...");
    i2c_rep_start(Dev24C02+I2C_READ);      // set device address and read mode
}


    val = i2c_readNak();                    // read one byte from EEPROM
void loop()
    i2c_stop();
{
 
  // Nothing to do during loop
    for(;;);
}


</source>
</source>


Program je samozrejme vhodné doplniť o zobrazenie prečítanej hodnoty v termináli cez sériové rozhranie.




[[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:

  1. Pripojte k procesoru pamäť podľa schémy zapojenia
  2. Schému upravte tak, aby adresa zariadenia bola ?? - určí cvičiaci
  3. Zapíšte na prvé pamäťové miesto (adresa 0x00) znak 'A'
  4. Prečítajte, či je znak správne zapísaný
  5. Prečítajte obsah celej pamäte a vypíšte ho na terminál PC
  6. 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


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

Postupnosť pre zápis hodnoty z EEPROM pamäte.

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.


Postupnosť pre čítanie hodnoty z EEPROM pamäte.

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
}