SVETELEKTRO

18. októbra 2012   Verzia pre tlač Verzia pre tlač

Programujeme AVR v jazyku C – 10. časť


zawin

Rozhranie TWI (I2C), popis komunikácie, registrov a ukážkový program

Popis rozhrania I2C

Rozhranie I2C bolo vyvinuté firmou Philips pre komunikáciu zariadení na krátke vzdialenosti, typicky na doske plošných spojov. Rozhranie I2C  je u mikropočítačov AVR nazývané ako dvojvodičové sériové rozhranie (TWI).

 

Dvojvodičové sériové rozhranie (TWI) je ideálne rozhranie pre mnohé aplikácie mikropočítačov. Protokol rozhrania TWI dovoľuje užívateľovi vzájomne prepojiť až 128 rôznych zariadení pomocou dvojvodičovej obojsmernej zbernice. Jeden vodič slúži na prenos hodinového signálu (SCL), druhý na  prenos dát (SDA). Všetky externé komponenty pozostávajú z dvoch pull-up odporov (typicky hodnoty 4k7). Všetky zariadenia pripojené na zbernicu majú samostatné adresy a obsahujú mechanizmus pripájania na zbernicu, ktorý je súčasťou TWI protokolu.

 

Obr. 1 – komunikácia pomocou I2C zbernice

 

Ako je uvedené na Obr.1 obidva vodiče zbernice sú pripojené na napätie Vcc prostredníctvom „pull-up“ odporov zväčša hodnoty 4k7. Výstupné obvody TWI kompatibilných zariadení sú typu „open-drain“, teda pracujú s otvoreným kolektorom. Z toho vyplýva, že úroveň napätia zodpovedajúca log.0 sa vyskytne na vodiči TWI zbernice vtedy, ak jeden, alebo viac zariadení bude generovať na svojom výstupe napäťovú úroveň log.0. V prípade, že všetky TWI zariadenia budú mať výstupy v stave vysokej impedancie, bude vďaka „pull-up“ odporom úroveň napätia na príslušnom vodiči zodpovedať log.1. 

Počet spolupracujúcich zariadení je obmedzený kapacitou zbernice (max 400pF) a tiež 7-bitovým adresným priestorom. Detailnú špecifikáciu elektrických parametrov zbernice TWI je možné nájsť v datasheete MCU Atmega8 na strane 238.

 

 

 

Prenos dát a formát rámca (súbor údajov prenášaný v jednom bloku)

 

Každý údajový bit prenesený prostredníctvom TWI zbernice je sprevádzaný hodinovým impulzom na vodiči SCL. Napäťová úroveň na dátovom vodiči, SDA musí byť počas vysokej úrovne SCK stabilná,viď Obr. 2. Výnimkou je len generovanie štartovacej a ukončovacej podmienky.

 



Obr.2 Priebeh signálov SCL a SDA

 

Zariadenie typu MASTER inicializuje a ukončuje prenos dát. Prenos je iniciovaný zariadením MASTER, ktorý na zbernicu generuje podmienku štartu (START). Prenos ukončuje MASTER pomocou ukončovacej podmienky (STOP). Medzi podmienkami START a STOP je zbernica obsadená a žiadne iné zariadenie typu MASTER nemôže prevziať riadenie zbernice. V špeciálnom prípade sa môžeme stretnúť s generovaním novej podmienky START medzi podmienkami START a STOP. Tento prípad sa nazýva opakovaný START a využíva sa v prípadoch, keď MASTER chce iniciovať nový prenos, bez opustenia riadenia zbernice. Po opakovanom štarte zbernica ostáva obsadená až po nasledujúcu podmienku STOP. Ako je znázornené na Obr. 3, START a STOP podmienky sú charakterizované zmenou úrovne na SDA vodiči počas doby ,keď na SCL vodiči je vysoká úroveň napätia.

 

 



Obr.3 Podmienky START, STOP a opakovaný START

 

