![]() |
![]() |
---|
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.
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.
![]() | ![]() |
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.
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:
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.
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.
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.
On kaks erinevat NACK-signaali:
(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.
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.
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.
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.
![]() |
![]() |
![]() |
![]() |
---|