Fórum ElektroLab.eu

Čo znamená označenie I2C?

Čo znamená označenie I2C?
Elektrolab Pridal  Elektrolab
  144 zobrazení
4
 0
Arduino a príbuzné platformy

Zbernica I2C používa pre komunikáciu iba dva signálové vodiče SDA a SCL (niekedy tiež označovaný ako SCK). Tomu napovedá aj alternatívne skratka TWI (používa ju najmä Atmel pre platformy AVR), čo je skratka pre anglický názov Two Wire (serial) Interface. Zbernica používa topológiu master / slave.

Po vodiči SCL (serial clock) sa posiela všetkým slave zariadeniam hodinový signál, čiže v prípade I2C sa jedná o synchrónnu komunikáciu. Druhý vodič SDA (serial dáta) slúžia na prenos dát (oboma smermi).

Predchádzajúce riadky napovedajú, že základom všetkej komunikácie je zariadenie, ktoré má štatút master. Master je na zbernici v danom čase len jeden. Prečo? V oblasti priemyselných zberníc totiž existujú dva veľmi dôležité pojmy - determinizmus a kolízia.

  • Determinizmus znamená, že je zaručená doba odozvy (ľubovoľného) zariadenia na zbernici.
  • Kolízia je prípad, keď dve zariadenia začnú súčasne vysielať dáta a tým ruší celú komunikáciu na zbernici.V prípade, že k nejakej kolízii dôjde, je nutné informáciu či príkaz odoslať znova, čo už však nie je deterministické. Opakované odoslanie nás totiž stojí nejaký (neurčitý) čas. Pri topológiu master-slave je zaručené, že ku kolízii nedôjde, pretože zariadenie master určuje, aké zariadenie bude v daný moment vysielať dáta.

Zariadení typu slave môže byť naopak hneď niekoľko. Pýtate sa, ako slave pozná, kedy má počúvať príkazy od master zariadenia? Rovnako ako ľudia majú mená, ktorými ich môžeme osloviť, I2C zariadenia majú (7-bitové) adresovanie. Ak máme nejakú požiadavku na človeka, zahájime komunikáciu napr. "Tomáš! Dušan !! Jana !!!". Ak máme nejakú požiadavku na I2C zariadení, zahájime komunikáciu napr. "0x0A! 0x27 !! 0x35 !!!". Teda inak, každý slave má priradenú svoju unikátnu adresu. Akonáhle slave zachytí vysielanie od zariadenia master zahŕňajúce jeho adresu, začne dáta prijímať, spracovávať a na tomto základe vykonávať rôzne operácie.

Adresa I2C pre každé zariadenie musí byť unikátna. Ak by sme mali na zbernici dve Jany (dve zariadenia s rovnakou adresou), tak by zariadenie master nevedelo, ktorá Jana odpovedá a Jany by zasa nevedeli, ktorá z nich má odpovedať. Mimochodom, viete koľko zariadení slave môžeme pripojiť k jednej zbernici? Keďže, ako už bolo povedané, je adresovanie 7-bitové, adries môže byť maximálne 27, teda 128. Prvá adresa je 0 (nula) a posledná adresa má hodnotu 127. V niektorých prípadoch je možné použiť aj 10-bitové kódovanie, však táto problematika by presahovala rozmer tohto článku.

Ako pripojiť slave zariadenia a ako určiť zariadenie master?

Tento odsek bude pomerne krátky. Ako možno viete, Arduino Uno, Nano, Raspberry Pi a ďalšie vývojové kity (resp. Mikroprocesory) disponujú hardvérovou I2C zbernicou. V prípade Una a Nana zbernicu nájdete na pinoch A4 (SDA) a A5 (SCL). K týmto pinom môžete priamo pripojiť niektoré zo zariadenia podporujúce I2C (napr. OLED displej). V tomto prípade bude mať Arduino úlohu master a displej úlohu slave.

Keďže ste si iste prečítali predchádzajúce odseky, musela Vám v hlave prebehnúť otázka, kam prípadne zapojíme tých zvyšných 127 zariadení? Slave zariadenie môžeme pripojiť paralelne - jedno vedľa druhého.

V zapojení na obrázku nižšie sa ešte nachádzajú dva pull-up rezistory. Tie sú v zapojení pre správnu funkciu zbernice nevyhnutné. Vysvetliť prečo by však bolo na ďalších pár odsekov. V tomto texte sa teda uspokojme s informáciou, že odpor týchto rezistorov je väčšinou v rozsahu 1,2 až 4,7 kΩ.

Znázornenie topológie I2C.

Ako zistím I2C adresu zariadenia, ktoré som si kúpil?

Drvivá väčšina zariadení má už z výroby priradenú nejakú adresu (z rozsahu 0-127). Pre komunikáciu s takýmto zariadením je teda nutné túto adresu zistiť. K tomu nám bude stačiť iba Arduino, napájacie a dátové vodiče. Po pripojení zariadenia na piny SCL a SDA stačí do Arduina nahrať kód uvedený nižšie, ktorý je voľne k dispozícii na serveri github.com (autor: Tod E. Kurt). Nie je nutné sťahovať externé knižnice, pretože tento program pracuje s internou knižnicou Arduino wire.h. Po nahratí programu do vývojovej platformy stačí spustiť sériový terminál, kde uvidíte výstup programu, ktorý prehľadá všetkých 128 adries. Ak je na niektorej adrese detekované zariadenie, bude na príslušnom čísla prítomná hláška "found". V prípade, že budete hľadať adresy u niekoľkých slave zariadení, odporúčam pripájať ich jednotlivo, inak po skenovaní adries nespoznáte, ktoré zariadenie je ktoré. Nič Vám však nebráni upraviť si program k obrazu svojmu :).

#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) ? " found!":"       ");
  Serial.print( (addr%4) ? "t":"n");
}

byte start_address = 8;       
byte end_address = 119;       

void setup()
{
    Wire.begin();
    Serial.begin(9600);                
    Serial.println("nI2CScanner ready!");

    Serial.print("starting scanning of I2C bus from ");
    Serial.print(start_address,DEC);
    Serial.print(" to ");
    Serial.print(end_address,DEC);
    Serial.println("...");

    scanI2CBus( start_address, end_address, scanFunc );

    Serial.println("ndone");
    pinMode(13, OUTPUT);
}

void loop()
{
    digitalWrite(13,HIGH);
    delay(300);
    digitalWrite(13,LOW);
    delay(300);
}

Pre viac informácií o zbernici I2C doporučujem navštíviť webové stránky www.i2c-bus.org.

 



Páčil sa Vám článok? Pridajte k nemu hodnotenie
 

     

Komentáre k článku

Zatiaľ nebol pridaný žiadny komentár. Pridáte prvý? Za obsah komentárov je zodpovedný užívateľ, nie prevádzkovateľ týchto stránok.
Pre komentovanie sa musíte prihlásiť.

Vyhľadajte niečo na našom blogu

Webwiki ButtonSeo servis