Adresné bloky prenášané prostredníctvom zbernice TWI majú 9 bitov.

 

Pozostávajú zo:

–          siedmych adresných bitov

–          jedného riadiaceho bitu – ČÍTANIE/ZÁPIS (R/W)

–          bitu potvrdenia – (ACK)

 

Ak R/W bit má hodnotu log.1, bude vykonaná operácia čítania, inak sa vykoná operácia zápisu. Ak ľubovoľné zariadenie typu SLAVE rozpozná svoju adresu v deviatom takte hodín generuje na SDA vodič úroveň log.0. Ak je adresované zariadenie SLAVE zaneprázdnené a nemôže odpovedať na požiadavku zariadenia MASTER v deviatom cykle hodín (cyklus ACK) bude úroveň na vodiči SDA odpovedať log.1. Potom zariadenie typu MASTER môže vyslať podmienku STOP, alebo opakovaný START na iniciovanie nového prenosu. Adresný blok (paket) pozostáva z adresy a čítacieho/zápisového bitu, ktorý sa označuje SLA+R, alebo SLA+W.

MSB adresa sa vysiela ako prvá. V priebehu návrhu môže užívateľ voľne prideľovať adresy jednotlivým zariadeniam, ale adresa 0000000b je rezervovaná pre všeobecné výzvy. Keď zariadenie typu MASTER vyšle všeobecnú výzvu, všetky zariadenia budú v cykle ACK generovať na SDA úroveň log.0. Všeobecná výzva sa používa v prípade, ak zariadenie MASTER chce všetkým zariadeniam SLAVE vyslať tú istú správu. V prípade, že vo všeobecnej výzve je bit R/W rovný log.0, potom nasledujúci dátový paket bude prijímaný všetkými zariadeniami SLAVE, ktoré reagovali na všeobecnú výzvu. Poznamenajme, že všeobecná výzva s R/W bitom rovným log.1 nemá  prakticky význam. V tomto prípade by začalo súčasne vysielať viacero zariadení rôzne údaje.

 

                 

Obr.4 Adresný paket



Všetky dátové pakety prenášané prostredníctvom zbernice TWI majú deväť bitov. Obsahujú 8 dátových bitov a jeden potvrdzovací bit. Počas prenosu dát zariadenie typu MASTER generuje hodiny a podmienky START a STOP, pričom prijímač je zodpovedný za generovanie potvrdenia príjmu ACK. Ako náhle prijímač ponechá vodič SDA počas deviateho cyklu hodín v stave vysokej úrovne (NACK), táto skutočnosť je interpretovaná ako neschopnosť prijímať ďalšie dáta.  

 

Obr.5 Údajový paket

 

Všeobecne je prenos zložený z podmienky START a SLA+R/W (adresa prijímača + R/W bit), jeden, alebo viac údajových paketov a z podmienky STOP. Nie je povolený prenos  prázdnej správy ( podmienka START a bezprostredne za ňou podmienka STOP). Poznamenajme, že  zariadenie SLAVE môže podľa potreby predĺžiť nízku úroveň na vodiči SCL. Túto skutočnosť je možné využiť v prípade ,ak rýchlosť SCL daná zariadením MASTER je pre daný prijímač príliš vysoká. Predĺženie času nízkej úrovne SCL nemá vplyv na čas trvania vysokej úrovne. Dôsledkom uvedeného je ,že zariadenie SLAVE môže meniť prenosovú rýchlosť na zbernici TWI.

 

Rozhranie TWI mikropočítača Atmega8

Modul TWI MCU Atmega8 obsahuje niekoľko funkčných blokov podľa Obr. 6. Všetky registre znázornené hrubou čiarou sú prístupné prostredníctvom údajovej zbernice procesora.

