I²C

Allikas: Vikipeedia

I²C ("i-ruut-c" või "i-kaks-c" millele üldiselt viidatakse kui "kahejuhtme liidesele") on mitme võimaliku ülemaga jadasiin, mis leiutati Philipsi poolt ning mida kasutatakse madala kiirusega perifeeria seadmete ühendamisel emaplaatidega, manussüsteemidega, mobiiltelefonidega või muude seadmetega. Alates 2006-aastast ei ole vaja I²C protokolli kasutamiseks litsentsi osta, kuid omandamaks alluva aadressi peab maksma tasu NXP-le (varem tuntud kui Philipsi pooljuhtelektroonika divisjon).[1]

Disain[muuda | redigeeri lähteteksti]

Näidisskeem ühe ülemaga (master) ning kolme alamsõlmega (slave). Rp

I²C kasutab vaid kahte kahesuunalist avatud kollektoriga ühendust milleks on andmesiin ning kellatakt. Lisaks omab see ka pull-up takisteid. Nimetatud liidese pinge on tavaliselt +5V või +3.3V kuigi lubatud on ka muude pingetega süsteemid.

I²C näidisdisainil on 7 või 10 bitiline (olenevalt kasutatavast seadmest) aadressiruum. Kõige tavalisem kiirus millega seda siini kasutatakse on 100 kbit/s standard režiimis ning 10 kbit/s madala kiirusega režiimis, kuigi on lubatud ka meelevaldselt madalad kiirused. Hiljutised I²C siini redigeerimised on muutnud võimalikuks suurema hulga sõlmede kasutamist ning võimaldanud suuremate kiiruste kasutamist (400 kbit/s Kiir töörežiim, 1 Mbit/s Kiir töörežiim pluss-is ja 3,4 Mbit/s kiireimas töörežiimis).

Tuleb silmas pidada, et infovahetus kiirused mida eelnevalt mainiti on infovahetus ülem ja alam seadmete vahel ning ilma taktivenituseta või muude riistvara kulutusteta. Protokolli kulutuste alla kuuluvad alama aadress ja mõni kord ka registri aadress alam-seadmes, samamoodi ka baidi ACK/NACK bitid. Sellest tulenevalt on kasutaja kasuliku andmemahu kiirus väiksem kui seadmete vahel toimuv suhtluskiirus. Näiteks, kui iga suhtlus alamseadmega lubaks saata vaid ühte baiti infot saaksime kasuliku infovahetuskiiruse vaid poole seadmete vahelisest suhtluskiirusest.

Maksimaalne sõlmede hulk on piiratud aadressiruumi ning ka maksimaalse siini mahtuvuse poolt (400 pF) mis piirab praktiliselt kasutatava siinipikkuse paari meetri peale.

Näidisdisain[muuda | redigeeri lähteteksti]

Eelnevalt mainitud näidisdisain on siin koos takti ja data liinidega ning koos 7 bitise adresseerimisega. Siinil on sõlmedele kaks töörežiimi: ülem ja alam:

  • Ülemsõlm — Sõlm mis väljastab takti ja adresseerib alamaid.
  • Alamsõlm — Sõlm mis võtab vastu takti ja käitub vastavalt aadressidele.

See siin võimaldab mitme ülemsõlme olemasolekut. Lisaks võib ülem- ja alam-rolle andmepakettide vahel muuta (Peale seda kui STOP on saadetud). Igal siini seadmel on olemas neli võimalikku töörežiimi, kuigi suurem osa seadmeid kasutavad vaid ühte rolli ja selle kahte töörežiimi:

  • Ülem saatmine — Ülemsõlm saadab infot alamale
  • Ülem vastuvõtmine — Ülemsõlm võtab alamalt saadetud infot vastu
  • Alam saatmine — Alamsõlm saadab infot ülemale
  • Alam vastuvõtmine — Alamsõlm võtab ülemsõlmelt infot vastu

