[Saidi indeks] [Sisukord]
 

 


4.7.3. Andmevahetus I2C-protokolli järgi

4.7.3.1. Põhimõte
I2C-protokolli hakkas 1980-te alguses välja töötama firma Philips Semiconductors, et lihtsamalt ühendada protsessorit kiipidega TV-süsteemis [16]. Tavalises süsteemis vajatakse laia siini aadresside ja andmete edastamiseks. Samuti vajatakse mitut aadressidekoodrit, et erinevaid kiipe adresseerida. Kuna selline struktuur on TV-, audio- ja videosüsteemides tülikas, siis oli Hollandis Eindhovenis asuva Philips Labs'i uuringute tulemuseks 2 signaalijuhtmega siin, mida hakati nimetama I2C-siiniks.
Praegu ei kasutata I2C-siini mitte ainult TV-, video- ja audiosüsteemides, vaid laialdaselt andmevahetuseks väga erinevate seadmete vahel: arvuti andmevahetus perifeerseadmetega nagu hiir, monitor, klaviatuur, printer, mälu, andmevahetus teise arvutiga jne.

I2C-siin koosneb kahesuunalisest andmeliinist SDA, ühesuunalisest taktiliinist SCL ja maaliinist. Igal siinil oleval seadmel on oma aadress, olgu ta siis arvuti, vedelkristalltabloo, mälu jne. Olenevalt oma ehitusest saab iga siinil olev seade olla nii saatja kui ka vastuvõtja.

[JImage - Joonis 4.7.11]
Joonis 4.7.11: I2C-siin
Siini MASTER (juhtkontroller) on kiip, mis juhib siinil andmevahetust. Samal ajal on teised seadmed siinil SLAVE-id (alluvad kontrollerid).
Põhimõtteliselt võib olla siinil rohkem kui üks MASTER. Siis nimetatakse siini MULTIMASTER-siiniks. MASTER initsialiseerib siinil andmevahetuse ja tal on kontroll taktisignaali SCL üle. Taktisignaale genereerib alati MASTER. Andmeid saadetakse ja võetakse vastu jadakoodis.

Kui MASTER-iks on kasutaja poolt programmeeritav seade (arvuti) ja SLAVE-iks seade, millel on juba rauas I2C-protokoll paika pandud, pole kasutajal muud muret kui kirjutada valmis programm MASTER-ile. SLAVE tegutseb siis vastavalt oma ehitusele. Et mikroprotsessorite praktikumis tuleb teostada andmevahetust kahe kontrolleri vahel, siis tuleb koostada programm ka SLAVE-ile. Seepärast vaadeldakse järgnevalt I2C-protokolli programmilist poolt.
MASTER, kes saadab siinile START-tingimuse, viib kõigepealt SDA madalaks. Seejärel viib ta SCL-i madalaks.

[Image - Joonis 4.7.12] [Image - Joonis 4.7.12]
Joonis 4.7.12: START-tingimus
Joonis 4.7.13: STOPP-tingimus

STOPP-tingimus on justkui eelneva peegelpilt. MASTER vabastab kõigepealt SCL-i, mis läheb seega kõrgeks ja seejärel SDA. Enne START-i ja peale STOPP-i on mõlemad signaalid kõrged. START on siinil olevatele seadmetele signaaliks, et hakkab toimuma andmevahetus, STOPP aga annab teada, et andmevahetus on lõppenud.

[Image - Joonis 4.7.14]
Joonis 4.7.14: Biti seadmine siinile

MASTER seab andmebiti saatmiseks kõigepealt SDA vastavalt andmebiti olekule. Siis vabastab ta mõneks ajaks SCL-i, ootab natuke ja viib siis enne SDA oleku muutmist SCL-i jälle madalaks. Selline tegevus on vajalik seetõttu, et mitte kõik seadmed pole dünaamilise sisendiga.

Andmed peavad olema siinil muutumatult kogu selle aja, mil taktiimpulss on kõrge. Ainus olukord, mil SDA olek võib takti kõrge seisundi ajal muutuda, on START- või STOPP-tingimuse korral. Kuna minimaalset taktsagedust pole ette antud, võib andmevahetust teostada endale meelepärase ja sobiva kiirusega. Seega näeb ülekanne välja järgmiselt:

[Image - Joonis 4.7.15]
Joonis 4.7.15: Ülekanne siinil

Kõik siinile saadetud andmesõnad peavad olema muutumatu bittide arvuga. Andmesõna saadetakse alati vanimast bitist alates. Ühe andmevahetustsükli jooksul saadetud andmesõnade arv pole limiteeritud. Andmevahetustsükkel on kõik see, mis toimub siinil START- ja STOPP-tingimuse vahel. Andmevahetuse võib igal hetkel STOPP-signaaliga katkestada.

[Image - Joonis 4.7.16]
Joonis 4.7.16: Andmevahetus siinil