Vývody SDA a SCL spolupracujú s internými časťami MCU. Výstupné budiace obvody obsahujú obmedzovač strmosti hrán signálu ( SRC), podľa špecifikácie rozhrania zbernice TWI. Vstupy obsahujú obvody potlačenia špičiek signálu (SF), ktoré sú kratšie než 50 ns. Interné „pull-up“ odpory môžu byť použité nastavením príslušných bitov registra PORTC, v opačnom prípade treba použiť externé „pull-up“ rezistory.

V prípade, že MCU pracuje v režime MASTER, jednotka generovania prenosovej rýchlosti riadi periódu hodinového signálu SCL. Frekvencia signálu SCL je určená obsahom bitov preddeličky v registri TWSR a obsahom registra TWBR. Ak MCU pracuje v režime SLAVE prenosová rýchlosť nezávisí od nastavenia registrov TWSR a TWBR, musí byť však minimálne 16 krát nižšia než je frekvencia hodín CPU.

 

Frekvencia generovaného signálu SCL je daná nasledovným vzťahom:

 

kde TWBR je hodnota uchovaná v registri TWBR a TWPS je hodnota uchovaná v príslušných bitoch preddeličky v registri TWSR.

 

Jednotka rozhrania TWI obsahuje údajový a adresný posuvný register (TWDR),  obvody riadenia a generovania START/STOP podmienok a výberové a detekčné obvody. Register TWDR obsahuje bajt dát/adresy, ktorý má byť vyslaný, prípadne bajt prijatých dát/adresy. Ako doplnok k registru TWDR sa využíva bit (N)ACK, ktorý bude vysielaný, alebo bol prijatý. Tento bit nie je priamo prístupný užívateľskému programu, iba prostredníctvom registra TWICR. Obvody riadenia START/STOP podmienok generujú a detekujú podmienky START, opakovaný START a STOP. Obvody riadenia START/STOP podmienok sú schopné rozpoznať podmienky START a STOP aj v prípade, že MCU je v niektorom z úsporných režimov. Ak je zariadenie adresované potom aktivujú MCU.

Ak TWI chce vysielať dáta v režime MASTER výberové a detekčné obvody neustále monitorujú prenos dát na zbernici. Ak v procese výberu je zariadenie neúspešné potom výberové a detekčné obvody informujú riadiacu jednotku TWI.

Jednotka vyhodnotenia adries kontroluje prijímané adresné bajty a porovnáva ich zhodu s obsahom 7-bitového adresného registra TWAR. Ak bit TWGCE v registri TWAR je nastavený na hodnotu log.1, potom prijatý adresný bajt je porovnávaný s adresou určenou pre všeobecnú výzvu. Ako už bolo spomenuté, jednotka vyhodnotenia adries je schopná vyhodnocovať adresy aj v prípade, že MCU je v úspornom režime. V prípade, že MCU je adresovaná zariadením typu MASTER uvedie sa do aktívneho režimu.

Riadiaca jednotka monitoruje TWI zbernicu a generuje odozvu v súlade s nastavením riadiaceho registra TWCR. Ak sa na zbernici vyskytne taká udalosť, ktorá vyžaduje zásah aplikačného programu nastaví sa príznak prerušenia TWINT v registri TWCR. V nasledujúcom hodinovom cykle sa prepíše obsah stavového registra TWSR, pomocou ktorého je možné identifikovať druh udalosti. Register TWSR obsahuje relevantnú informáciu len po nastavení príznaku TWIN. Inak obsah registra TWSR pomocou špeciálneho stavového kódu informuje CPU, že relevantná informácia nie je prístupná. Po celý čas nastavenia príznaku TWINT je vodič SCL prostredníctvom výstupu držaný na nízkej úrovni. To dovoľuje aplikačnému programu reagovať na vzniknutú udalosť pred povolením ďalšieho prenosu prostredníctvom TWI zbernice.

 

TWIN príznak je nastavený v nasledujúcich prípadoch:

–      Po tom, čo TWI vyslala podmienku START, alebo opakovaný START.

–      Po tom, čo TWI vyslala SLA+R/W.

–      Po tom, čo TWI vyslala adresný bajt.

