Sběrnice I2C

Po delší odmlce se vracím zpět na pokračování seriálu o programování procesorů AVR. Dnes se podíváme na zoubek sběrnici I2C, která je často používána k připojení periferních zařízení jako jsou například EEPROM, RTC, AD/DA převodníků a dalších.

Sběrnice I2C je speciální sběrnice vyvynutá firmou Philips Semiconductors (dnes již NXP), pro účely připojování periferních zařízení (SLAVE) k jednomu řídícímu (MASTER). Master inicializuje veškerou komunikaci na sběrnuici, řídí ji a dodává hodinové pulzy. Každé SLAVE zařízení na sběrnici má svou unitkátní adresu, která je složena z pevné části vypálené uvnitř součástky a často také z volitelné části, kterou může konstruktér odlišit stejné odvody na jedné sběrnici. Dále nemá asi cenu I2C popisovat, dobrý popis můžete najít na české wikipedii:

I obvody AVR mají sběrnici implementovanou. Vzhledem k tomu, že se zřejmě fy ATMEL nechtělo platit za licenční poplatky (které jsou dnes již historií), pojmenovala sběrnici v obodech AVR jako TWI (two wire interface).

Pro práci s TWI samozřejmě jako vždy používáme opět speciální registry. Jsou to:
  • TWBR (TWO WIRE BAUD RATE) - zde nastavujeme přenosovou rychlost
  • TWCR (TWO WIRE CONTROL REGISTER) - řídící registr sběrnice TWI:


  • TWSR (TWO WIRE STATUS REGISTER) - zde jsou stavové bity TWI
  • TWAR (TWO WIRE ADRESS REGISTER) - zde se nachází adresa modulu procesoru, pokud bude pracovat jako slave)
  • TWDR - datový registr sběrnice I2C.

    Registry netřeba pro naše účely více představovat, to uděláme v některém z dalších dílů, kdy se pokusíme vytvořit ovládací program pro sériovou eeprom v assembleru. Dnes však využijeme hotovou knihovnu pro jazyk C. Tím si jednoduše osvětlíme komunikaci na sběrnici I2C. Než však začneme s programem, vytvoříme si jednoduchou destičku, která mám umožní připojit sériovou eeprom bez zbytečných zkratů a špatně zapojených drátků v "bastlpoli".


 schéma a DPS

DPS je osazen obvodem 24AA04 od Microchipu a adresa obvodu tak jak je nastaven na obrázku je A0.

Jak už jsem uvedl výše, použijeme pro komunikaci hotovou knihovnu. Tu jsem stáhl na stránkách http://jump.to/fleury a nebylo ji třeba kromě změny definice frekvence procesoru v hlavičkovém souboru nijak upravovat.

Knihovny můžete stáhnout zde:
obsahují vše potřebné pro vytvoření našeho prvního programu pracijícího se sběrnicí I2C.

#define F_CPU 14745600UL

#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd_lib.h"
#include "twi_lib.h"

#define Dev24AA04  0xA0

unsigned char pole[8]={'T','E','S','T',' ','E','E','P'};

int main(void)
{   
   
unsigned char i=0;
   
    LCD_Init();   
    i2c_init();
    LCD_Position(0,0);
    LCD_WriteCString("TEST TWI");   
   
    i2c_start_wait(Dev24AA04+I2C_WRITE);    
    i2c_write(0x00);                       
   
   
for (i=0; i<8; i++)
        i2c_write(pole[i]);
                      
    i2c_stop();

   
    LCD_Position(1,0);

    i2c_start_wait(Dev24AA04+I2C_WRITE);    
    i2c_write(0x00);                       
    i2c_rep_start(Dev24AA04+I2C_READ); 
        
   
for (i=0; i<7; i++)
        LCD_WriteData(i2c_readAck());                  
    LCD_WriteData(i2c_readNak());

    i2c_stop();
   
while(1);
}



Uvedený příklad snad není třeba vysvětlovat. Nejdříve je inicializováno LCD a následně je zobrazen nápis. Zároveň je inicializována sběrnice I2C:

    LCD_Init();   
    i2c_init();
    LCD_Position(0,0);
    LCD_WriteCString("TEST TWI");  



Následně je od adresy 0h v cyklu zapsán obsah pole s textem "TEST TWI":

    i2c_start_wait(Dev24AA04+I2C_WRITE);    
    i2c_write(0x00);                       
   
   
for (i=0; i<8; i++)
        i2c_write(pole[i]);
                      
    i2c_stop();

Poté je je přesunut kurzor na druhý řádek je obsah EEPROM vypsán na displej:

    LCD_Position(1,0);

    i2c_start_wait(Dev24AA04+I2C_WRITE);    
    i2c_write(0x00);                       
    i2c_rep_start(Dev24AA04+I2C_READ); 
        
   
for (i=0; i<7; i++)
        LCD_WriteData(i2c_readAck());                  
    LCD_WriteData(i2c_readNak());

    i2c_stop();

Celý projekt lze stáhnout v toto archivu. Upozorňuji, že pro správnou práci knihovny LCD, kterou je možné stáhnout v díle o práci s LCD, je nutné mít vypnuté optimalizace.

Komentovat článek

Jméno:  
Zpráva:

Komentáře k článku

článek zatím nikdo nekomentoval