su „Arduino“ gali sukurti daugybę projektų kaip matėte, jei skaitėte „Hwlibre“, paprastu būdu užprogramuoti mikrovaldiklį. Bet tarp šios plokštės analoginių ir skaitmeninių jungčių hardware libre, yra keletas, kurie daugeliui pradedančiųjų vis dar yra nežinomi, pavyzdžiui, tikrasis PWM jungčių potencialas, SPI, nuosekliojo prievado RX ir TX kaiščiai arba pati I2C magistralė. Todėl su šiuo įrašu galėsite bent jau žinoti viską, ko reikia apie I2C.
su I2C magistralę galite prisijungti ir naudoti daugelį trečiųjų šalių įrenginių, turinčių tokio tipo protokolą, kad galėtumėte bendrauti su „Arduino“ plokšte. Tarp jų, naudodami šį „Philips“ išradimą, galite prijungti akselerometrus, ekranus, skaitiklį, kompasus ir daug daugiau integruotų grandinių.
Kas yra I2C?
I2C reiškia integruotą grandinę, tai yra, integruotas grandynas. Tai 1982 metais „Philips Semiconductors“ kompanijos sukurta nuoseklioji duomenų perdavimo magistralė, kuri, atsikratius šio skyriaus, šiandien yra „NXP Semiconductors“. Iš pradžių jis buvo sukurtas šio prekės ženklo televizoriams, norint paprastu būdu perduoti keletą vidinių lustų. Tačiau nuo 1990 m. I2C išplito ir jį naudoja daugelis gamintojų.
Šiuo metu naudojasi dešimtys lustų gamintojų kelioms funkcijoms. „Arduino“ plokščių mikrovaldiklių kūrėjas „Atmel“ licencijavimo tikslais pristatė TWI („Two Wired Interface“) pavadinimą, nors jis ir identiškas I2C. Tačiau 2006 m. Pradinio patento galiojimo laikas baigėsi ir jam jau netaikomos autorių teisės, todėl terminas I2C buvo pakartotinai naudojamas (toliau tik logotipas yra saugomas, tačiau jo įgyvendinimas ar termino vartojimas nėra ribojamas).
I2C magistralės techninė informacija
El „I2C“ magistralė tapo pramonės standartu, kurį „Arduino“ įdiegė bendravimui su periferiniais įrenginiais, kuriems to reikia. Veikimui reikia tik dviejų linijų arba kabelių, vienos - laikrodžio signalui (CLK), kitos - nuosekliems duomenims (SDA) siųsti. Tai yra naudinga, palyginti su kitomis komunikacijomis, palyginti su SPI magistrale, nors jos veikimas yra šiek tiek sudėtingesnis dėl reikalingos papildomos schemos.
Šiuo autobusu kiekvienas prie jo prijungtas įrenginys turi adresą naudojami prieigai prie šių įrenginių atskirai. Šis adresas yra fiksuojamas aparatine įranga, modifikuojant paskutinius 3 bitus per džemperius arba perjungiant DIP, nors tai gali padaryti ir programinė įranga. Kiekvienas įrenginys turės unikalų adresą, nors keli iš jų gali turėti tą patį adresą ir gali tekti naudoti antrinę magistralę, kad būtų išvengta konfliktų ar, jei įmanoma, pakeista.
Be to, I2C magistralėje yra a „Master-Slave“ tipo architektūra, tai yra šeimininkas-vergas. Tai reiškia, kad pradėjus ryšį pagrindiniu įrenginiu, jis galės siųsti arba gauti duomenis iš savo vergų. Vergai negalės inicijuoti bendravimo, tai gali padaryti tik šeimininkas, vergai taip pat negali tiesiogiai kalbėtis tarpusavyje be šeimininko įsikišimo.
Jei turite keli mokytojai autobuse, tik vienas galės veikti kaip mokytojas vienu metu. Tačiau neverta, nes mokytojo kaita reikalauja didelio sudėtingumo, todėl tai nėra dažna.
Atminkite, kad „Master“ teikia laikrodžio signalą, kad sinchronizuotų visus magistralės įrenginius. Tai pašalina poreikį, kad kiekvienas vergas turėtų savo laikrodį.
„I2C“ magistralės protokole taip pat numatoma naudoti įtampos rezistorius maitinimo įtampos linijose (Vcc), nors šie rezistoriai paprastai nėra naudojami su „Arduino“ traukimas, nes programuojamos bibliotekos kadangi viela suaktyvina vidinius, kurių vertė yra 20-30 k. Kai kuriems projektams tai gali būti per minkšta, todėl kylantys signalo kraštai bus lėtesni, todėl galima naudoti mažesnį greitį ir trumpesnius ryšio atstumus. Norėdami ištaisyti, jums gali tekti nustatyti išorinius traukimo rezistorius nuo 1k iki 4k7.
Signalas
La komunikacijos rėmas iš kurių I2C magistralės signalą sudaro bitai arba būsenos (naudojamos „Arduino“, nes I2C standartas leidžia kitiems):
- 8 bitai, 7 iš jų adresas vergo įrenginio, prie kurio norite prisijungti, iš jo siųsti ar gauti duomenis. Turint 7 bitus, galima sukurti iki 128 skirtingų adresų, taigi teoriškai galima būtų pasiekti 128 įrenginius, tačiau prieiti galima tik prie 112, nes 16 yra rezervuoti specialiems tikslams. Ir papildomą bitą, kuris nurodo, jei norite siųsti ar gauti vergo įrenginio informacija.
- Taip pat egzistuoja patvirtinimo bitą, jei jis nėra aktyvus, ryšys negalios.
- Tada duomenų baitai kuriuos vergai turi siųsti ar priimti. Kiekvienas baitas, kaip žinote, susideda iš 8 bitų. Atkreipkite dėmesį, kad už kiekvieną išsiųstą ar gautą 8 bitų arba 1 baitą duomenų reikia papildomų 18 patvirtinimo, adreso ir kt. Bitų, o tai reiškia, kad magistralės greitis yra labai ribotas.
- Paskutinis patvirtinimas komunikacijos.
Be to, laikrodžio dažnis perdavimo sparta yra 100 Mhz, nors yra greitesnis 400 Mhz režimas.
I2C magistralės pranašumai ir trūkumai
The pranašumas garsas:
- Paprastumas naudojant tik dvi eilutes.
- Atmesti mechanizmai, skirti žinoti, ar signalas atėjo palyginti su kitais ryšio protokolais.
The trūkumai garsas:
- Pagreitinti gana žemas perdavimas.
- Tai nėra visas dvipusis vaizdas, tai yra, negalite siųsti ir gauti vienu metu.
- Nenaudoja pariteto nei jokio kito tipo patikros mechanizmo, kad būtų galima sužinoti, ar gauti duomenų bitai yra teisingi.
I2C „Arduino“
En „Arduino“, priklausomai nuo modelio, kaiščiai, kuriuos galima įgalinti naudoti šią I2C magistralę, skiriasi. Pavyzdžiui:
- Arduino UNO, „Nano“, „Mini Pro“: A4 naudojamas SDA (duomenys), o A5 - SCK (laikrodis).
- „Arduino Mega“: kaištis 20 SDA ir 21 SCK.
Atminkite, kad norėdami juo naudotis, turite naudotis biblioteka Viela.h jūsų „Arduino“ IDE kodams, nors yra ir kitų panašių I2C y i2cdevlib. Galite sužinoti šių bibliotekų dokumentus arba mūsų straipsnius apie jus dominančius projektus, kad gautumėte kodus, kaip tai būtų užprogramuota.
Kaip sužinoti įrenginio adresą, kad jį būtų galima naudoti su „I2C“?
Tik vienas paskutinis įspėjimas: pirkdami Europos, Japonijos ar Amerikos gamintojų IC, jūs nurodyti kryptį kuriuos turėtumėte naudoti prietaisui. Kita vertus, kinai kartais to nedetalizuoja arba tai nėra teisinga, todėl tai neveiks. Tai lengvai galima išspręsti naudojant adresų skaitytuvą, kad žinotumėte, kuria kryptimi turėtumėte remtis savo eskizu.
La arduino bendruomenė sukūrė tai kodas nuskaityti adresą ir jį identifikuoti Paprastu būdu. Nors aš jums rodau kodą čia:
#include "Wire.h" extern "C" { #include "utility/twi.h" } void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) { byte rc; byte data = 0; for( byte addr = from_addr; addr <= to_addr; addr++ ) { rc = twi_writeTo(addr, &data, 0, 1, 0); callback( addr, rc ); } } void scanFunc( byte addr, byte result ) { Serial.print("addr: "); Serial.print(addr,DEC); Serial.print( (result==0) ? " Encontrado!":" "); Serial.print( (addr%4) ? "\t":"\n"); } const byte start_address = 8; const byte end_address = 119; void setup() { Wire.begin(); Serial.begin(9600); Serial.print("Escaneando bus I2C..."); scanI2CBus( start_address, end_address, scanFunc ); Serial.println("\nTerminado"); } void loop() { delay(1000); }