–      Po tom, čo TWI vypadla z procesu arbitráže (výber zariadenia typu MASTER).

–      Po tom, čo bola adresovaná (vlastnou SLAVE adresou, alebo všeobecnou výzvou).

–      Po tom, čo prijala byte dát.

–      Po tom, čo prijala STOP, alebo opakovaný START pokiaľ bola adresovaná ako SLAVE.

–      Po tom, keď bola identifikovaná chyba zbernice (neprípustné START a STOP podmienky).

 

 



Obr.6 Štruktúra TWI modulu

 

 

Popis registrov

Register prenosovej rýchlosti – TWBR

Bity 7 až 0 – Bity registra prenosovej rýchlosti TWI, TWI Bit Rate Register

         Pomocou obsahu registra TWBR sa určuje deliaci pomer generátora prenosovej rýchlosti. Generátor prenosovej rýchlosti je delič frekvencie slúžiaci na generovanie hodinového signálu SCL, v prípade, že MCU pracuje v režime MASTER. Prenosová rýchlosť je určená vzťahom uvedeným v predchádzajúcej kapitole.

 

Riadiaci register TWI – TWCR

 

Riadiaci register TWCR je využitý na riadenie činnosti jednotky TWI.

 

Bit 7 – Príznak prerušenia od TWI, TWI Interrupt Flag

         Bit TWINT sa automaticky nastaví, keď TWI jednotka ukončí práve prebiehajúcu úlohu a vyžaduje odozvu (zásah) aplikačného programu. Ak sú globálne povolené prerušenia a súčasne je bit TWIE v registri TWCR nastavený na hodnotu log.1, potom pri nastavení bitu TWINT bude CPU pokračovať vo výkone programu na adrese prerušovacieho vektora TWI. Pokiaľ je bit TWINT nastavený na hodnotu log.1 výstup SCL je na nízkej úrovni. Bit TWINT musí byť vynulovaný pomocou programu, zápisom log.1. Poznamenajme, že nulovanie príznaku TWINT povolí činnosť na zbernici TWI. Preto obsahy všetkých registrov (stavový, dátový a adresný) musia byť prečítané/zapísané pred vynulovaním príznakového bitu TWINT.

 

Bit 6 – Povolenie potvrdzovania, TWI Enable Acknowledge Bit

Bit TWEA riadi generovanie potvrdenia príjmu impulzom ACK. Ak bit TWEA je nastavený na hodnotu log.1, potom je impulz ACK generovaný na zbernicu TWI pri splnení nasledujúcich podmienok:

–      Ak zariadenie je v režime SLAVE a prijalo vlastnú adresu.

–      Po prijatí všeobecnej výzvy, za predpokladu, že bit TWGCE v registri TWAR je nastavený na hodnotu log.1.

–      Po prijatí dátového bytu v režime MASTER prijímač, alebo SLAVE prijímač.

Zápisom log.0 do bitu TWEA bude zariadenie virtuálne, dočasne odpojené od zbernice TWI. Rozpoznanie adresy môže znova nastaviť bit TWEA na hodnotu log.1.

 

Bit 5 – Bit podmienky START, TWI START Condition Bit

         Ak zariadenie chce na zbernici zaujať postavenie MASTER, potom aplikačný program zapíše do bitu TWSTA log.1. Obvodové prostriedky jednotky TWI kontrolujú zbernicu a ak je zbernica voľná generujú podmienku START. Ak nie je zbernica uvoľnená TWI jednotka čaká pokiaľ sa na zbernici nevyskytne podmienka STOP a následne generuje podmienku START. Po vyslaní podmienky START bit TWSTA musí byť vynulovaný programom

 

