Tartalom:
- I2C (TWI) interface tulajdonságai
- Adatátvitel keretformátumai, START és STOP, cím csomag és adatcsomag
- Többmasteres működés, arbitráció
- TWI modul fő egységei
- Átviteli üzemmódok (MT, MR, SR, ST)
- Regiszterek részletes leírása
———————————————————
Az I2C port a legkényelmesebb sok periféria használata esetén. A gyakorlatban szinte végtelen (128db) I2C kommunikációval működő eszközt csatlakoztathatunk a vezérlőnkhöz mindössze két jelvezeték használatával (nomeg a közös GND). Természetesen az egyre több eszköz egyre lassúbb kommunikációt eredményez, de a kényelemnek mindig van ára. Ugyanígy problémát okoz a vezetékhosszúság, maximum néhány méter távolságban gondolkodhatunk. Jómagam maximum 8 méter távolságig próbálkoztam sikeresen, de itt már jelentősen le kellett lassítani az órajelet. Az Arduino IDE világában az I2C kommunikációt megkönnyítő programkönyvtár alapfelszereltség. Tulajdonképpen pofon egyszerű a használata. Ha azonban más fejlesztő környezetben kell valamiért dolgoznunk (pl. Microchip Studióban), vagy éppen nem áll rendelkezésre a C++ csak a C nyelv, akkor megszívtuk. Programozhatjuk az adatcserét a vezérlő belső regisztereinek írásával. Kénytelen voltam meglépni ezt a szintet (lefelé) a munkámhoz kapcsolódóan, és nem kevés időt töltöttem el a részletek és a regiszterek megismerésével. Próbáltam az Arduino IDE-ben megtalálható „wire.h” könyvtár forráskódjait átemelni C környezetbe, de rákényszerültem, hogy sokkal részletesebben megismerjem az ATMega328 (és hasonló) vezérlőkbe beépített I2C busz működését. Egyébként megérte! Igyekszem hát most meghagyni a jövő számára amit megértettem, és pár hónap múlva amúgy is elfelejtenék!
Mielőtt leírogatom – részben az adatlapban olvasott tematika szerint – amit sikerült megértenem, meg kell jegyeznem, hogy ennek a beépített hardveresen támogatott eszköznek a működése jelentősen bonyolultabb, mint az SPI vagy az USART egységé. Ennek oka, hogy az I2C porton történő adatátvitel során rengeteg állapotot kell megkülönböztetni és a folytatáshoz figyelembe venni!
Még egy kissé formai zűrzavarra is felhívnám a figyelmet! Én mindig I2C portnak nevezem ezt a kommunikációt illetve kommunikációs megoldást. Azonban az ATMega328 adatlap TWI portnak hívja. A TWI port működése nem teljesen azonos a szabvány szerinti I2C protokoll-al. A különbségeket nem sikerült egyértelműen kiderítenem, főleg mert nem szántam rá időt. Azonban egy biztos, az I2C képes perifériák együttműködnek az ATMega vezérlők TWI portjával. Úgyhogy ne zavartassuk magunkat, lényegében ugyanarról beszélgetünk. Azonban az ATMega328 adatlapból történő információk átemelésekor következetesen megtartottam a TWI megnevezést.
Lássuk a port legfontosabb jellemzőit:
- Egyszerű, mégis hatékony kommunikációs interfész, mindössze két jelvezeték segítségével (SDA, SCL)
- Mind a master, mind a slave működés támogatott
- A master és a slave is lehet adó vagy vevő szerepben is.
- 7 bites cím hosszúság ami elvben 128 különböző slave címet is lehetővé tesz
- Több master esetén adatvesztés nélküli ütközés detektálás és master kiválasztás.
- Akár 400kHz adatátviteli sebesség
- A slave által csökkenthető a kommunikáció sebessége, ha nem tudja befejezni az érketett adat feldolgozását
- A zajcsökkentő áramkör szűri a rövid impulzusokat a buszvonalakon
- Teljesen programozható slave cím általános hívástámogatással
- A cím felismerés ébresztést okoz, ha az AVR alvó üzemmódban van
- Az ATMega328 beépített egysége kompatibilis a Philips I2C protokolljával
Wire interfész busz definíciója
A TWI protokoll lehetővé teszi, hogy akár 128 különböző eszközt is összekapcsoljunk mindössze két kétirányú jelvezeték használatával. Egyik az órajel (SCL) és másik az adatvezeték (SDA). Az egyetlen külső hardver, amely a busz megvalósításához szükséges, egy -egy felhúzóellenállás a tápfeszültség felé. A buszhoz csatlakoztatott összes eszköznek egyedi címe van! Ha több master is van a buszon, akkor a buszversengés (arbitráció) megoldására szolgáló algoritmus a TWI protokollban lett megvalósítva. Utóbbi funkcióban nagy szerepe van a felhúzó ellenállással megvalósított két jelvezetéknek, melyek AND kapcsolatot valósítanak meg a buszra kötött eszközök párhuzamosan kötött kimeneteinek aktív LOW értékei között. Ezt most így zavaros, de később világos lesz!
A fentieket sokkal egyszerűbben magyarázza az alábbi ábra:
TWI terminológia
Ebben a szakaszban gyakran előfordulnak a következő definíciók, ezért érdemes egyértelművé tenni, mit is értünk ezek alatt:
- master – Az átvitelt kezdeményező és befejező eszköz. A master generálja az SCL órát is
- slave – A master által címzett eszköz
- adó (transmitter) – ez eszköz adatokat helyez el a buszon.
- vevő (receiver) – ez az eszköz adatokat olvas a buszról
Elektromos összekapcsolás
Amint az a fentebb található ábrán látható, mindkét buszvezeték felhúzó ellenállásokon keresztül csatlakozik a pozitív tápfeszültséghez. Az összes TWI-kompatibilis eszköz busz kivezetései nyitott kollektorúak. Ez egy vezetékes AND funkciót valósít meg, amely elengedhetetlen az interfész működéséhez. A TWI buszvonalon alacsony szint keletkezik, ha egy vagy több TWI eszköz nullát ad ki. A magas szint akkor jön létre, amikor az összes TWI eszköz háromállapotúvá teszi a kimenetét, lehetővé téve a felhúzó ellenállások számára, hogy magasra húzzák a vonalat. Nem szabad megfeledkezni arról, hogy a TWI buszhoz csatlakoztatott összes AVR eszközt táplálni kell, hogy a busz működjön.
A buszhoz csatlakoztatható eszközök számát csak a 400 pF buszkapacitási korlát és a 7 bites slave cím hosszúság korlátozza.
Adatátvitel és keretformátum
Az átvitel két alapvető egységből áll, cím csomagból és ezt követő egy vagy több adatcsomagból. Nyilvánvalóan a cím csomag meg kell hogy előzze az adatcsomagokat, hiszen ki kell választani, melyik slave-nek szánjuk, vagy melyiktől várjuk az adatokat. Az adatcsomag és a cím csomag azonos felépítésű, csak nyilvánvalóan más információkat hordoz. A cím csomag és az azt követő adatcsomagokból álló adathalmaz átvitele egy egyszerűen eldönthető START feltétellel kezdődik és egy hasonlóan egyszerű STOP feltétellel záródik. A cím csomag és az ezt követő egy vagy több adatcsomag 8 bitből és egy nyugtázó ACK bitből áll. A 8 adatbitet a küldő állítja elő, míg az ACK bitet a fogadó.
START és STOP feltételek
A Master kezdeményezi és befejezi az adatátvitelt. Az átvitel akkor indul el, amikor a master START feltételt ad ki a buszon, és akkor fejeződik be, amikor a master STOP feltételt ad ki. A START és a STOP állapot között a busz foglaltnak minősül, és más master nem próbálhatja meg átvenni az irányítást a busz felett. Különleges eset fordul elő, amikor új START feltétel kerül kiadásra a START és a STOP feltétel között. Ezt REPEATED START feltételnek nevezik, és akkor használják, amikor a master új átadást kíván kezdeményezni anélkül, hogy lemondana a busz irányításáról. REPEATED START után a busz foglaltnak minősül a következő STOP-ig. Ez megegyezik a START viselkedésével, ezért ezt a továbbiakban nem is különböztetjük meg. A START után következik egy címcsomag és ezt követheti egy vagy több adatcsomag.
Amint az alább látható, a START és STOP feltételeket az SDA vonal szintjének megváltoztatásával jelzik, az alatt, amíg az SCL vonal magas. Az alábbi ábra ezeket a helyzeteket szemlélteti:
Bitek átvitele
A TWI buszon átvitt minden adatbitet egy impulzus kísér az óravonalon. Az adatvonal szintjének stabilnak kell lennie, ha az óravonal magas. Az egyetlen kivétel ez alól a szabály alól a START és STOP feltételek létrehozása. Az ábrán jól látható az SDA és az SCL vezetékek összefüggése:
A cím csomagok formátuma
A TWI buszon továbbított összes cím csomag 9 bit hosszú, 7 címbitből, egy READ/WRITE vezérlőbitből és egy nyugtázó bitből áll. Ha az READ/WRITE bit értéke 1, olvasási műveletet kell végrehajtani azaz a következőkben a mester küldi az adatot, és a kiválasztott slave olvassa azt a busz adatvezetékéről (SDA). Ha a READ/RITE bit értéke 0, akkor írás következik, azaz a következőkben a slave írja ki az adatot az SDA adatvezetékre és a master veszi azt.. Amikor egy slave felismeri, hogy megszólítják, nyugtáznia kell azzal, hogy alacsonyra húzza az SDA-t a kilencedik SCL (ACK) ciklusban. Ha a megszólított slave elfoglalt, vagy valamilyen más okból nem tudja kiszolgálni a master kérését, akkor az SDA vonalat magasan hagyja az ACK-val jelzett órajelciklusban.
A master ezután továbbíthat egy STOP feltételt vagy egy REPEATED START feltételt egy új átvitel kezdeményezéséhez. A slave címből és egy READ vagy WRITE bitből álló cím csomagot SLA+R vagy SLA+W néven hívják.
Először a címbájt MSB-je kerül továbbításra. A slave címeket a tervező szabadon oszthatja ki, de a 0000 000 cím általános hívásra van fenntartva.
Amikor egy általános hívás kiadásra kerül, minden slave-nek válaszolnia kell az SDA vonal alacsonyra húzásával az ACK ciklusban. Általános hívást akkor használnak, amikor egy master ugyanazt az üzenetet szeretné továbbítani több slave-nek a rendszerben. Amikor az általános hívási címet egy írási bit követi a buszon, az összes slave, amely az általános hívás nyugtázására van beállítva, alacsonyra húzza az SDA vonalat az ACK ciklusban. A következő adatcsomagokat ezután minden slave megkapja. Az általános hívási cím és az olvasási bit továbbítása értelmetlen, mivel ütközéseket okozna, ha több slave különböző adatokat kezdene továbbítani.
Az adatlep szerint minden „1111 xxx” formátumú címet fenn kell tartani jövőbeli célokra, tehát máris csak 120 címünk lehet!
Adatcsomag formátum
A TWI buszon továbbított összes adatcsomag kilenc bit hosszú, egy adatbájtból és egy nyugtázó bitből áll. Az adatátvitel során a Master generálja az órajelet, valamint a START és STOP feltételeket, míg a vevő felelős a vétel nyugtázásáért (ne feledjük, hogy a master is lehet vevő szerepben). A nyugtázást (ACK) az jelzi, hogy a vevő alacsonyra húzza az SDA vonalat a kilencedik SCL ciklus alatt. Ha a vevő magasan hagyja az SDA vonalat, NACK jelzést kap. Amikor a Vevő megkapta az utolsó bájtot, vagy valamilyen oknál fogva nem tud több bájtot fogadni, tájékoztatnia kell az Adót egy NACK küldésével az utolsó bájt után. Először az adatbájt MSB-je kerül továbbításra.
Cím- és adatcsomagok egyesítése átvitelben
Az átvitel alapvetően egy START feltételből, egy SLA + R / W-ből, egy vagy több adatcsomagból és egy STOP feltételből áll. Az üres üzenet, amely egy START és egy STOP feltételből áll, illegális. Vegyük figyelembe, hogy az SCL vonal vezetékes AND-ként használható a Master és a Slave közötti kézfogás megvalósítására. A slave meghosszabbíthatja az SCL alacsony periódusát az SCL vonal alacsonyra húzásával. Ez akkor hasznos, ha a Master által beállított órajel túl gyors a Slave számára, vagy a Slave-nek több időre van szüksége a feldolgozáshoz az adatátvitelek között. Az SCL alacsony periódusát meghosszabbító slave nem befolyásolja az SCL magas periódusát, amelyet a master határoz meg. Ennek következtében a Slave csökkentheti a TWI adatátviteli sebességét az SCL munkaciklus meghosszabbításával. Az alábbi ábra egy tipikus adatátvitelt mutat. Ne feledjük, hogy az SLA+R/W és a STOP feltétel között több adatbájt is továbbítható, az alkalmazásszoftver által megvalósított szoftverprotokolltól függően.
Több masteres buszrendszerek, arbitráció és szinkronizálás
A TWI protokoll lehetővé teszi a több masterrel rendelkező buszrendszereket. Különleges feltételeket hoztak létre a tervezők annak biztosítása érdekében, hogy az átvitelek a szokásos módon történjenek meg még akkor is, ha két vagy több master egyszerre kezdeményez átvitelt. Két feltételt kell megvalósítani a több masteres rendszerekben:
- Olyan algoritmust kell megvalósítani, amely csak az egyik master számára teszi lehetővé az átvitel befejezését. Az összes többi masternek abba kell hagynia az átadást, ha rájönnek, hogy elvesztették a kiválasztási folyamatot. Ezt a kiválasztási folyamatot arbitrációnak nevezik. Amikor egy versengő master rájön, hogy elvesztette a arbitrációt, azonnal át kell váltania Slave módba, hogy ellenőrizze, hogy a győztes master foglalkozik-e vele. Az a tény, hogy egyszerre több master kezdte meg az átvitelt, nem lehet észlelhető a slave-ek számára, azaz a buszon továbbított adatok nem sérülhetnek.
- A különböző masterek különböző SCL frekvenciákat használhatnak. Ki kellett hát dolgozni egy módszert az összes master soros óráinak szinkronizálására, hogy az átvitel zárt lépésben folytatódhasson.
A buszvonalak vezetékezése mindkét probléma megoldására szolgál. Az összes master soros órája vezetékes AND megvalósítású, így egy kombinált óra jön létre, amelynek magas periódusa megegyezik a legrövidebb magas periódusú Masterével. A kombinált óra alacsony periódusa megegyezik a leghosszabb alacsony periódusú Master alacsony periódusával. Minden master figyeli az SCL vonalat, és észreveszi, amikor másik master vagy slave beavatkozik az SCL vonal jelszintjébe.
A arbitrációt minden master végzi, aki folyamatosan figyeli az SDA vonalat az adatok kiadása után. Ha az SDA sorból kiolvasott érték nem egyezik meg a saját órajelének kimeneti értékével, akkor elvesztette az arbitrációt. Egy master csak akkor veszítheti el az arbitrációt, ha magas SDA-értéket ad ki, míg egy másik master alacsony értéket ad ki. A vesztes masternek azonnal slave módba kell lépnie, ellenőrizve, hogy a győztes master megszólítja-e. Az SDA vonalat magasan kell hagyni, de a vesztes masterek az aktuális adat- vagy címcsomag végéig órajelet generálhatnak. Az arbitráció addig folytatódik, amíg csak egy Master marad, és ez sok bitet vehet igénybe. Ha több master próbálja megszólítani ugyanazt a slave-et, az arbitráció folytatódik az adatcsomagban.
Az arbitráció elvesztésének folyamatát mutatja be az alábbi ábra:
Belátható, hogy az arbitráció folyamata sérülhet, ha valamelyik master REPEATED START feltételt állít elő. Ezért a felhasználói szoftver felelőssége annak biztosítása, hogy ez ne forduljon elő. Ez azt jelenti, hogy a több masteres rendszerekben minden adatátvitelnek ugyanazt az SLA+R/W és adatcsomagokat kell használnia. Más szóval: Minden átvitelnek azonos számú adatcsomagot kell tartalmaznia, különben az arbitráció eredménye nem határozható meg.
A TWI modul áttekintése
A TWI modul több almodulból áll. Az alábbi ábra mutatja be ezeket és kapcsolataikat. Minden vastag vonalban rajzolt regiszter elérhető az AVR adatbuszon keresztül.
SCL és SDA kivezetések
Ezek a kivezetések összekötik az AVR TWI-t az MCU rendszer többi részével. A kimeneti meghajtók változási sebesség korlátozót tartalmaznak, hogy megfeleljenek a TWI specifikációnak. A bemeneti szakaszok tartalmaznak egy tüskeelnyomási egységet, amely eltávolítja az 50 ns-nál rövidebb tüskéket. Ne feledje, hogy az AVR padok belső húzókártyái engedélyezhetők az SCL és SDA tűknek megfelelő PORT bitek beállításával, az I / O Port részben leírtak szerint. A belső húzódzkodások egyes rendszerekben kiküszöbölhetik a külső igénybevétel szükségességét.
Bit Rate Generator
Ez az egység vezérli az SCL időtartamát, amikor Master módban működik. Az SCL periódust a TWI bitsebesség-regiszter (TWBR) beállításai és a TWI állapotregiszter (TWSR) előskálázó bitjei vezérlik. A slave működés nem függ a bitsebességtől vagy az előskálázó beállításaitól, de a CPU órajelfrekvenciájának legalább 16-szor nagyobbnak kell lennie, mint az SCL frekvencia. A slave-k meghosszabbíthatják az SCL alacsony periódusát, ezáltal csökkentve a TWI busz átlagos órajelét. Az SCL frekvenciát a következő egyenlet szerint generáljuk:
ahol:
- TWBR = a TWI bitsebesség-regiszter értéke.
- PrescalerValue = az előskálázó értéke a TWPS0 és TWPS1 bitek beállítása szerint:
Külső felhúzó ellenállások számítása
felhúzó ellenállás megválasztása hosszú vezeték esetén fontos lehet. A buszfrekvencia értéke alapján az adatlap kétféle értéket is ad.
Ahol Cb értéke 10pF és 400pF közötti lehet, és ez az SCL és SDA vezetékek eredő kapacitására vonatkozik. A felhúzó ellenállás maximumát láthatóan nehezebb meghatározni, mert itt már kapacitás mérésre vagy számításra is szükség lehet. Nekem ez biztosan gondot okozna, ezért inkább a minimum értéket szeretem meghatározni. 5V-os rendszer esetén ez ~1.5 Kohm. Persze ha a rendszer fogyasztása kritikus, akkor lehet ennél sokkal nagyobb értékekkel is próbálkozni. Működött már I2C port felhúzó ellenállás nélkül a vezérlő belső felhúzó ellenállásaival és 1Kohm felhúzóval is, mert csak az volt kéznél. Tág a határ, bár módszereim nem tudományosak!
Busz interface Unit
Ez az egység tartalmazza az adat- és címeltolási regisztert (TWDR), egy START/STOP vezérlőt és arbitráció észlelő hardvert. A TWDR tartalmazza a továbbítandó címet vagy adatbájtokat, illetve a fogadott cím- vagy adatbájtokat. A 8 bites TWDR mellett a buszinterfész egység tartalmaz egy regisztert is, amely tartalmazza a küldendő vagy fogadandó (N)ACK bitet. Ez az (N)ACK regiszter nem érhető el közvetlenül az alkalmazás szoftverével. Fogadáskor azonban beállítható vagy törölhető a TWI Control Register (TWCR) manipulálásával. Adó módban a vett (N)ACK bit értéke meghatározható a TWSR értékével.
A START/STOP vezérlő felelős a START, REPEAT START és STOP feltételek generálásáért és észleléséért. A START/STOP vezérlő képes felismerni a START és STOP állapotokat még akkor is, ha az AVR MCU az egyik alvó üzemmódban van. Ezzel lehetővé teszi az MCU számára, hogy felébredjen, ha egy master megszólítja.
Ha a TWI masterként kezdeményezte az átvitelt, az arbitráció hardver folyamatosan figyeli az átvitelt, és megpróbálja meghatározni, hogy folyamatban van-e arbitráció eljárás. Ha a TWI elvesztett egy arbitrációt, erről tájékoztatják az ellenőrző egységet. Ezután elvégezhető a helyes művelet, és létrehozhatók a megfelelő állapotkódok.
létrehozhatók a megfelelő állapotkódok.
Address Match Unit (címegyeztetési egység)
A címegyeztetési egység ellenőrzi, hogy a fogadott címbájtok megegyeznek-e a TWI címnyilvántartásban (TWAR) szereplő hétbites címmel. Ha a TWAR TWI General Call Recognition Enable (TWGCE) bitjét egyre írják, akkor az összes bejövő címbit is összehasonlításra kerül az általános hívási címmel. Címegyezés esetén a vezérlőegység értesítést kap, lehetővé téve a helyes művelet elvégzését. A TWI a TWCR beállításaitól függően nyugtázhatja vagy nem nyugtázhatja a címét. Az Address Match egység akkor is képes összehasonlítani a címeket, ha az AVR MCU alvó üzemmódban van, lehetővé téve az MCU számára, hogy felébredjen, ha egy master megszólítja.
Control Unit (Vezérlőegység)
A vezérlőegység figyeli a TWI buszt, és a TWI vezérlés beállításainak megfelelő válaszokat generál. Működést a TWCR regiszter egyes bitjei hatátrozzák meg. Amikor az alkalmazás figyelmét igénylő esemény történik a TWI buszon, a TWI megszakításjelző (TWINT) bebillentésre kerül. A következő óraciklusban a TWI állapotregiszter (TWSR) frissül az eseményt azonosító állapotkóddal. A TWSR csak akkor tartalmaz releváns állapotinformációkat, ha a TWINT bit bebillent. Minden más esetben a TWSR egy speciális állapotkódot tartalmaz, amely azt jelzi, hogy nem áll rendelkezésre releváns állapotinformáció. Amíg a TWINT jelző be van állítva, az SCL vonal alacsonyan marad. Ez lehetővé teszi az alkalmazási szoftver számára, hogy befejezze feladatait, mielőtt lehetővé tenné a TWI átvitel folytatását.
A TWINT jelző a következő helyzetekben állítható be:
- Miután a TWI továbbította a START/REPETEAD START állapotot.
- Miután a TWI továbbította az SLA+R/W-t.
- Miután a TWI továbbított egy címbájtot.
- Miután a TWI elvesztette a arbitrációt.
- Miután a TWI-t saját slave címmel vagy általános hívással szólították meg.
- Miután a TWI kapott egy adatbájtot.
- Miután egy STOP vagy REPEATED START érkezett, miközben még mindig slave-ként szólították meg.
- Ha buszhiba történt egy illegális START vagy STOP feltétel miatt.
A TWI egység belső regiszterei
- TWBR – TWI bitsebesség-regiszter. A TWBR adható meg az osztási tényezőt a bitsebesség-generátorhoz. A bitsebesség-generátor egy frekvenciaosztó, amely az SCL órajel-frekvenciáját generálja a Master módokban.
- TWCR – TWI Control Register. A TWCR a TWI működésének vezérlésére szolgál. A TWI engedélyezésére, master hozzáférés kezdeményezésére START feltétel alkalmazásával a buszra, vevő nyugtázás generálására, leállítási feltétel generálására és a busz leállításának vezérlésére használatos
- TWSR – TWI állapotregiszter. Ez az 5 bit a TWI logika és a 2 vezetékes soros busz állapotát tükrözi. A különböző állapotkódok leírása az adatlapban található meg részletesen. A fennmaradó két értékes bit az előskálázó beállításait tartalmazza.
- TWDR – TWI Data Register. START feltételt követően a TWDR-be kell írni a slave címét és az írás olvasás jelzőbitet. Átviteli módban a TWDR tartalmazza a következő továbbítandó bájtot. Fogadási módban a TWDR tartalmazza az utoljára vett bájtot.
- TWAR – TWI (Slave) címregiszter. A TWAR-t be kell tölteni a 7 bites slave címmel, amelyre a TWI válaszol, ha Slave Adóként vagy Slave Vevőként van programozva
- TWAMR – TWI (Slave) címmaszk-regiszter. A TWAMR 7 bites mentési címmaszkkal tölthető fel. A TWAMR minden bitje elfedheti (letilthatja) a megfelelő címbiteket a TWI címregiszterben (TWAR).
A TWI használata
Az AVR TWI byte-orientált és megszakítás alapú. A megszakítások minden buszesemény után meghívásra kerülnek, mint például egy byte fogadása vagy egy START feltétel átvitele. Mivel a TWI megszakítás alapú, az alkalmazás szoftver szabadon végezhet más műveleteket a TWI bájtátvitel során. Megjegyzendő, hogy a TWCR-ben lévő TWI Interrupt Enable (TWIE) bit a SREG-ben lévő Global Interrupt Enable bittel együtt lehetővé teszi az alkalmazás számára annak eldöntését, hogy a TWINT jelző állítása generáljon-e megszakítást. Ha a TWIE bit-et töröljük, az alkalmazásnak le kell kérdeznie a TWINT jelzőt, hogy észlelje a TWI buszon végzett műveleteket.
A TWINT jelző érvényesítése után a TWI befejezte a műveletet, és várja az alkalmazás válaszát. Ebben az esetben a TWI állapotregiszter (TWSR) tartalmaz egy értéket, amely a TWI busz aktuális állapotát jelzi. Az alkalmazás ezután eldöntheti, hogy a TWI hogyan viselkedjen a következő TWI buszciklusban a TWCR és TWDR regiszterek manipulálásával.
Az alábbiakban leírásra kerül egy egyszerű példa arra, hogy az alkalmazás hogyan tud kapcsolódni a TWI hardverhez. Ebben a példában a Master egyetlen adatbájtot szeretne átadni egy Slave-nek. A leírásban példakódok is találhatók, melyekben az állapotkódok nincsenek számérték szerűen meghatározva. A kódrészletek tényleges lefordítása előtt az állapotkódokat defniálni kell a programban. A konkrét állapotkódok az ATMega328 (illetve éppen alkalmazott MCU) adatlapjából deríthetők ki.
- A TWI átvitel első lépése a START feltétel továbbítása. Ez úgy történik, hogy egy adott értéket írunk a TWCR-be, utasítva a TWI hardvert, hogy továbbítson egy START feltételt. Az írni kívánt értéket később ismertetjük. Fontos azonban, hogy a TWINT bit a kiírt értékben legyen beállítva. Ha írsz egyet a TWINT-nek, azzal törli a flag-et. A TWI nem indít el semmilyen műveletet, amíg a TWCR TWINT bitje be van állítva. Közvetlenül azután, hogy az alkalmazás törölte a TWINT-et, a TWI kezdeményezi a START feltétel továbbítását.
C Példakód:
TWCR = (1<<TWINT)|(1<<TWST A| (1<<TWEN) //START feltétel küldése - A START feltétel továbbítása után a TWCR TWINT jelzője be van állítva, és a TWSR frissül egy állapotkóddal, amely jelzi, hogy a START feltétel sikeresen elküldésre került.
C példakód:
while (!(TWCR & (1<<TWINT))); //Várakozás TWINT flag bebillenésére.
//Ez azt jelzi, hogy a START feltétel továbbításra került - Az alkalmazásszoftvernek most meg kell vizsgálnia a TWSR értékét, hogy megbizonyosodjon arról, hogy a START feltétel sikeresen továbbításra került. Ha a TWSR mást jelez, az alkalmazásszoftver speciális műveletet hajthat végre, például hibarutint hívhat. Feltételezve, hogy az állapotkód a vártnak megfelelő, az alkalmazásnak be kell töltenie az SLA+W-t a TWDR-be. Ne feledje, hogy a TWDR-t mind a címekhez, mind az adatokhoz használják. Miután a TWDR betöltődött a kívánt SLA+W-vel, egy meghatározott értéket kell írni a TWCR-be, utasítva a TWI hardvert, hogy továbbítsa a TWDR-ben lévő SLA+W-t. Az írni kívánt értéket később ismertetjük. Fontos azonban, hogy a TWINT bit a kiírt értékben legyen beállítva. Ha írsz egyet a TWINT-nek, azzal törli a flag-et. A TWI nem indít el semmilyen műveletet, amíg a TWCR TWINT bitje be van állítva. Közvetlenül azután, hogy az alkalmazás törölte a TWINT-et, a TWI megkezdi a címcsomag továbbítását.
C példakód:
if ((TWSR & 0xF8) != START) ERROR(); // A TWI állapotregiszter ellenőrző értéke.
//Maszk előskálázó bitek. Ha állapot eltér a
//START-tól ERROR() felhasználói függvény hívása
TWDR=SLA_W; // Töltse be SLA_W a TWDR-be
TWCR = (1<<TWINT) | (1<<TWEN); //Törölje a TWINT bitet a TWCR-ben
//a cím átvitel megkezdéséhez - A cím csomag továbbításakor a TWCR TWINT jelzője be van állítva, és a TWSR frissül egy állapotkóddal, amely jelzi, hogy a cím csomag sikeresen elküldésre került. Az állapotkód azt is tükrözi, hogy a slave nyugtázta-e a csomagot vagy sem.
C példakód:
while (!(TWCR & (1<<TWINT))); // Várja meg a TWINT zászló beállítását.
// Ez azt jelzi, hogy az SLA+W továbbításra
// került, és ACK/NACK érkezett. - Az alkalmazásszoftvernek most meg kell vizsgálnia a TWSR értékét, hogy megbizonyosodjon arról, hogy a cím csomag sikeresen továbbításra került, és hogy az ACK bit értéke a várt volt-e. Ha a TWSR mást jelez, az alkalmazásszoftver speciális műveletet hajthat végre, például hibarutint hívhat. Feltételezve, hogy az állapotkód a vártnak megfelelő, az alkalmazásnak be kell töltenie egy adatcsomagot a TWDR-be. Ezt követően egy meghatározott értéket kell írni a TWCR-nek, utasítva a TWI hardvert, hogy továbbítsa a TWDR-ben található adatcsomagot. Az írni kívánt értéket később ismertetjük. Fontos azonban, hogy a TWINT bit a kiírt értékben legyen beállítva. Ha írsz egyet a TWINT-nek, azzal törli a flag-et. A TWI nem indít el semmilyen műveletet, amíg a TWCR TWINT bitje be van állítva. Közvetlenül azután, hogy az alkalmazás törölte a TWINT-et, a TWI megkezdi az adatcsomag továbbítását.
C példakód:
if ((TWSR & 0xF8) != MT_SLA_ACK) ERROR(); // A TWI állapotregiszter ellenőrző értéke.
//Maszk előskálázó bitek. Ha az állapot
//eltér MT_SLA_ACK-tól, akkor ERROR()
//felhasználói függvény hívása
TWDR = DATA; //Töltse be a DATA-t a TWDR regiszterbe
TWCR = (1<<TWINT) | (1<<TWEN); //TWINT bit törlése a TWCR-ben az
//adatátvitel megkezdéséhez - Az adatcsomag továbbításakor a TWCR TWINT jelzője be van állítva, és a TWSR frissül egy állapotkóddal, amely jelzi, hogy az adatcsomag sikeresen elküldésre került. Az állapotkód azt is tükrözi, hogy a slave nyugtázta-e a csomagot vagy sem.
C példakód:
while (!(TWCR & (1<<TWINT))); // Várja meg a TWINT zászló beállítását.
// Ez azt jelzi, hogy az adatok továbbításra
// kerültek, és az ACK/NACK megérkezett - Az alkalmazásszoftvernek most meg kell vizsgálnia a TWSR értékét, hogy megbizonyosodjon arról, hogy az adatcsomag sikeresen továbbításra került, és hogy az ACK bit értéke a vártnak megfelelő volt. Ha a TWSR mást jelez, az alkalmazásszoftver speciális műveletet hajthat végre, például hibarutint hívhat. Feltételezve, hogy az állapotkód a vártnak megfelelő, az alkalmazásnak egy adott értéket kell írnia a TWCR-be, utasítva a TWI hardvert, hogy STOP feltételt továbbítson. Az írni kívánt értéket később ismertetjük. Fontos azonban, hogy a TWINT bit a kiírt értékben legyen beállítva. Ha írsz egyet a TWINT-nek, azzal törli a flag-et. A TWI nem indít el semmilyen műveletet, amíg a TWCR TWINT bitje be van állítva. Közvetlenül azután, hogy az alkalmazás törölte a TWINT-et, a TWI megkezdi a STOP feltétel továbbítását. Vegye figyelembe, hogy a TWINT NINCS beállítva a STOP feltétel elküldése után.
C kódrészlet:
if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR(); //A TWI állapotregiszter ellenőrző értéke.
//Maszk előskálázó bitek. Ha az állapot eltér
//MT_DATA_ACK-tól, akkor ERROR()
//felhasználói függvény hívása
TWCR = (1<<TWINT)|(1<<TWEN |(1<<TWSTO); //STOP feltétel előállítása
Annak ellenére, hogy ez a példa egyszerű, megmutatja az összes TWI átviteli alapelvet. Ezek a következőképpen foglalhatók össze:
- Amikor a TWI befejezte a műveletet, és alkalmazásválaszt vár, a TWINT jelzőt beállítja. Az SCL vonalat alacsonyra húzza a hardver, amíg a TWINT bitet az alaklamzás törli.
- A TWINT jelző beállításakor a felhasználónak frissítenie kell az összes TWI regisztert a következő TWI buszciklusra vonatkozó értékkel. Például a TWDR-t a következő buszciklusban továbbítandó értékkel kell betölteni.
- Miután az összes TWI regiszter frissítés és egyéb függőben lévő alkalmazásszoftver-feladat befejeződött, a TWCR regiszterben a TWINT bitet kell törölni. A TWINT flag törléséhez a bitet HIGH értékkel kell írni a TWCR regiszterbe. A TWI ezután megkezdi a TWCR beállításban meghatározott műveletek végrehajtását.
Átviteli módok
A TWI a négy fő üzemmód egyikében működhet. Ezek neve Master Transmitter (MT), Master Receiver (MR), Slave Transmitter (ST) és Slave Receiver (SR). Ezen módok közül több is használható ugyanabban a folyamatban. Például a TWI használhatja az MT módot arra, hogy adatokat írjon egy TWI EEPROM-ba, és visszaolvassa az adatokat az EEPROM-ból az MR móddal. Az alkalmazásszoftver dönti el, hogy mely módok legálisak.
Az alábbi üzemmód összefoglalók csak rövidített kivonatok, további fontos részletek é állapotkódok találhatók az adatlapban, melyekre szükség lehet, de a működés megértéshez nem szükségesek.
MT üzemmód
Master módban egy vagy több adatbyte kerül továbbításra a slave vevőhöz. A Master módba való belépéshez START feltételt kell továbbítani. A következő címcsomag formátuma határozza meg, hogy MT vagy MR üzemmódba kell-e lépni. SLA+W átvitel esetén MT módba lép, SLA+R átvitel esetén MR módba lép a master.
Adatátvitel MT üzemmódban
A START feltétel elküldéséhez a következő értékeket kell a TWCR-be írni:
A TWEN-t úgy kell beállítani, hogy engedélyezze a 2-vezetékes soros interfészt, a TWSTA-t az egyre kell írni a START feltétel továbbításához, és a TWINT-et egyre kell írni a TWINT jelző törléséhez. A TWI ezután teszteli a 2 vezetékes soros buszt, és START feltételt generál, amint a busz szabaddá válik. A START feltétel továbbítása után a TWINT jelzőt a hardver állítja be. Az MT módba való belépéshez SLA+W átvitelt kell végezni. Ez úgy történik, hogy SLA+W-t ír a TWDR regiszterbe. Ezután a TWINT bitet törölni kell (egybe írva) az átvitel folytatásához. Ezt úgy érhetjük el, hogy a következő értéket írjuk a TWCR-be:
Az SLA+W átvitele és a nyugtázó bit fogadása után a TWINT újra beállításra kerül. Az SLA+W sikeres átvitele után adatcsomagot kell küldeni. Ez úgy történik, hogy az adatbájtot TWDR regiszterbe kell beírni. A TWDR-t csak akkor szabad írni, ha a TWINT magas. Ha nem, akkor a hozzáférés megszakad, és az írási ütközési bit (TWWC) a TWCR regiszterben beállításra kerül. A TWDR frissítése után a TWINT bitet törölni kell (azaz egybe kell írni) az átvitel folytatásához. Ezt úgy érhetjük el, hogy a következő értéket írjuk a TWCR-be:
Ez a séma addig ismétlődik, amíg az utolsó byte küldésre nem kerül, és az átvitel STOP feltétel vagy ismételt START feltétel létrehozásával fejeződik be. A STOP feltétel a következő érték írásával jön létre:
AZ REPEAT START feltétel a következő érték TWCR-be írásával jön létre:
Egy REPEAT START feltétel után a TWI újra hozzáférhet ugyanahhoz a slave-hez, vagy egy új slave-hez anélkül, hogy STOP feltételt továbbítana. Az REPEAT START lehetővé teszi a Master számára, hogy slave-et váltson és/vagy váltson MT és MR módok között anélkül, hogy elveszítené az irányítást a busz felett.
MR üzemmód
MR módban bizonyos számú adatbyte érkezik a slave-től. A Master módba való belépéshez START feltételt kell továbbítani. A következő címcsomag formátuma határozza meg, hogy MT vagy MR üzemmódba kell-e lépni. SLA+W átvitel esetén MT módba lép, SLA+R átvitel esetén MR módba lép.
Adatátvitel MR üzemmódban
A START feltétel elküldéséhez a következő értéket kell a TWCR-be írni:
A TWEN-t egybe kell írni a TWI engedélyezéséhez, a TWSTA-t szintén egybe kell írni a START feltétel továbbításához, és a TWINT-et szintén egybe kell írni, hogy törlődjön a TWINT jelző. A TWI ezután teszteli TWI buszt, és START feltételt generál, és amint a busz szabaddá válik. A START feltétel átvitele után a TWINT jelzőt a hardver állítja be. Az MR módba való belépéshez SLA+R átvitelt kell végezni. Ez úgy történik, hogy SLA+R-t kell beírni a TWDR regiszterbe. Ezután a TWINT bitet törölni kell (azaz egybe kell írni) az átvitel folytatásához. Ezt úgy érhetjük el, hogy a következő értéket írjuk a TWCR-be:
Az SLA+R átvitele és a nyugtázó bit fogadása után a TWINT újra beállításra kerül. Ekkor megindul a slave adatküldése. Ha a TWINT jelzőt a hardver magasra állítja, akkor a fogadott byte kiolvasható a TWDR regiszterből. Ezt a sémát addig ismételni, amíg az utolsó bájt is meg nem érkezik. Az utolsó bájt fogadása után az MR-nek tájékoztatnia kell az ST-t egy NACK küldésével az utolsó fogadott adatbájt után. Az átvitel STOP feltétel vagy REPEAT START feltétel létrehozásával fejeződik be. A STOP feltétel úgy jön létre, hogy a következő értéket írja a TWCR-be:
AZ REPEAT START feltétel a következő érték TWCR-be írásával jön létre:
SR üzemmód
Slave Receiver módban bizonyos számú adatbájt érkezik a Master Transmitter-től.
Adatátvitel Slave Receiver módban
A Slave Receiver mód elindításához a TWAR-t és a TWCR-t az alábbiak szerint kell inicializálni:
A felső 7 bit az a cím, amelyre a TWI válaszol, amikor egy Master címzi. Ha az LSB be van állítva, a TWI válaszol az általános híváscímre (0x00), ellenkező esetben figyelmen kívül hagyja az általános híváscímet.
A TWEN-t egyre kell írni a TWI engedélyezéséhez. A TWEA bitet egybe kell írni, hogy lehetővé tegye az eszköz saját slave címének vagy az általános hívási címének nyugtázását. A TWSTA-t és a TWSTO-t nullára kell írni.
A TWAR és a TWCR inicializálása után a TWI megvárja, amíg a master továbbítja a slave címét (vagy az általános hívási címet, ha engedélyezve van annak elfogadása), majd az adatiránybit alapján dönt a következő üzemmódról. Ha az iránybit „0” (írás), a TWI SR módban fog működni, ellenkező esetben ST módba lép. Miután a saját slave címe és az írási bit megérkezett, a TWINT jelző beállításar kerül. A Slave Receiver mód akkor is létrejöhet, ha a master az arbitráció során elveszti a busz vezérlését.
Ha a TWEA bit alaphelyzetbe áll az átvitel során, a TWI a következő fogadott adatbájt után egy „Not Acknowledge” („1”) értéket ad vissza az SDA-nak. Ez használható annak jelzésére, hogy a slave nem tud több bájtot fogadni. Míg a TWEA nulla, a TWI nem ismeri el saját slave címét. A 2 vezetékes buszt azonban továbbra is figyeli, és a címfelismerés bármikor folytatódhat a TWEA beállításával. Ez azt jelenti, hogy a TWEA bit használható a TWI ideiglenes elkülönítésére a 2 vezetékes busztól.
Az Üresjárat üzemmódon kívül minden alvó üzemmódban a TWI órarendszere ki van kapcsolva. Ha a TWEA bit be van állítva, az interfész továbbra is nyugtázhatja a saját slave címét vagy az általános hívási címet a 2-vezetékes busz órajelének használatával. Az alkatrész ezután felébred. Közben a TWI alacsonyan tartja az SCL órajelet az ébredés alatt és amíg a TWINT jelzőt törl a felhasználói szoftver. A további adatfogadás a szokásos módon történik.
ST üzemmód
Slave Transmitter módban számos adatbájt kerül átvitelre a Master Receiver felé.
Adatátvitel Slave Transmitter módban
A Slave Transmitter mód elindításához a TWAR-t és a TWCR-t az alábbiak szerint kell inicializálni:
A felső hét bit az a cím, amelyre TWI válaszol, ha a Master megszólítja. Ha az LSB be van állítva, a TWI az általános hívási címre (0x00) válaszol, ellenkező esetben figyelmen kívül hagyja az általános hívási címet.
A TWEN-t egybe kell írni a TWI engedélyezéséhez. A TWEA bitet is egybe kell írni, hogy lehetővé tegye az eszköz saját slave címének vagy az általános hívási címnek a nyugtázását. A TWSTA-t és a TWSTO-t nullára kell írni.
Amikor a TWAR és a TWCR inicializálásra került, a TWI megvárja, amíg a master kiküldi slave címét (vagy az általános hívási címet, ha engedélyezve van annak elfogadása), majd az adatiránybit alapján dönt a következő üzemmódról. Ha az iránybit „1” (olvasás), a TWI ST módban fog működni, ellenkező esetben SR módba lép. Miután megkapta a saját slave címét és az írási bitet, a TWINT jelző beállításra kerül. A Slave Transmitter mód akkor is létrejöhet, ha a mester az arbitráció során elveszíti a busz vezérlését.
Ha az átvitel során a TWEA bit törlésre kerül, a TWI nem továbbít további adatokat, de az aktuális adat továbbítása befelyeződik. A TWI nem címzett Slave módra vált, és figyelmen kívül hagyja a Mastert, ha az folytatja az átvitelt.
Míg a TWEA nulla, a TWI nem válaszol a saját slave címére. A TWI azonban továbbra is figyeli a busz forgalmát, és a címfelismerés a TWEA beállításával bármikor folytatódhat. Ez azt jelenti, hogy a TWEA bit használható a TWI ideiglenes leválasztására buszról.
A készenléti üzemmód kivételével minden alvó üzemmódban a TWI órarendszere ki van kapcsolva. Ha a TWEA bit be van állítva, az interfész továbbra is nyugtázhatja saját slave címét vagy az általános hívási címet a TWI busz órajelének órajelforrásként való használatával. A hardver ezután felébred az alvásból, és a TWI alacsonyan tartja az SCL órajelet az ébredés alatt, és amíg a TWINT jelző törlésre nem kerül az a felhasználói szoftver által (azaz egybe kell írni a bitet). A további adatátvitel a szokásos módon történik.
Vegyes állapotok
Létezik a működés során két olyan állapotkód, amely nem felel meg a fenti üzemmódoknak.
- A 0xF8 állapot (lásd adatlapoot) azt jelzi, hogy nem áll rendelkezésre releváns információ, mert a TWINT Flag nincs beállítva. Ez más állapotok között fordul elő, és amikor a TWI nem vesz részt a soros átvitelben.
- A 0x00 állapot azt jelzi, hogy buszhiba történt a busz adatátvitele során. Buszhiba akkor fordul elő, ha START vagy STOP feltétel lép fel a formátumkeret illegális pozíciójában.
Több TWI üzemmódmódok kombinálása
Egyes esetekben több TWI módot kell kombinálni a kívánt művelet végrehajtásához. Ilyen eset például az adatok I2C interfésszel rendelkező EEPROM-ból történő kiolvasása. Az ilyen átvitel általában a következő lépéseket tartalmazza:
- Az adatok kiolvasásának kezdeményezése.
- Az EEPROM-nak meg kell adni, hogy milyen címről kell elkezdenie az olvasást.
- El kell végezni az adatok kiolvasásával egyidőben azok továbbítását a buszon.
- Az átvitelt be kell fejezni.
Természetesen fordított adatáramlás is előfordulhat, amikor a master által küldött adatokat az EEPROM-nak megadott címtől kezdődően tárolnia kell. A masternek utasítania kell a Slave-t, hogy milyen helyet akar olvasni, ehhez az MT módot kell használnia. Ezt követően adatokat kell kiolvasni a Slave-ből, ami az MR mód használatát jelenti. Így az átvitel irányát meg kell változtatni. Ezalatt a masternek kell irányítania a buszt. Ha ez nem teljesül és egy több master rendszerben, egy másik master megváltoztathatja az adatmutatót az EEPROM-ban a 2. és 3. lépés között, akkor rossz adatokhoz jut hozzá a rendszer. Az átviteli irány ilyen változása a címbájt adása és az adatok vétele között REPEATED START továbbításával valósul meg. REPEATED START után a master megtartja a busz vezérlés jogát. A következő ábra az átvitel folyamatát mutatja.
Több master-es rendszerek és Arbitráció
Ha több master csatlakozik ugyanahhoz a buszhoz, az adásokat egy vagy több egyidejűleg is kezdeményezheti. A TWI szabvány biztosítja, hogy az ilyen helyzeteket úgy lehessen kezelni, hogy az egyik master folytathassa az átvitelt, és a folyamat során ne vesszenek el adatok. Az alábbiakban egy arbitrációra láthatunk példát, ahol két master próbál adatokat továbbítani egy slave vevőhöz:
Az arbitráció során többféle forgatókönyv is felmerülhet, az alábbiak szerint:
- Két vagy több master azonos kommunikációt folytat ugyanazzal a Slave-vel. Ebben az esetben sem a slave, sem a masterek egyike sem fog tudni a buszversenyről.
- Két vagy több master ugyanahhoz a slave-hez fér hozzá eltérő adatokkal vagy iránybittel. Ebben az esetben arbitráció történik, akár az READ/WRITE bitben, akár az adatbitekben. Azok a masterek, amelyek egyet próbálnak kiadni az SDA-n, míg egy másik master nullát adnak ki, elvesztik az arbitrációt. A vesztes masterek „nem címzett” Slave módba kapcsolnak, vagy megvárják, amíg a busz felszabadul, és új START feltételt küldenek az alkalmazásszoftver műveletétől függően.
- Két vagy több master különböző slave-ekhez fér hozzá. Ebben az esetben az SLA bitekben arbitráció történik. Azok a masterek, amelyek egyet próbálnak kiadni az SDA-n, míg egy másik master nullát adnak ki, elvesztik az arbitrációt. Azok a masterek, akik elveszítik a arbitrációt az SLA-ban, Slave módba kapcsolnak, hogy ellenőrizzék, megszólította-e őket a nyertes Master. Ha igen, akkor a READ/WRITE bit értékétől függően SR vagy ST módba kapcsolnak. Ha nem szólítják meg őket, akkor átváltanak „nem címzett” Slave módba, vagy megvárják, amíg a busz felszabadul, és új START feltételt küldenek az alkalmazásszoftver-művelettől függően.
Regiszter Leírás
TWBR – TWI bitsebesség-regiszter
A TWBR meghatározza az osztási tényezőt 8 bites értékkel a bitsebesség-generátorhoz. A bitsebesség-generátor egy frekvenciaosztó, amely az SCL órajel-frekvenciáját generálja a Master módokban. A buszfrekvencia és a TWBR tartalma közötti összefüggést az alábbi képlet adja meg:
A TWBR meghatározza az osztási tényezőt 8 bites értékkel a bitsebesség-generátorhoz. A bitsebesség-generátor egy frekvenciaosztó, amely az SCL órajel-frekvenciáját generálja a Master módokban. A buszfrekvencia és a TWBR tartalma közötti összefüggést az alábbi képlet adja meg:
TWCR – TWI Control Register
A TWCR a TWI működésének vezérlésére szolgál. A TWI engedélyezésére, master hozzáférés kezdeményezésére START feltétel alkalmazásával a buszra, vevő nyugtázás generálására, leállítási feltétel generálására és a busz leállításának vezérlésére, szolgálnak a benne található bitek. Szintén írási ütközést jelez, ha a TWDR-be próbálnak adatokat írni, miközben a regiszter nem érhető el.
• 7. bit – TWINT: TWI megszakításjelző. Ezt a bitet a hardver állítja be, amikor a TWI befejezte jelenlegi feladatát, és az alkalmazásszoftver válaszára várakozik. Ha az SREG-ben a globális megszakítások engedélyezve vannak és a TWIE a TWCR-ben be van állítva, az MCU a TWI megszakítás keletkezik. Amíg a TWINT Flag be van állítva, az SCL alacsony időszaka megnyúlik. A TWINT jelzőt a felhasználói szoftverrel kell törölni úgy, hogy logikai egyet írunk rá. Ezt a jelzőt a hardver nem törli automatikusan a megszakítási rutin végrehajtásakor. A jelző törlése elindítja a TWI működését, így a TWI-címregiszterhez (TWAR), a TWI-állapotregiszterhez (TWSR) és a TWI-adatregiszterhez (TWDR) való minden hozzáférésnek teljesen be kell fejeződnie a jelző törlése előtt.
• 6. bit – TWEA: TWI engedélyezése nyugtázási bit. A TWEA bit vezérli a nyugtázó impulzus generálását. Ha a TWEA bit egybe van írva, az ACK impulzus létre jön (lehúzza az SLA vezetéket alacsony szintre), ha a következő feltételek teljesülnek:
– Megérkezett az eszköz saját slave címe.
– Általános hívás érkezett, miközben a TWAR-ban a TWGCE bit be van állítva.
– Egy adatbájt érkezett Master Receiver vagy Slave Receiver módban.
A TWEA bit nullára írásával az eszköz gyakorlatilag ideiglenesen leválasztható a buszról. A címfelismerés ezután folytatható a TWEA bit ismételt egybe írásával.
• 5. bit – TWSTA: TWI START feltétel bit. Az felhasználói szoftvernek kell egybe írnia a TWSTA bitet, amikor master-ré szeretne válni a buszon. A TWI hardver ellenőrzi, hogy a busz elérhető-e, és START feltételt generál a buszon, ha szabad. Ha azonban a busz nem szabad, a TWI megvárja, amíg STOP feltételt észlel, majd új START feltételt generál a busz master állapotának igényléséhez. A START feltétel átvitelekor a TWSTA-t a felhasználói szoftvernek kell törölnie.
• 4. bit – TWSTO: TWI STOP feltétel bit. A TWSTO bit egybe írása Master módban STOP feltételt generál a buszon. Amikor a buszon a STOP feltétel végrehajtásra kerül, a TWSTO bit automatikusan törlődik. Slave módban a TWSTO bit beállítása használható a hibaállapotból való helyreállításhoz. Ez nem generál STOP feltételt, de a TWI visszatér egy jól definiált cím nélküli slave módba, és nagy impedanciájú állapotba engedi az SCL és SDA vonalakat.
• 3. bit – TWWC: TWI Írási ütközés jelző. A TWWC bit beállításra kerül, amikor a felhasználói szoftver megpróbál írni a TWDR adatregiszterbe miközben a TWINT alacsony. A jelző akkor törlődik ha a felhasználói szoftver megverja, hogy TWINT bebillenjen és a felhasználói program ekkor végrehajtja a TWDR regiszterbe történő írást.
• 2. bit – TWEN: TWI engedélyezési bit. A TWEN bit lehetővé teszi a TWI működését és aktiválja a TWI interfészt. Amikor a TWEN egybe van írva, a TWI átveszi az irányítást az SCL és SDA érintkezőkhöz csatlakoztatott I/O lábak felett. Ha ez a bit nullára van írva, akkor a TWI kikapcsol, és minden TWI adás megszakad, függetlenül a folyamatban lévő műveletektől.
• 1. bit – fenntartva. Ez a bit lefoglalt bit, és mindig nulla tartalommal olvasható.
• 0. bit – TWIE: TWI megszakítás engedélyezése. Ha ez a bit egybe van írva, és az SREG-ben a globális megszakítások engedélyezése be van kapcsolva, a TWI megszakítást generál ha TWINT jelző bebillen.
TWSR – TWI állapotregiszter
• 7:3 bitek – TWS: TWI állapot. Ez az 5 bit a TWI logika és a busz állapotát tükrözi. A különböző állapotkódok leírása az adatlapban található meg részletesen. A TWSR-ből kiolvasott érték az 5 bites állapotértéket és a 2 bites előskálázó értéket is tartalmazza. Az felhasználói programnak a TWSR0 és TWSR1 biteket ki kell maszkolnia a kiolvasott értékből.
• 2. bit – fenntartva. Ez a bit le van foglalva, és mindig nullának számít.
• 1:0 bitek – TWPS: TWI előskálázó bitek. Ezek a bitek olvashatók és írhatók, és vezérelik a bitsebesség generátort. Az alábbi táblázat megadja, hogy mi ezen két bit jelentése a busz órajel frekvenciájának kiszámításában (lásd TWBR regiszter leírását)
TWDR – TWI adatregiszter
Átviteli módban a TWDR tartalmazza a következő továbbítandó bájtot. Fogadási módban a TWDR tartalmazza az utoljára vett bájtot. Ez a regsizter akkor írható amikor a TWI hardver bebillentette TWINT jelzőt. A TWDR-ben lévő adatok mindaddig stabilak maradnak, amíg a TWINT egyben található. A TWDR mindig a buszon lévő utolsó bájtot tartalmazza, kivéve a TWI megszakítás miatti alvó üzemmódból való felébredés után. Ebben az esetben a TWDR tartalma meghatározatlan. Elveszett busz arbitráció esetén nem vesznek el adatok a masterről a slave-re való átmenet során. Az ACK bit kezelését automatikusan a TWI logika vezérli, a vezérlő illetve a felhasználói szoftver nem fér hozzá közvetlenül az ACK bithez.
TWAR – TWI (Slave) címregiszter
A TWAR-t be kell tölteni a 7 bites slave címmel (a TWAR hét legmagasabb bitjeiben), amelyre a TWI válaszol, ha Slave Adóként vagy Vevőként van programozva. A regsizter tartalmára nincs szükség Master módokban. Több masteres rendszerekben a TWAR-t be kell állítani azokon a mastereken, amelyeket más masterek Slave-ként címezhetnek.
A TWAR LSB-jét az általános hívási cím (0x00) felismerésére használják. Van egy társított cím-összehasonlító, amely a kapott soros címben keresi a slave címet (vagy általános hívási címet, ha engedélyezve van). Ha talál egyezést, megszakítási kérelmet generál.
• 7:1 bitek – TWA: TWI (Slave) címregiszter. Ez a hét bit alkotja a TWI egység slave címét.
• 0. bit – TWGCE: TWI általános hívásfelismerést engedélyező bit. Ha be van állítva, ez a bit lehetővé teszi a 2 vezetékes soros buszon keresztül adott általános hívás felismerését.
TWAMR – TWI (Slave) címmaszk-regiszter
• 7:1 bitek – TWAM: TWI címmaszk. A TWAMR 7 bites mentési címmaszkkal tölthető be. A TWAMR minden bitje elfedheti (letilthatja) a megfelelő címbiteket a TWI címregiszterben (TWAR). Ha a maszkbit egyre van állítva, akkor a címegyeztetési logika figyelmen kívül hagyja a bejövő címbit és a megfelelő bit közötti összehasonlítást a TWAR-ban. Az alábbi ábra a címegyeztetési logikát mutatja be részletesen.
• 0. bit – fenntartva. Ez a bit egy nem használt bit az ATmega48A/PA/88A/PA/168A/PA/328/P-ben, és mindig nullának számít.