Ülemseade on algselt ülem saatmisrežiimis saates stardi biti ning sellele järgnevalt seitsme biti pikkuse aadressi alamseadmest millega ta soovib suhelda. Seejärel järgneb üksik bit mis annab teada kas ülemseade soovib alamseadmele kirjutada(0) või sellelt lugeda(1).

Kui vastava aadressiga alamseadeldis on siinil olemas, siis ta vastab ACK bitiga (active low for acknowledged ehk aktiivne madal tunnistamisest) selle aadressi kohta. Seejärel jätkab ülemseade kas saatmis- või vastuvõtmisrežiimis (olenevalt varem saadetud lugemis/kirjutamis bitist) ning seejärel jätkab alam ülemale vastavas režiimis.

Aadressi ja info baidid saadetakse kõige kõrgem bit esimesena. Algusbitti näitab SDA kõrgest olekust madalale üleminek samal ajal kui SCL on kõrge ning stop bitti näitab SDA madalast olekust kõrgele üleminek samal ajal kui SCL on kõrge.

Kui ülemseade soovib kirjutada siis saadetakse alamale korduvalt bait ning samal ajal saadab alam vastu ACK biti.

Kui ülem soovib baiti lugeda, siis saadab alam seda korduvalt ning ülem vastab ACK bitiga peale igat baiti välja arvatud viimase korral.

Sellele järgnevalt lõpetab ülemseadeldis ülekande stop bitiga või võib ka saata uue START biti kui ta soovib siini endale hoida ning uut ülekannet alustada.

Suhtlusprotokoll[muuda | redigeeri lähteteksti]

I²C defineerib kolme põhitüüpi sõnumid millest igaüks algab stardiga ning lõppeb stop-iga:

  • Ühekordne infovahetus kus ülem kirjutab infot alamale.
  • Ühekordne infovahetus kus ülem loeb infot alamalt.
  • Kombineeritud infovahetus kus ülem korraldab vähemalt kaks lugemist ja/või kirjutamist ühele või rohkemale alamale.

Kui tegemist on kombineeritud infovahetusega, siis iga kirjutamine hakkab stardi ning alama aadressi saatmisega. Peale esmast starti ei tule stop bitt vaid järgneb uus start bit. Selle käitumise tõttu teavad alam-seadmed et järgmine info saatmine/vastuvõtmine on eelnevaga samasse paketti kuuluv.

Mistahes alluv seadeldis reageerib vaid siis, kui ülem seadeldis adresseerib teda dokumentatsioonis määratud aadressi kasutades.

Riistvaratase[muuda | redigeeri lähteteksti]

Riistvara tasemel on nii SCL (Serial Clock line) kui SDA (Serial Data line) avatud kollektori disainiga seega on tarvis pull-up takisteid. Liini madalaks tõmbamine tähendab loogilist nulli ning seda seadmete poolt hõljuma jättes on tulemus loogiline üks. See võte on kasutusel kui kanali ligipääsumeetod. Suure andmevahetus kiirusega süsteemid lisavad ka vooluallika mis toetab kiiremat pinge tõusu ning suuremat siini mahtuvust.

Üks tähtis tagajärg tulenevalt avatud kollektorist on see, et ühte liini võivad korraga juhtida mitu sõlme. Kui mingi sõlm on liini madalaks tõmmanud siis see on madal ja kõik sõlmed mis üritavad liini kasutada saavad sellest teada. Seega nad teavad, et mõni muu sõlm on parasjagu aktiivne.

Kui seda kasutatakse SCL-i peal siis on tegemist "Takti venitamisega" ning sedasi saavad alamseadmed kiirust kontrollida. Kui sama meetodit kasutatakse SDA peal siis on tegemist läbirääkimisega tagamaks olukorda kus on ainult üks aktiivne infovahetus korraga.

Kui suhtlussiin on parasjagu vaba on mõlemad liinid kõrged (Seda kuna pull-up takistite abil tõmmatakse pinge üles ning ükski seadeldis ei tõmba pinget alla). Selleks et infovahetust alustada tõmmatakse SDA madalaks samal ajal kui SCL jääb kõrgeks. Kui SDA vabastataks oleks see stop markeriks mis annaks teada et siini andmevahetus on lõppenud. Kuigi see on lubatud käitumine on see üldiselt mõttetu ning üldiselt on järgmiseks sammuks SCL madalale tõmmata.

Välja arvatud start ja stopp signaalide korral, muutub SDA ainult siis kui takt on madal. Info biti saatmine koosneb takti saatmisest hoides samal ajal info liini soovitud tasemel.

Kuni SCL on madal, saatja (esialgselt ülem) esitab SDA soovitud väärtuse ja (pärast väikest viivitust et muutus kindlustuks) võimaldab SCL kõrgeks muutuda. Seejärel ootab ülemseade et SCL muutuks kõrgeks.

Kui SCL on kõrgeks tõusnud ootab ülemseade miinimumaja (4μs standard kiirusega I²C korral) selleks, et kindlustada alamseadme biti nägemine millejärel tõmmatakse liin uuesti madalaks. See lõpetab ühe biti ülekande.

Peale kaheksat samas suunas liikunud info bitti saadetakse vastaspoolele "teavitus bitt". Saatja ja vastuvõtja vahetavad rollid ühe biti ajaks ning eelnevalt vastuvõtjana olnud seade saadab tagasi üksiku 0 biti (ACK). Kui saatja näeb 0 biti asemel bitti 1 (NACK) saab ta teada midagi järgnevatest:

  • (Kui ülem seade saatis infot alamale) Alamseade ei ole võimeline infot vastu võtma, ei ole sellist alamat, käsk tundmatu või ei saa rohkem infot vastu võtta.
  • (kui alam saatis infot ülemale) Ülemseade soovib selle baidi järel info saatmist lõpetada.

Peale teavitusbitti võib ülemseade teha ühte järgnevatest asjadest:

  1. Ettevalmistus uue baidi saatmiseks: Saatja seab SDA ning ülem pulseerib SCL-i kõrgeks.
  2. Saata "Stop": Seada SDA madalaks, lasta SCL-il kõrgeks minna ning seejärel lasta SDA-l kõrgeks minna. See vabastab I²C siini.
  3. Saata "Korduvstart": Seada SDA kõrgeks ning lasta SCL-il madalaks minna. Seejärel tõmmates SDA uuesti madalale. Sedasi alustatakse uue I²C siini andmevahetusega ilma siini vabastamata.

Taktivenitamine kasutades SCL-i[muuda | redigeeri lähteteksti]

Üks I²C protokolli tähtsamatest omadustest on taktivenitamine. See tähendab, et adresseeritud alamseadeldis võib peale biti saatmist või saamist SCL liini all hoida. Sedasi annab ta märku, et ei ole veel valmis rohkem infot töötlema. Ülemseade mis alamaga suhtleb ei või käesoleva biti vahetamist lõpetada ning peab alati ootama kuni taktiliin läheb üles. Kui alamseadeldis teeb taktivenitamist siis jääb avatud kollektori tõttu liin madalaks. Sama on tõsi ka siis kui teine, aeglasem ülemseade üritab takti samal ajal anda. (Kui tegemist on rohkem kui ühe ülemseadmega siis tavaliselt kaotavad kõik ülemseadmed peale ühe "läbirääkimised".)

Ülemseade peab alati ootama kuni taktisiin läheb kõrgeks ning ootama lisaks miinimumaja ennem kui ta takti uuesti madalaks tõmbab.

Kuigi ka ülemseadeldis võib SCL-i nii kaua madalal hoida kui ta soovib läheb "Taktivenitusena" kirja tavaliselt vaid olukord kus seda teeb alamseadeldis. Teoorias võib iga taktipulssi venitada kuid üldiselt tehakse seda ennem või pärast ACK/NACK bitti. Näiteks kui alamseadeldis on mikrokontroller siis selle I²C liides venitab takti peale iga baiti kuni tarkvara otsustab kas saata ACK või NACK bitt.

Taktivenitus on ainus aeg kus reaalselt I²C siin on juhitud alamseadme poolt. Paljud alamseadmed ei vaja üldse taktivenitust ning seega kohtlevad SCL rangelt sisendina. Tihti puudub riistvaraline võimekus seda üldse teha. Mõnedel ülemseadmetel nagu näiteks mõned ASIC-ud (Application-specific integrated circuit e ülesandespetsiivilised integraalskeemid) ei oma üldse tuge taktivenitamisele. Selliseid seadmed on tihtipeale nimetatud kahejuhtmeliidesteks mitte I²C.

Läbirääkimised kasutades SDA-d[muuda | redigeeri lähteteksti]

Iga ülemseadeldis jälgib siini start ja stop bitte ning ei alusta kunagi oma info vahetust seni kaua kuni teine ülemseadeldis siini töös hoiab. On aga võimalus, et kaks ülemseadeldist alustavad ülekannet samal ajal. Sellisel juhul toimuvad läbirääkimised. Alamseadmete infovahetust saab ka läbi rääkida juhul kui ülemseadeldis adresseerib mitut alamat korraga kuid see pole kuigi tavaline. Erinevalt näiteks Ethernet-i protokollile mis kasutab juhusliku taganemise viivitust ennem uuesti proovimist. I²C-l on deterministlik läbirääkimiste meetod. Iga saatja kontrollib infoliini(SDA) kõrgust ning võrdleb seda tasemetega mida ta ootab. Kui need ei kehti on saatja oma õigused kaotanud ning lõpetab suhtluse.

Kui üks saatjatest seab SDA liini ühe peale (Ehk ei tõmba seda madalaks) Ning teine saatja seab selle nulli peale (ehk tõmbab madalaks) on tulemuseks olukord kus liin on madal. Esimene saatja näeb, et liin on teistsugune kui ta ootaks ning seega järeldab, et teine sõlm on töös. Esimene sõlm mis sellist erinevust märkab kaotab läbirääkimised ehk lõpetab SDA siini juhtimise. Kui seda tegev on ülemseadeldis siis ka tema lõpetab SCL liini juhtimise ning ootab stoppi. See järel võib ülemseade uuesti proovida kogu sõnumi saatmist. Samal ajal teine sõlm ei ole SDA liinil eeldatud ja päris tasemete vahel mingit erinevust märganud seega jätkab ülekannet.

Kui kaks ülemseadeldist saadavad sõnumit kahele erinevale alamale siis see kelle alama aadress on madalam saab alati aadressi tasemel õiguse. Kuna kaks ülemseadeldist võivad sõnumi saata ka samadele alam-aadressitele ning üks aadress vihjab vahepeal mitmele alamale peab läbirääkimisvõimalus alles jääma ka info ülekandmise ajal.

Iseenesest toimub läbirääkimine üpris harva, kuid on tarvis korralikuks mitme ülemaga suhtluseks. Samamoodi nagu taktivenitamisega, ei toeta seda kõik seadmeid. Seadmed mis toetavad mitme ülemseadme suhtlust omavad nimetust "Multi-master" e mitme ülemseadme toega.

Sellisel üliharuldasel juhul kui kaks ülemseadet saadavad samal ajal identse sõnumi tunnistatakse kommunikatsioon õnnestunuks kuid alamseade saab kätte vaid ühe sõnumi. Alamseadmed mis suudavad suhelda mitme ülemaga omavad see tõttu idempotentseid lisakäske.

Bufferdamine ja Multipleksimine[muuda | redigeeri lähteteksti]

Kui ühe siini küljes on palju I²C seadmeid võib tekkida vajadus lisada buffreid või multipleksereid et suuri siini osasid väiksemateks segmentideks jagada. See võib olla vajalik nii mahtuvuse vähendamiseks kui ka mitme sama aadressiga seadme lisamiseks siinile. On olemas palju erinevaid multipleksereid ja buffreid kuid need kõik peavad arvestama fakti, et I²C siin on kahesuunaline. Multipleksereid võib lisada ka analooglülititega mille abil saab ühe osa teisega siduda. Analooglülitid säilitavad siini kahesuunalisuse, kuid ei isoleeri osade mahtuvust teineteisest ega paku ka buffri võimalusi.

Kahe suunalise suhtluse liinid nagu I²C vajavad erilisi bufreid et takistada "latch-up-i". Selleks on mitmeid võimalusi: I²C on avatud kollektoriga seega buffer peab madala poole madalaks tõmbama ka siis kui see on teisel pool madal. Üks meetod "latch-up-i" ära hoidmiseks on valida buffer mille sisend ja väljund levelid on üles ehitatud selliselt, et väljundi tase oleks driveril kõrgem kui sisendi lävi. See takistab bufril ise enda väljundi muutuse peale väljundi muutuse. Näiteks võib bufri sisendi lävi olla 0.4V et madalat tuvastada kuid väljundi tase on 0.5V. Sellise meetodi kasutamine nõuab seda, et kõik teised seadmed teisel pool buffrit oleks sobivad väljund tasemega. Lisaks tähendab eelpool nimetatu, et mitmeid buffreid ei saa teineteisele järjestikku panna.

Teise võimalusena on olemas bufrid mis töötavad kui vooluvõimendid või peavad meeles oma eelnevat asendit et "latch-up-i" ära hoida.

Kasutusvaldkonnad[muuda | redigeeri lähteteksti]

I²C sobib perifeeria seadmetel kus kiirusest tähtsamad on lihtsus ja väikesed tootmiskulud. Tavalisemad I²C siini kasutusalad on järgnevad:

  • Konfiguratsiooni informatsiooni lugemine SPD EEPROMist, DDR SDRAM-ist, DDR2 SDRAM mälupulkadelt (DIMM) ja muudest korraga siini *ühendatavatest seadmetest.
  • NVRAM kiipide, mis hoiavad kasutaja seadeid, ligipääs.
  • Madala kiirusega digitaal-analoogmuundurite ja analoog-digitaalmuundurite ligipääs.
  • Monitori kontrasti, gamma ja värvibalansi seadete muutmine.
  • Helitugevuse muutmine intelligentsetel kõlaritel.
  • Näiteks mobiiltelefonide OLED või LCD ekraanide kontroll.
  • Riistvara jälgimise ja diagnostikaseadmete suhtlus. Näiteks jahutusventilaatori kiirus või/ja CPU termostaat.
  • Süsteemi komponentide toite lülitamine.
  • I²C eriline tugevus on ühe mikrokontrolleri võime suhelda hulga seadmetega kasutades ainult kahte sisend/väljund viiku ning tarkvara.

Seadmeid saab siinile lisada ja sealt ka eemaldada isegi siis kui süsteem töötab, mis teeb selle väga kasulikuks kui on tegemist seadmega mille töö jooksul on vaja temaga ühendada ja lahti ühendada mitu seadeldist.

I²C siinid muutusid populaarseks kui arvuti insenerid avastasid, et suur osa mikroskeemi tootmiskuludest tuleneb tema pakendi suurusest ja jalgade arvust. Palju väiksem pakend kaalub tavaliselt vähem ning kulutab vähem voolu. See on omakorda aga väga tähtis mobiilsetel seadmetel. Samamoodi võidavad I²C siini disainist kõik seadmed mille mõõtmed peavad olema väiksed, kuna rohkemate radade vedamine trükkplaadile võtab alati ka rohkem ruumi.

Kirjandus[muuda | redigeeri lähteteksti]

  • The I2C Bus : From Theory to Practice; Dominique Paret; 314 pages; 1997; ISBN 9780471962687.

Välislingid[muuda | redigeeri lähteteksti]

Ametlikud spetsifikatsioonid
Muud allikad

Viited[muuda | redigeeri lähteteksti]