Bit 4 – Bit podmienky STOP, TWI Stop Condition Bit

         Ak TWI jednotka je v režime MASER, potom zápisom log.1 do bitu TWSTO bude na TWI zbernicu generovaná podmienka STOP. Po vyslaní podmienky STOP sa bit TWSTO automaticky vynuluje. V režime SLAVE sa nastavenie bitu TWSTO používa na zotavenie po podmienke ERROR. V tomto prípade sa negeneruje STOP podmienka, ale zariadenie sa vráti do neadresovaného režimu SLAVE. Jeho výstupy budú v stave vysokej impedancie.

 

Bit 3 – Príznak kolízie pri zápise, TWI Write Collision Flag

         Bit TWWC sa nastaví, keď sa pokúšame zapísať dáta do TWI údajového registra TWDR, a príznak TWINT má hodnotu log.0. Tento príznak je nulovaný zápisom do registra TWDR, keď bit TWINT má hodnotu log.1.

 

Bit 2 – Bit povolenia TWI, TWI Enable Bit

         Bit TWEN povoľuje činnosť jednotky TWI. Keď do bitu TWEN zapíšeme hodnotu log.1 jednotka TWI preberá riadenie V/V vývodov, priradí im funkciu SCL a SDA, povolí činnosť obmedzovača strmosti hrán signálu a filtra. Ak do bitu TWEN zapíšeme hodnotu log.0 jednotka TWI sa vypína a  prenos sa ukončí.

 

Bit 1 – Nevyužitý bit, Reserved Bit

 

Bit 0 – Povolenie prerušenia od TWI, TWI Interrupt Enable

         Ak bit TWIE je nastavený na hodnotu log.1 a súčasne sú globálne povolené prerušenia TWI jednotka bude generovať žiadosť o prerušenie vždy, ak bude nastavený príznak TWINT.

 

 

Stavový register TWI – TWSR:

 

Bity 7..3 – TWS, Stav TWI, TWI Status

         Týchto 5 bitov charakterizuje stav jednotky TWI i samotnej zbernice. Kódy odpovedajúce jednotlivým stavom sú popísané v ďalšom texte.

 

Bit 2 – Nevyužitý bit, Reserved Bit

 

Bity 1..0 –TWPS, Bity preddeličky, TWI Prescaler Bits

         Obsah bitov TWPS určuje použitý deliaci pomer preddeličky podľa tabuľky 1.

 

TWPS1

TWPS0

Deliaci pomer

0

0

1

0

1

4

1

0

16

1

1

64

Tab.1 Hodnoty deliaceho pomeru

 

Údajový register TWI – TWDR

 

 

Ak je jednotka TWI vo vysielacom režime, potom register TWDR obsahuje nasledujúci bajt, ktorý bude vysielaný. Ak je jednotka TWI v režime príjmu, potom register TWDR obsahuje posledný prijatý byte. Do registra TWDR sa nemôže zapisovať, pokiaľ sa ešte vysúva vysielaný byt. Ak sa nastavil príznak TWINT je možné pristupovať k registru TWDR. Poznamenajme, že k registru TWDR nemôžeme pristupovať pred prvým výskytom prerušenia. Údaje v registri TWDR ostávajú stabilné pokiaľ príznak TWINT má hodnotu log.1. Pokiaľ sú údaje vysúvané z registra TWDR na zbernicu, tak aktuálne údaje zo zbernice sú posúvané do registra. Register TWDR preto vždy obsahuje posledný byte ,ktorý bol na zbernici, s výnimkou prechodu z úsporného režimu po prerušení od jednotky TWI. V tomto prípade je obsah registra TWDR nedefinovaný. Bit potvrdenia príjmu ACK je nastavovaný automaticky, vlastná CPU nemôže k nemu pristupovať.

 

Bity 7:0 – Bity údajového registra, TWI Data Register

         Tieto bity tvoria nasledujúci údajový bajt, ktorý má byť vyslaný, alebo posledný údajový bajt, ktorý bol prijatý z dvojvodičovej (TW) zbernice.

 

Adresový register TWI – TWAR

 

