Sběrnice I2C
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".
Knihovny můžete stáhnout zde:
#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();
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
Komentáře k článku
článek zatím nikdo nekomentoval