Kui SLAVE on adresseeritud või ta on andmebaidi vastu võtnud, peab ta saatma vastussignaali ACK. Selleks vabastab MASTER SDA ja seejärel ka SCL-i. Nüüd kontrollib MASTER, kas SLAVE on SDA madalaks seadnud. Kui on, siis on MASTER-il ACK-signaal käes. SDA peab olema ACK-i ajal stabiilselt madal enne, kui SCL läheb kõrgeks ja ta peab jääma madalaks kogu selle aja jooksul, mil SCL on kõrge. Kui SLAVE on viinud SDA madalaks, kontrollib seda MASTER SCL-i kõrge oleku ajal ja siis viib MASTER SCL-i taas madalaks. Alles nüüd võib SLAVE vabastada SDA.
Tavaliselt kasutab MASTER ACK-i ootamisel viiteaega. Kui selle jooksul pole ACK saabunud, saadab MASTER STOPP-signaali ja jätkab oma tegevust.

Kui SLAVE on adresseeritud ja saatnud vastuseks ACK-i, sõltub kõik edasine enne STOPP-i sellest, milline on adresseeritud kiip ja millist andmevahetust soovitakse temaga teostada. Kiipi võib saata ühe või mitu baiti, lugeda temast ühe või mitu baiti või kasutada kombineeritud andmeformaati.

Kui SLAVE on ACK-iga vastanud, tuleb lihtsalt järgmised 8 bitti siinile saata. Seejärel oodatakse ACK-i. Nüüd võib saata STOPP-i või uue andmebaidi jne.

[Image - Joonis 4.7.17]
Joonis 4.7.17: Ühe baidi saatmine siinile

[Image - Joonis 4.7.18]

Joonis 4.7.18: Mitme baidi saatmine siinile

SLAVE-st lugemine toimub analoogselt saatmisega. Erinevused on vaid SDA juhtimises ja ACK-is. MASTER genereerib START-tingimuse, saadab siinile seadme aadressi ja ootab ACK-i. Edasi vabastab MASTER SDA, mida SLAVE viib vastavalt andmebittidele madalaks iga MASTERI genereeritud taktisignaali ajal. Kui kõik 8 bitti on loetud, peab MASTER saatma ACK-i SLAVE-le.
Viimase baidi lugemisel peab MASTER genereerima ACK-i asemel NACK-i, millega antakse SLAVE-le teada lugemise lõpetamisest. NACK näeb välja nagu normaalne ACK selle erandiga, et SDA jääb kõrgeks.

[Image - Joonis 4.7.19]
Joonis 4.7.19: NACK-signaal

On kaks erinevat NACK-signaali:

  1. MASTER saadab siinile SLAVE-i aadressi ja ootab ,et SLAVE saadaks kinnituseks ACK-i. Kui seda ei tule, on tegemist NACK-iga.
  2. Kui MASTER tahab lugemist lõpetada, saadab ta ACK-i asemel enne STOPP-i NACK-i. NACK-i saatmisega öeldakse SLAVE-le, et see peab SDA vabaks andma kuni ta detekteerib kas START- või STOPP-tingimuse. See peab kindlustama, et MASTER saaks anda kas STOPP- või START-signaali.

[Image - Joonis 4.7.20]
Joonis 4.7.20: Ühe baidi lugemine

[Image - Joonis 4.7.21]

Joonis 4.7.21: Signaalid siinil lugemise ajal

(1) SLAVE vabastab SDA, mis läheb kõrgeks.
(2) a) MASTER annab ACK-i SLAVELE: MASTER viib kõigepealt SDA madalaks, siis annab taktiimpulsi ja seejärel vabastab SDA. See on MASTER-i ACK-signaaliks SLAVE-le, et MASTER on kõik 8 bitti kätte saanud.
b) MASTER annab NACK-i SLAVE-le:
MASTER jätab SDA kõrgeks ja annab taktiimpulsi. See on MASTER-i signaal SLAVE-le, et lugemistsükkel on lõpetatud.
(3) Edasine sõltub MASTER-ist. Viimane võib saata STOPP-i. Kui (2) oli ACK, võib lugeda uue baidi või saata START-i. Kui (2) oli NACK, peaks siinile saadetama kas STOPP või uus START.

[Image - Joonis 4.7.22]
Joonis 4.7.22: Mitme baidi lugemine

SLAVE-i aadressiga määratakse ära, kas MASTER tahab SLAVE-i kirjutada või sealt lugeda. SLAVE-i aadressi noorim bitt on 0, kui MASTER tahab SLAVE-i kirjutada ja 1, kui MASTER tahab lugeda. Seega on paarisaadressid kirjutamisaadressid ja paaritud lugemisaadressid. Ühel seadmel on kaks aadressi, mis erinevad noorima biti oleku poolest.Nt:

kirjutamisaadress:	01000000B = 40H = 64D
lugemisaadress:		01000001B = 41H = 65D
(B - binaarkood, H - heksakood, D - kümnendkood)