Register TWAR obsahuje 7-bitovú adresu, na ktorú bude TWI reagovať vždy, ak bude v režime SLAVE  vysielač, alebo prijímač. V režime MASTER nie je potrebná. V systémoch s viacerými zariadeniami typu MASTER musí byť register TWAR nastavený v tých zariadeniach, ktoré môžu byť adresované ako zariadenia SLAVE druhými zariadeniami typu MASTER.

Bit TWGCE je využitý na povolenie rozpoznávania všeobecnej výzvy (adresa 0x00).

 

Bity 7:1 – Bity adresového registra, TWI (Slave) Adress Register

Tieto bity obsahujú adresu TWI jednotky v režime SLAVE.

 

Bit 0 – Povolenie rozpoznania všeobecnej výzvy, TWI General Call Recognition Enable Bit

Ak bit TWGCE je nastavený na hodnotu log.1, potom je povolené rozpoznávanie všeobecnej výzvy vyskytujúcej sa na TW sériovej zbernici.

 

 

Prenos údajov prostredníctvom TWI

Jednotka AVR TWI je bytovo orientovaná s plným využitím prerušení. Prerušenia sú generované po všetkých udalostiach na zbernici. Pretože jednotka TWI využíva prerušovací systém, CPU môže v priebehu prenosu jedného bytu vykonávať aplikačný program. Ak nie je povolené prerušenie od TWI jednotky, prípadne sú globálne zakázané prerušenia, CPU musí programovými prostriedkami testovať nastavenie príznaku TWINT. Príznak TWINT sa nastaví vždy po ukončení operácie na zbernici.  TWI jednotka potom očakáva odozvu od aplikačného programu. V tomto prípade stavový register TWSR obsahuje hodnotu, ktorá charakterizuje aktuálny stav TWI zbernice. Aplikačný program na základe tohoto stavu rozhodne ako sa bude jednotka TWI chovať v nasledujúcom zbernicovom cykle. Správanie jednotky TWI určuje aplikačný program prostredníctvom vhodného nastavenia registrov TWCR a TWDR. Na nasledujúcom obrázku je znázornená spolupráca aplikačného programu s jednotkou TWI. V uvedenom príklade zariadenie typu „MASTER“ prenáša jeden byte do zariadenia typu „SLAVE“.

 

 



