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 lipiec 2021

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio lipiec - sierpień 2021

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka Podzespoły Aplikacje lipiec 2021

Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna lipiec 2021

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich sierpień 2021

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów