Interfejs I²C slave w mikrokontrolerach AVR

Interfejs I²C slave w mikrokontrolerach AVR
Pobierz PDF Download icon
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
Artykuł ukazał się w
Grudzień 2009
DO POBRANIA
Pobierz PDF Download icon
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik styczeń 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio luty 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje styczeń 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna styczeń 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich styczeń 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów