Interfejs I²C slave w mikrokontrolerach AVR
Wtorek, 01 Grudzień 2009
Zaprojektowany przez Philipsa interfejs I²C pozwala prowadzić
komunikację pomiędzy inteligentnymi modułami, a nawet
pojedynczymi układami systemów cyfrowych, przy wykorzystaniu
bardzo prostej, dwuprzewodowej magistrali szeregowej. Interfejs ten
stał się jednym z najbardziej popularnych standardów stosowanych
przez wielu światowych producentów, choć z przyczyn licencyjnych
nie zawsze występuje jako I²C.
Rekomendacje: przykłady przedstawione w artykule należy
traktować jako wskazówkę i inspirację przydatną podczas realizacji
własnych projektów.
78 ELEKTRONIKA PRAKTYCZNA 12/2009
NotatNik koNstruktora
Dodatkowe materiały na CD i FtP:
host: ep.com.pl, user: 12235, pass: 60u61csy
?listingi do artykułu
Sposób dołączania układów do magistrali
I2
C pokazano na rys. 1. Układy mogą praco-
wać w trybach master (nadrzędnym) lub slave
(podrzędnym). Układ master steruje transmi-
sją, slave tylko transmituje dane w odpowie-
dzi na rozkazy układu nadrzędnego. W jednej
magistrali I2
C może pracować kilka układów
nadrzędnych i podrzędnych. Stosowane są
dwa standardy interfejsu ? pierwszy przewi-
duje prowadzenie transmisji z prędkościami
do 100 kbit/s (tryb normalny), w drugim pręd-
kość transmisji może dochodzić do 400 kbit/s
(tryb szybki). Dopuszczalna długość połączeń
oraz prędkość transmisji ograniczone są po-
jemnościami pasożytniczymi występującymi
Interfejs I2
C slave
w mikrokontrolerach AVR
Zaprojektowany przez Philipsa interfejs I2
C pozwala prowadzić
komunikację pomiędzy inteligentnymi modułami, a nawet
pojedynczymi układami systemów cyfrowych, przy wykorzystaniu
bardzo prostej, dwuprzewodowej magistrali szeregowej. Interfejs ten
stał się jednym z najbardziej popularnych standardów stosowanych
przez wielu światowych producentów, choć z przyczyn licencyjnych
nie zawsze występuje jako I2
C.
Rekomendacje: przykłady przedstawione w artykule należy
traktować jako wskazówkę i inspirację przydatną podczas realizacji
własnych projektów.
w magistrali. Do transmisji używa się dwóch
linii: SDA ? linia danych i SCL ? linia zega-
rowa. Każdy układ slave z magistralą I2
C jest
rozpoznawany przez unikatowy adres, nie-
zależnie od tego, czy jest to mikrokontroler,
pamięć, czy inny układ. Obydwie linie (SDA
i SCL) są liniami dwukierunkowymi i muszą
być podciągane do plusa zasilania przez rezy-
story zewnętrzne (rys. 1). Ich rezystancja wy-
nosi zazwyczaj 4,7 kV. W stanie spoczynku
(gdy dane nie są przesyłane) na obu liniach
występuje wysoki poziom logiczny. Dane
przesyłane magistralą I2
C są 8-bitowe. Każda
wymiana danych rozpoczyna się sekwencją
startu, a kończy sekwencją stopu. Każde pra-
widłowe przesłanie bajtu danych jest sygnali-
zowane sekwencją potwierdzenia (ACK).
Urządzenia konstruowane współcześnie
najczęściej budowane są jako zespół spe-
cjalizowanych bloków połączonych ze sobą
w jeden system. Każdy z takich bloków reali-
zuje przydzieloną mu funkcję, a wszystkim
steruje najczęściej mikrokontroler. Aby urzą-
dzenie takie mogło działać prawidłowo, ko-
nieczne jest komunikowanie się między sobą
poszczególnych bloków, czasami bezpośred-
nio, czasami poprzez nadzorujący mikrokon-
troler. Do prowadzenia takiej łączności moż-
na stosować wiele istniejących standardów.
Jednym z najlepszych w tym zakresie jest
I2
C. W celu uniknięcia chaosu jeden z tych
bloków pełni funkcję master, pozostałe bloki
(każdy z nich może zawierać własny mikro-
kontroler) są podporządkowane.
Wiele specjalizowanych układów ma
fabrycznie zaimplementowany interfejs I2
C,
pracujący najczęściej jako slave. Nie zawsze
jednak układy takie nadają się do bezpośred-
niego zastosowania w danym urządzeniu.
Jednym ze sposobów poradzenia sobie z tego
typu problemami może być implementacja
podrzędnego interfejsu I2
C w mikrokontro-
lerze. Dzięki takiemu rozwiązaniu (głównie
dzięki możliwości dość swobodnego przy-
stosowania oprogramowania) można uzy-
skać dowolny algorytm działania układu
podrzędnego.
Poniżej zostanie przedstawiona progra-
mowa oraz sprzętowa implementacja pod-
rzędnego interfejsu I2
C w zasobach mikrokon-
trolera AVR. Należy zwrócić uwagę na to, że
niektóre mikrokontrolery AVR mają wbudo-
wany interfejs I2
C (nazywany przez firmę At-
mel ? TWI), mogący pracować jako układ nad-
rzędny lub podrzędny. Programowy interfejs
I2
C slave można wykorzystywać zwłaszcza
w małych mikrokontrolera niezawierających
sprzętowego TWI. Zostaną przedstawione
przykłady realizacji układu slave, z którego
układ nadrzędny może odczytać stan dwóch
linii wejściowych portu, wysłać do niego stan
dwóch linii wyjściowych portu, odczytać
wartość napięcia zmierzoną przez przetwor-
nik A/C układu slave oraz wysłać do niego
wartość wypełnienia generowanego przebie-
gu PWM również przez układ slave. Obie
realizacje, programowa i sprzętowa, będąrys. 2. Przykładowy schemat układu i2
C slave
rys. 1. Łączenie układów do magistrali i2
C
79ELEKTRONIKA PRAKTYCZNA 12/2009
Interfejs I2
C slave w mikrokontrolerach AVR
identyczne pod względem funkcjonalnym.
Przykłady interfejsu slave w mikrokontro-
lera AVR zostaną przedstawione w oparciu
o oprogramowanie BASCOM AVR. Pokazana
zostanie również programowa i sprzętowa
realizacja układu master z interfejsem I2
C
zaimplementowanego w zasoby mikrokon-
trolera. Będzie on odczytywać z układu slave
stan linii wejściowych portu i zapisywać je
do linii wyjściowych układu slave. Układ ten
będzie również odczytaną z przetwornika A/C
wartość wysyłał do układu slave, traktując ją
jako wartość wypełnienia przebiegu PWM ge-
nerowanego przez układ slave. Odczytywane
wartości z układu slave będą wyświetlane na
wyświetlaczu LCD dołączonym do mastera.
Komunikacja z układem slave będzie się od-
bywać z wykorzystaniem prostego protokołu,
składającego się z adresu układu slave, adre-
su komendy i odczytywanej lub zapisywanej
danej. Układ slave zrealizowany w oparciu
o mikrokontroler umożliwia także wybór jego
adresu, na który będzie odpowiadał układ.
Programowa realizacja interfejsu
I2
C slave
Na rys. 2 został pokazany przykładowy
schemat układu I2
C slave. Porty, do których
zostały dołączone przyciski S1 i S2, są skon-
figurowane jako wejściowe. Ich stan może
odczytywać układ master. Porty, do których
zostały dołączone diody D1 i D2, pracują
w trybie wyjściowym. Ich stanem również
może sterować układ master. Wejściowa li-
nia PC0 stanowi wejście 10-bitowego prze-
twornika A/C wbudowanego w mikrokon-
troler. Potencjometr P1 umożliwia zmianę
napięcia mierzonego przez przetwornik A/C.
Elementy L1, C1 i C2 są wymagane do zasila-
nia przetwornika A/C i związanego z nim na-
pięcia referencyjnego, które zostało ustalone
na wartość 5 V. Wyjście sterujące diodą D3
pracuje w trybie generatora PWM. Jasność
świecenia diody D3 będzie zależeć od wy-
pełnienia przebiegu PWM. Zworki JP1 i JP2
umożliwiają wybór adresu układu slave.
W przypadku programowej realizacji inter-
fejsu I2
C, linia SCL jest dołączona do portu
PD4 mikrokontrolera, a linia SDA do PD2.
Taki wybór linii mikrokontrolera związany
jest z budową biblioteki i2cslave.lib znaj-
dującej się w pakiecie Bascom AVR. Komu-
nikacja z układem slave (odczyt i zapis da-
nych) może się odbywać za pomocą komend.
W przykładzie będą potrzebne 2 komendy,
które będą służyć do zapisu i odczytu sta-
nu portów mikrokontrolera oraz do odczytu
wartości z przetwornika A/C i zapisu war-
tości do generatora PWM. Przykładowe ko-
mendy dla opisywanego układu slave przed-
stawiono w tab. 1. Specyfikacja interfejsu I2
C
umożliwia wykorzystanie jednej komendy
do zapisu i odczytu danych do różnych reje-
strów. Rodzaj operacji (zapis lub odczyt) jest
rozróżniany w adresie układu slave. W przy-
padku odczytu, adres układu slave jest o je-
den większy niż podczas zapisu danych
do układu. Przykładowo: jeśli adres zapisu
układu jest równy 64, to przy odczycie bę-
dzie wykorzystywany adres 65. Oczywiście
w przypadku interfejsu I2
C należy wcześniej
zapisać do układu adres komendy, która bę-
dzie informowała układ Slave, którą wartość
rejestru ma wysłać do układu master. Na
list. 1 (wszystkie listingi zamieszczono na
CD-EP12/2009) pokazano przykład progra-
mowej realizacji interfejsu I2
C slave. Do po-
prawnej pracy programowego interfejsu I2
C
slave wymagana jest biblioteka i2cslave.lib.
Do konfiguracji programowego interfejsu I2
C
służy komenda CONFIG I2CSLAVE. Składnia
tej komendy jest następująca:
CONFIG I2CSLAVE = address , INT =
interrupt , TIMER = tmr
gdzie:
ADDRESS ? adres układu slave, musi
być wartością parzystą (nieparzyste wartości
adresu służą do odczytu danych z układu
slave),
INT ? domyślny parametr, który wskazu-
je na numer wykorzystywanego przerwania
(domyślnie wykorzystywane jest zewnętrzne
przerwanie INT0),
TIMER ? domyślny parametr, który
wskazuje na numer wykorzystywanego time-
ra (domyślnie wykorzystywany jest Timer0).
Pomimo że nazwa wykorzystywanego
przerwania jak i timera może być dodatko-
wo podana, to aby skorzystać z innego prze-
rwania lub timera, należy przekonstruować
zawartość biblioteki i2cslave.lib. Użycie li-
nii PD.4 (T0), która jest wejściem Timera0
oraz linii PD.2 (INT0), która jest wejściem
zewnętrznego przerwania jako linii interfej-
su I2
C slave, wymagane jest przez bibliote-
kę i2cslave. Timer oraz przerwanie INT0 są
wykorzystywane do realizacji programowego
interfejsu I2
C Slave. Wynika z tego wniosek,
że programowy interfejs I2
C slave będzie
działał tylko na tych mikrokontrolerach,
które mają przynajmniej wejścia T0 i INT0.
W programie z list. 1 w instrukcji con?g i2c-
slave został podany tylko adres, jaki ma mieć
układ podrzędny. Ustalono go na wartość
parzystą, równą 64. Kompilator automatycz-
nie generuje bajt _i2c_slave_address, w któ-
rym przechowywany jest adres układu sla-
ve. Zmieniając zawartość tego bajtu, można
zmienić adres układu slave. Zostało to wyko-
rzystane w przykładowym programie. Adres
układu slave został uzależniony od stanu li-
nii wejściowych PC1 i PC2 mikrokontrolera.
Zmianę adresu układu slave zrealizowano
w następujący sposób:
Adres_sl = Pinc And &B00000110
?odczyt stanu linii PC1 i PC2
określających adres Slave
_i2c_slave_address = 64 + Adres_sl
?zapis adresu Slave
W tab. 2 pokazano możliwe do wyboru
wartości adresów w zależności od stanów
na liniach PC1 i PC2 mikrokontrolera. Ge-
nerowana jest także zmienna _i2c_slave_ad-
dress_received, w której jest przechowywa-
ny odebrany od układu master adres. Kod
biblioteki I2
C slave wywołuje dwa podpro-
gramy, których zawartość należy samemu
przygotować i od której będzie zależeć dzia-
łanie układu slave. Jeśli układ Master żąda
odczytania bajtu, wtedy wywoływany jest
podprogram oznaczony etykietą I2c_master_
needs_data. Wysyłane dane do mastera na-
leży umieszczać w zmiennej _a1, która jest
odzwierciedleniem rejestru R16 mikrokon-
trolera. W tym podprogramie umieszczono
kod, który umożliwia w zależności od wysła-
nej przez master komendy, odczytanie war-
tości z przetwornika A/C oraz stanu dwóch
linii portu PB. Jeśli układ master przesyła
dane, wtedy wywoływany jest podprogram
oznaczony etykietą I2c_master_has_data.
Przesyłane przez master dane są zapisywa-
ne w zmiennej _a1. W tym podprogramie,
w ramach przykładu, odczytywane są dwie
wartości przesyłane przez master, które zo-
stają zapisane do tablicy. Pierwszą wartością
jest komenda, a drugą wartość zapisywana
do rejestru adresowanego otrzymaną komen-
dą. Gdy zostaną odebrane dwa bajty danych,
zapisanie wartości do dwóch linii wyjścio-
wych portu PB oraz generatora PWM na-
stępuje w programie głównym i jest zależne
od otrzymanej komendy (pierwszego bajtu).
W programie głównym, oprócz zapisu otrzy-
manych od układu master danych, następuje
również odczyt wartości z przetwornika A/C
i konwersja odczytanej wartości 10-bitowej
do postaci 8-bitowej. Jak można się prze-
konać, program układu slave nie jest zbyt
skomplikowany i można go w prosty sposób
rozbudować, dostosowując do własnych po-
trzeb. W przykładzie z układem slave będzie
się on komunikował z prostym układem ma-
ster, którego schemat pokazano na rys. 3. Do
mikrokontrolera został dołączony jedynie
wyświetlacz LCD. Do magistrali I2
C dołączo-
no wymagane rezystory podciągające R1, R2.
Potencjometr P1 umożliwia regulację kontra-
stu wyświetlacza. Na list. 2 przedstawiono
przykład programowej realizacji interfejsu
I2
C master. Pierwszą operacją wykonywaną
w programie jest odczyt dwóch linii wejścio-
wych układu I2
C slave. Ich stan jest następ-
nie wyświetlany w pierwszej linii wyświetla-
Tab. 1. Komendy układu slave
Komenda
Adres
Odczyt Zapis
1 PB4, PB5 PB2, PB3
2 ADC PWM
Tab. 2. Adresy układu slave
A0 A1 Adres
0 0 64
1 0 66
0 1 68
1 1 70
80 ELEKTRONIKA PRAKTYCZNA 12/2009
Notatnik konstruktora
cza LCD. Po przeliczeniu, stan linii wejścio-
wych jest wysyłany z powrotem do układu
slave i tu jest zapisywany do dwóch linii
wyjściowych. Naciśnięcie któregoś z przy-
cisków S1 lub S2 w układzie slave będzie
więc powodować zaświecenie diod LED
dołączonych do wyjść układu I2
C slave.
W dalszej kolejności w programie odczy-
tywana jest wartość zmierzona przez prze-
twornik A/C. Po jej wyświetleniu w drugiej
linii wyświetlacza, jest ona z powrotem
wysyłana do układu slave, gdzie jest zapi-
sywana do rejestru wypełnienia przebiegu
PWM. Ustawiając napięcie potencjometrem
P1 w układzie slave, można więc regulo-
wać jasność diody D3 sterowanej przebie-
giem PWM. Opisywany algorytm działania
układu master działa w pętli wykonywanej
co około 200 ms. Master komunikuje się
z układem slave, wykorzystując adres 64.
Adres 65 jest używany podczas odczytu
wartości z układu slave. Warto zauważyć,
że wartość zmiennej adres_c jest adresem
komendy zgodnym z tab. 1. Na rys. 4 poka-
zano format zapisu danych do układu I2
C
slave. Wysyłane są kolejno: znacznik startu,
adres układu, kod komendy i wartość ko-
mendy. Na rys. 5 pokazano format odczytu
danych z układu slave. W tym przypadku
najpierw wysyła się znacznik startu, ad-
res slave do zapisu i komendę. Następnie
po ponownym wysłaniu znacznika startu
wysyłany jest adres odczytu z układu slave
i dalej można już odebrać wartość poprzed-
nio zaadresowaną wartością komendy. Od-
czyt danych z układu slave jest kończony
znacznikiem NACK, po którym następuje
znacznik stopu. Najmniej znaczący bit ad-
resu układu slave wskazuje, czy dane będą
zapisywane, czy odczytywane.
Sprzętowa realizacja interfejsu I2
C
slave
Niektóre większe mikrokontrolery AVR
wyposażono w moduł TWI, który jest zgod-
ny ze specyfikacją I2
C. Układ TWI umożliwia
pracę w trybie nadrzędnym oraz podrzęd-
nym, z prędkością transmisji do 400 kbps.
W przypadku sprzętowej realizacji interfej-
su I2
C zostanie przedstawiony identyczny
przykład działania, jak w poprzednim przy-
kładzie interfejsu I2
C zrealizowanego progra-
mowo. Przy sprzętowej realizacji interfejsu
I2
C slave linie interfejsu I2
C (w przypadku
mikrokontrolera ATmega8) są dołączone do
portów PC4 (SD) i PC5 (SC), co zostało za-
znaczone na schemacie z rys. 2. Na rys. 6
przedstawiono schemat blokowy sprzę-
towego interfejsu I2
C (TWI). W jego skład
wchodzą: jednostka kontrolna interfejsu,
jednostka adresowa oraz generator prędkości
transmisji. Na list. 3 przedstawiono przykład
programu realizującego układ I2
C slave z wy-
korzystaniem TWI. W Bascomie do tego celu
wymagana jest biblioteka i2c_twi?slave.lbx.
Rys. 3. Przykładowy układ master
Rys. 4. Format zapisu danych do układu I2
C slave
Rys. 5. Format odczytu danych z układu slave
Rys. 6. Schemat blokowy sprzętowego interfejsu I2
C (TWI)
Konfiguracja sprzętowego interfejsu TWI tak,
aby pracował jako slave, umożliwia komen-
da CONFIG TWISLAVE, której składnia jest
następująca:
CONFIG TWISLAVE = address , BTR =
value , BITRATE = value SAVE=option
gdzie:
Addresss ? parzysty adres układu sla-
ve,
BTR ? liczba odbieranych danych (układ
slave będzie oczekiwał na podaną liczbę od-
bieranych danych),
81ELEKTRONIKA PRAKTYCZNA 12/2009
Interfejs I2
C slave w mikrokontrolerach AVR
BITRATE ? wartość częstotliwości zegara
(100000 oznacza 100 kHz),
SAVE ? informuje kompilator, czy pod-
czas przerwania mają być zapisywane reje-
stry mikrokontrolera.
Kompilator automatycznie tworzy
zmienne Twi, Twi_btr i Twi_btw. Zmienna
Twi przechowuje otrzymany lub wysyłany
bajt danych. Zmienna Twi_btr jest indek-
sem otrzymanych danych. Za jej pomocą
można w prosty sposób otrzymywane dane
umieszczać w tablicy. Zmienna Twi_btw
może być wykorzystywana do sprawdza-
nia, której wartości potrzebuje master.
Ponieważ w TWI wykorzystywane jest
przerwanie, należy odblokować globalny
system przerwań. W przykładowym pro-
gramie konfiguracja interfejsu TWI slave
jest następująca:
Config Twislave = 64 , Btr = 1 , Bitrate
= 100000
Adres układu slave jest równy 64, ocze-
kiwany będzie jeden bajt danych, a często-
tliwość przebiegu zegarowego będzie równa
100 kHz. Adres układu slave jest przecho-
wywany w rejestrze Twar i za jego pomocą
można zmienić adres układu slave, który
w przykładzie jest zależny od linii PC1
i PC2 mikrokontrolera. Gdy master wysyła
dane, wywoływany jest podprogram Twi_
gotdata, w którym odbierane są dwa bajty
danych. Po zdekodowaniu są one następnie
w pętli głównej programu zapisywane albo
do rejestru PWM, albo linii wyjściowych
portu PB ? w zależności od komendy. Gdy
master odczytuje dane z układu slave, wy-
woływany jest podprogram oznaczony ety-
kietą Twi_master_needs_byte. W zależności
od zapisanej komendy następuje w nim
wysłanie do mastera stanów linii wejścio-
wych portu PB bądź zmierzonej wartości
przez przetwornik A/C. Zawartość pod-
programów wywoływanych przez interfejs
TWI jest prawie identyczna jak w przy-
padku procedur wywoływanych przez
programowy interfejs I2
C slave. Sprzętowy
interfejs I2
C slave wywołuje kilka innych
podprogramów, które zazwyczaj nie będą
wykorzystywane, a o których można się
więcej dowiedzieć z pomocy Bascom AVR.
Na list. 4 został przedstawiony przykład
sprzętowej realizacji układu I2
C master.
W przypadku sprzętowej realizacji interfej-
su I2
C pracującego jako master wymagana
jest konfiguracja częstotliwości sygnału ze-
garowego sprzętowego interfejsu I2
C (TWI).
Nie można również zapomnieć o konfigu-
racji linii interfejsu I2
C. Informacją dla
kompilatora, że będzie używany sprzętowy
interfejs I2
C, jest załączenie w programie
biblioteki i2c_twi.lbx. Do konfiguracji czę-
stotliwości zegara sprzętowego interfejsu
TWI służy instrukcja CONFIG TWI, której
parametrem jest częstotliwość linii zegaro-
wej. Wartość 100.000 będzie informować
o częstotliwości 100 kHz. Częstotliwość
sygnału zegarowego magistrali I2
C nie po-
winna być większa niż 400 kHz. Instrukcje
wykorzystywane do komunikacji z inter-
fejsem I2
C slave są identyczne jak w przy-
padku programowej realizacji interfejsu I2
C
master.
Podsumowanie
Wykorzystanie interfejsu I2
C do połą-
czenia ze sobą kilku bloków urządzenia
jest wyborem prostym i tanim. W małych
mikrokontrolerach AVR z wejściami INT0
i T0, ale niemających interfejsu TWI, moż-
na zastosować programowy interfejs I2
C
slave lub master. W większych mikrokon-
trolerach AVR, choćby z rodziny ATmega,
bez problemu można wykorzystać zawarty
w nich blok TWI pracujący w konfiguracji
slave. Dzięki implementacji interfejsu I2
C
slave w mikrokontrolerach, można zbudo-
wać układ podrzędny, który w elastyczny
sposób będzie mógł być dostosowany do
własnych potrzeb.
Marcin Wiązania, EP
marcin.wiazania@ep.com.pl
R E K L A M A
Zobacz więcej w kategorii Notatnik konstruktora