Kombineeritud formaati kasutatakse peamiselt mäludega suhtlemisel. Olgu siinil nt. 128-baidine mälu, millest soovitakse lugeda 84. baiti. Tavalise andmevahetuse puhul tuleks lugeda enne 83 eelnevat baiti, mis võtab liiga palju aega. Selle vältimiseks on 2 võimalust. Võib kirjutada SLAVE-i baidi, mis osutab mälupesale, mida soovitakse lugeda. Seejärel alustatakse tavalist lugemistsüklit. Elegantsem viis on kasutada kombineeritud formaati.

[Image - Joonis 4.7.23]
Joonis 4.7.23: Kombineeritud andmeformaat

Alustatakse tavalist kirjutamistsüklit. Adresseeritakse SLAVE ja oodatakse ACK-i. ACK-i saabumisel saadetakse bait, mida mälu interpreteerib aadressiviidana (nii I2C-mälu töötab). Oodatake ära ACK SLAVE-lt, genereeritakse uus START ja saadetakse SLAVE-i lugemisaadress. Oodatakse ära ACK ja võetakse vastu andmebait. Seega ollakse nüüd tavalises lugemisreziimis. Edasi võib saata STOPP-i või jätkata SLAVE-ist lugemist. Mäluseadmed suurendavad automaatselt oma aadressiviita.
Võib genereerida ka uue START-i, adresseerida SLAVE-i saatmisreziimi, saata uue andmebaidi, mida SLAVE peab aadressiviidaks, saata uue START-i, siseneda lugemisreziimi jne.

Kergesti on teostatav järgmine andmevahetus: START, adresseerida SLAVE, saata aadressiviit, lugeda, lugeda, seada aadressiviit, lugeda, seada aadressiviit, kirjutada, seada aadressiviit, lugeda, STOPP.

4.7.3.2. Kontrolleri ehitusest tulenevad eripärad
Eelpool mainiti, et I2C-siini moodustavad vaid 2 liini, kusjuures SDA on kahesuunaline. Kontrolleril kasutatakse I2C-andmevahetuse teostamiseks rööpväratit. Kuna viimasel on ühesuunalised pordid, ei ole võimalik kasutada vaid kahte liini. A-pordi kaudu saadab MASTER takti- ja SDA-signaali, B-pordi kaudu võtab vastu SDA-signaali. SLAVE võtab B-pordi kaudu vastu SDA- ja taktisignaali, A-pordi kaudu saadab SDA-signaali.

[Image - Joonis 4.7.24]
Joonis 4.7.24: Kontrollerite ühendamine I2C-andmevahetuseks

4.7.3.3. Ülesanded
(1) Koostada algoritm ja programm n baidi saatmiseks MASTER-kontrollerist SLAVE-kontrollerisse. Andmed kirjutada SLAVE-kontrollerisse ühekordselt saadetud baasaadressist alates. SLAVE-kontrollerisse laadida olemasolev vastuvõtuprogramm. Teostada andmevahetus.

(2) Koostada algoritm ja programm n baidi lugemiseks SLAVE-kontrollerist MASTER-kontrollerisse. Andmed lugeda SLAVE-kontrollerist ühekordselt saadetud baasaadressist alates. SLAVE-kontrollerisse laadida olemasolev saatmisprogramm. Teostada andmevahetus.

(3) Koostada algoritm ja programm andmete saatmiseks SLAVE-kontrollerisse, kusjuures iga bait kirjutatakse erinevale aadressile. SLAVE-kontrollerisse laadida olemasolev vastuvõtuprogramm. Teostada andmevahetus.

(4) Koostada algoritm ja programm andmete lugemiseks SLAVE-kontrollerist, kusjuures iga bait loetakse erinevalt aadressilt. SLAVE-kontrollerisse laadida olemasolev saatmisprogramm. Teostada andmevahetus.

(5) Koostada programm andmevahetuseks SLAVE-ga, hõlmates nii andmete saatmist SLAVE-sse kui ka sealt lugemist. SLAVE-sse laadida olemasolev programm. Teostada andmevahetus.

(6) Koostada programm SLAVE-i jaoks andmete saatmiseks ja vastuvõtuks, sõltumata sellest kas kasutatakse ühte baasaadressi või kaasneb iga baidiga erinev aadress. Seejuures tuleb arvestada, et vastavad reziimid võivad vahelduda.

(7) Ülesannete (1)...(5) korral arvutada välja andmevahetuskiirus. Esitada ajadiagrammid siinil toimuva kohta. Ülesande täitmiseks kasutada loogikaanalüsaatorit.


Üles seatud Thu., 09.07.1998.
Viimati muudetud Sat., 06.11.1999 03:36 PM CEST
WWW-lehekülje kujundus, õigused, vastutus © Heiki Kasemägi, 1998-1999

[Tagasi eelmisele leheküljele (JavaScript)] [Peatükid 4.7.1..4.7.2] [Sisukord] [5. peatükk]