Obr.7 Komunikácia medzi aplikáciou a jednotkou TWI pri typickom prenose

 

  1. V prvom kroku je potrebné vyslať podmienku START. Aplikácia to zaistí zápisom definovanej hodnoty do registra TWCR. Takto iniciuje jednotku TWI na prenos START podmienky. Týmto zápisom sa príznak TWINT nastaví na hodnotu log.1. Zápisom log.1 do TWINT sa príznak TWINT vynuluje. Jednotka TWI nezaháji vlastný prenos pokiaľ TWINT obsahuje hodnotu log.1. Bezprostredne po vynulovaní bitu TWINT jednotka zaháji vlastný prenos podmienky START.
  2.  Po vyslaní START podmienky sa príznak TWINT v registri TWCR nastaví na hodnotu log.1 a obnoví sa obsah TWSR, ktorý indikuje že podmienka bola úspešne vyslaná.
  3. Aplikačný program testuje obsah TWSR a zisťuje či podmienka START bola úspešne vyslaná. Ak obsah TWSR nezodpovedá úspešnému vyslaniu START podmienky potom aplikácia musí reagovať napríklad volaním chybovej rutiny. V prípade, že obsah TWSR odpovedá úspešnému vyslaniu podmienky START, potom aplikácia naplní register TWDR hodnotou SLA+W a do registra TWRC zapíše definovanú hodnotu, ktorá informuje TWI jednotku, že má zahájiť prenos SLA+W z registra TWDR. Zápisom hodnoty log.1 do bitu TWINT sa nuluje príznak TWINT. Bezprostredne po vynulovaní bitu TWINT jednotka zaháji vlastný prenos adresovacieho paketu.
  4. Ak bol adresovací paket úspešne prenesený nastaví sa príznak TWINT v registri TWCR a súčasne sa obnoví obsah registra TWSR tak, aby odpovedal úspešnému prenosu adresy. Obsah registra obsahuje aj informáciu či adresované zariadenie potvrdilo, alebo nepotvrdilo príjem paketu.
  5. Aplikačný program musí testovať obsah TWSR a zistiť, či bol adresovací paket  úspešne prenesený a či bol potvrdený jeho príjem. Ak obsah TWSR nezodpovedá úspešnému vyslaniu a potvrdeniu príjmu adresovacieho paketu, potom aplikácia musí reagovať, napríklad volaním chybovej rutiny. V prípade, že obsah TWSR odpovedá úspešnému vyslaniu adresovacieho paketu, potom aplikácia naplní register TWDR hodnotou dátového bytu. Do registra TWRC zapíše definovanú hodnotu, ktorá informuje TWI jednotku, že má zahájiť prenos dátového bytu z registra TWDR. Zápisom hodnoty log.1 TWIN sa nuluje príznak TWINT. Bezprostredne po vynulovaní bitu TWINT jednotka zaháji vlastný prenos údajového paketu.
  6. Po prenose údajového paketu sa nastaví príznak TWINT v registri TWCR a súčasne sa obnoví obsah registra TWSR tak, aby odpovedal úspešnému prenosu dátového paketu. Obsah registra obsahuje aj informáciu či adresované zariadenie potvrdilo, alebo nepotvrdilo príjem paketu.
  7. Aplikačný program testuje obsah TWSR a zisťuje, či bol dátový paket  úspešne prenesený a či bol potvrdený jeho príjem. Ak obsah TWSR nezodpovedá úspešnému vyslaniu a potvrdeniu príjmu dátového paketu, potom aplikácia musí reagovať, napríklad volaním chybovej rutiny. V prípade, že obsah TWSR odpovedá úspešnému vyslaniu dátového paketu, potom aplikácia zapíše do registra TWRC definovanú hodnotu, ktorá informuje TWI jednotku, že má zahájiť prenos podmienky STOP. Zápisom hodnoty log.1 TWINT sa nuluje príznak TWINT. Bezprostredne po vynulovaní bitu TWINT jednotka zaháji vlastný prenos STOP podmienky. Poznamenajme, že po prenose podmienky STOP sa už príznak TWINT nenastaví.

 

Uvedený príklad mal za úlohu poukázať na základné princípy prenosu prostredníctvom zbernice TWI.

 

Tieto princípy je možné zhrnúť nasledovne:

–      Ak jednotka TWI ukončí ľubovolnú operáciu a očakáva odozvu aplikácie nastaví príznak TWINT. Pokiaľ príznak TWINT je nastavený, bude na vodiči SCL TWI zbernice úroveň logickej nuly.

–      Pokiaľ TWINT má hodnotu log.0, musí užívateľ obnoviť obsah registrov TWI jednotky, tak, aby boli relevantné pre nasledujúci zbernicový cyklus.

–      Po obnovení obsahu TWI registrov aplikačný program zapíše vhodný obsah do TWCR registra. Zápisom logickej jednotky do bitu TWINT sa príznak TWINT vynuluje. Jednotka TWI zaháji operáciu odpovedajúcu obsahu registra TWCR.

 

 

Praktická realizácia prenosu dát cez TWI

 

Zapojenie mikropočítača ATmega8 pre prenos dát cez TWI

 

 

Obr č. 5: Zapojenie MCU Atmega8 pre prenos dát cez SPI

 

V praktickej časti si ukážeme ako čítať a zapisovať dáta zo Slave zariadenia pripojeného ku mikropočítaču, ktorý bude v režime Master.

Naše Slave zariadenie (napr. EEPROM pamäť, senzor, displej a pod) pripojíme pomocou vodičov SDA a SCL ku mikropočítaču. Na linky SDA a SCL pripojíme „pull-up“ rezistor s hodnotou 4k7.

 

Práca s knižnicou na obsluhu rozhrania TWI

Pre jednoduchšiu prácu s rozhraním TWI na mikropočítači ATmega8 môžete použiť knižnicu i2cmaster, ktorú naprogramoval kolega luboss17.

 

Knižnicu určenú pre mikropočítač ATmega8 si môžete stiahnuť tu: twi.zip

 

V AVR studio 4 vytvoríme nový projekt, následne vo vytvorenom adresári projektu prekopírujeme súbory knižnice (i2c_master.c, i2c_master.h). Tieto súbory taktiež pridáme aj do nášho projektu v AVR Studio.

 

Pred použitím knižnice je vhodné nastaviť v hlavičkovom súbore i2c_master.h frekvenciu prenosu – konštanta SCL_CLOCK (do 400 kHz).

 

Knižnica obsahuje všetky potrebné funkcie pre prácu s rozhraním TWI v režime Master.

Na začiatku nášho programu musíme najskôr TWI rozhranie inicializovať pomocou funkcie: void i2c_init(void);

 

Následne môžeme vyslať štart podmienku pomocou funkcie:

unsigned char i2c_start(unsigned char address, unsigned char dir);

kde prvý parameter je adresa zariadenia (už posunutá o bit doľava t.j. psledný bit je voľný) a druhý parameter je riadenie smeru prenosu, kde môžeme využiť definované konštanty I2C_READ alebo I2C_WRITE.

Po bezchybnom priebehu zápis vráti táto funkcia nulu. Po neúspešnom štarte vráti 1 a ak SLAVE nepotvrdí dáta Ack bitom vráti 2.

 

Dáta na zbernicu vyšleme funkciou (po štart podmienke s adresou a I2C_WRITE):

unsigned char i2c_write(unsigned char data);

, kde parametrom funkcie je vysielaný bajt. Po úspešnom vyslaní bajtu vráti funkcia 0 ak nie vráti 1.

 

Bajt zo zbernice prečítame funkciou:

unsigned char i2c_read_nAck(void);

 

V prípade, že chceme naraz prijať viac bajtov za sebou použijeme funkciu:

unsigned char i2c_read_Ack(void);

, to znamená, že za prijatým bajtom MASTER generuje ACK bit a čaká na ďalší bajt pričom pri poslednom bajte použijeme funkciu:

unsigned char i2c_read_nAck(void);

 

Stop podmienka sa vykonáva funkciou:

unsigned char i2c_stop(void); po úspešnom priebehu vráti 0 po neúspešnom vráti 1.

 

Program č. 1:

Zapíš do Slave zariadenia s adresou 0x55h hodnotu 0x33h. Následne prečítaj 4 bajty dát z tohto zariadenia.

 

Ďakujem všetkým čo sa podielali na tejto časti seriálu.

V ďalšej časti sa pozrieme na prácu s EEPROM a FLASH.

Ako sa vám páčil tento článok?
  • Páči sa mi (0)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)
Najnovšie články od zawin (zobraziť všetky)

Komentáre (9)

  1. klapi píše:

    Zdar
    Potreboval by som vymienat data medzi 1 master a 3 slave zariadeniami(taktiez mikroprocesory), uvazujem bud nad vyuzitim TWI ale SPI, co si myslite ze bude vyhodnejsie, pripadne nejaky iny napad.
    Diky

  2. RatJak píše:

    len sa chcem spytat lebo sa mi zda ze v tom zdrojaku je chyba ze ci tam pri nacitavani toho posledneho bitu nema byt pouzita funkcia i2c_read_nAck?

    inak je to super clanok chvalim 😉

  3. hanysek16 píše:

    Ahoj, jsem rád za takový fajný seriál o AVR jen bych se rád dozvěděl smysluplnost funkce i2c_rep_start() … krom toho že předává hodnotu funkce i2c_start() mi moc smysluplná nepříjde …
    Mohl bych se zeptat na pointu?
    Díky

Pridaj komentár