Alt om Arduino I2C-bussen

Arduino I2C bus

med Arduino kan oprette et stort antal projekter som du har set, hvis du læser Hwlibre, programmering af mikrocontrolleren på en enkel måde. Men mellem de analoge og digitale forbindelser på dette board hardware libre, der er nogle, der stadig er noget ukendte for mange begyndere, såsom det sande potentiale af PWM-forbindelserne, SPI'en, RX- og TX-benene på den serielle port eller selve I2C-bussen. Derfor vil du med denne post i det mindste være i stand til at vide alt, hvad du har brug for om I2C.

med I2C-bussen du kan oprette forbindelse og bruge mange tredjepartsenheder, der har denne type protokol, til at kommunikere med Arduino-kortet. Mellem dem kan du forbinde accelerometre, skærme, tællere, kompasser og mange flere integrerede kredsløb takket være denne Philips-opfindelse.

Hvad er I2C?

I2C henviser til interintegreret kredsløbdet vil sige interintegreret kredsløb. Det er en seriel datakommunikationsbus, der blev udviklet i 1982 af Philips Semiconductors-firmaet, som i dag er NXP Semiconductors efter at have slettet dette afsnit. Først blev det oprettet til fjernsyn af dette mærke for at kommunikere flere interne chips på en enkel måde. Men siden 1990 har I2C spredt sig og bruges af mange producenter.

I øjeblikket brugt af snesevis af chipproducenter til flere funktioner. Atmel, skaberen af ​​mikrokontrollere til Arduino-kort, introducerede TWI-betegnelsen (Two Wired Interface) af licensårsager, skønt den er identisk med I2C. Men i 2006 udløb det oprindelige patent og er ikke længere underlagt copyright, så udtrykket I2C er blevet genbrugt (kun logoet er fortsat beskyttet, men dets implementering eller anvendelse af udtrykket er ikke begrænset).

I2C bus tekniske detaljer

I2C bus

El I2C-bus er blevet en industristandard, og Arduino har implementeret den til kommunikation med perifere enheder, der har brug for det. Det har kun brug for to linjer eller kabler til dets drift, en til ursignalet (CLK) og den anden til afsendelse af serielle data (SDA). Dette er fordelagtigt sammenlignet med anden kommunikation sammenlignet med SPI-bussen, skønt dens drift er noget mere kompleks på grund af det nødvendige ekstra kredsløb.

På denne bus hver enhed, der er tilsluttet den, har en adresse bruges til at få adgang til disse enheder individuelt. Denne adresse er rettet af hardware, der ændrer de sidste 3 bits ved hjælp af jumpere eller switch DIP'er, selvom det også kan gøres ved hjælp af software. Hver enhed har en unik adresse, selvom flere af dem muligvis har den samme adresse, og en sekundær bus muligvis skal bruges til at undgå konflikter eller ændre den, hvis det er muligt.

Derudover har I2C-bussen en Master-Slave-arkitektur, det er mester-slave. Dette betyder, at når kommunikation startes af en masterenhed, vil den være i stand til at sende eller modtage data fra dens slaver. Slaverne vil ikke være i stand til at indlede kommunikation, kun mesteren kan, og heller ikke slaverne kan tale direkte med hinanden uden mesterens indblanding.

Hvis du har flere lærere på bussen, kun en kan fungere som lærer samtidigt. Men det er ikke det værd, da lærerskiftet kræver en høj kompleksitet, så det ikke er hyppigt.

Husk, at master giver kloksignalet til at synkronisere alle enheder på bussen. Det eliminerer behovet for hver slave at have sit eget ur.

I2C-busprotokollen forudser også brugen af ​​pull-up-modstande i forsyningsspændingsledningerne (Vcc), selvom disse modstande normalt ikke bruges med Arduino pull-up fordi programmering af biblioteker da Wire aktiverer de interne med værdier på 20-30 k. Dette kan være for blødt for nogle projekter, derfor vil signalets stigende kanter være langsommere, så lavere hastigheder og kortere kommunikationsafstande kan bruges. For at rette op på det skal du muligvis indstille eksterne pull-up-modstande fra 1k til 4k7.

Signal

I2C signal

La kommunikationsramme hvoraf et I2C-bussignal består af bits eller tilstande (dem der bruges i Arduino, da I2C-standarden tillader andre):

  • 8 bits, 7 af dem på Dirección af den slaveenhed, som du vil have adgang til, for at sende eller modtage data fra den. Med 7 bits kan der oprettes op til 128 forskellige adresser, så der kan teoretisk fås adgang til 128 enheder, men kun 112 kan fås, da 16 er forbeholdt specielle anvendelser. Og den ekstra bit, der angiver, om du vil sende eller modtage oplysninger om slaveenhed.
  • Der er også en valideringsbit, hvis den ikke er aktiv, er kommunikationen ikke gyldig.
  • Derefter databytes der skal sendes eller modtages af slaverne. Hver byte består, som du ved, af 8-bit. Bemærk, at for hver 8-bit eller 1 byte af data, der sendes eller modtages, kræves yderligere 18 bit validering, adresse osv., Hvilket betyder, at bussen er meget begrænset i hastighed.
  • En sidste bit af validering af kommunikationen.

Derudover er urfrekvensen for transmissioner er 100 MHz som standard, skønt der er en hurtigere tilstand ved 400 MHz.

Fordele og ulemper ved I2C-bussen

den fordel lyd:

  • enkelhed ved kun at bruge to linjer.
  • Det har det mekanismer for at vide, om signalet er ankommet sammenlignet med andre kommunikationsprotokoller.

den desventajas lyd:

  • Hastighed ret lav transmission.
  • Det er ikke en fuld dupleks, det vil sige, du kan ikke sende og modtage samtidigt.
  • Bruger ikke paritet ej heller nogen anden form for verifikationsmekanisme for at vide, om de modtagne databits er korrekte.

I2C på Arduino

Arduino I2C bus

En Arduino, afhængigt af modellen, de ben, der kan aktiveres til at bruge denne I2C-bus, varierer. For eksempel:

  • Arduino UNO, Nano, MiniPro: A4 bruges til SDA (data) og A5 til SCK (ur).
  • Mega Arduino: pin 20 til SDA og 21 til SCK.

Husk at du skal bruge det for at bruge det gøre brug af biblioteket wire.h til dine Arduino IDE-koder, selvom der er andre som I2C y i2cdevlib. Du kan læse dokumenterne i disse biblioteker eller vores artikler om de projekter, der interesserer dig for at få koder til, hvordan det ville blive programmeret.

Hvordan kender jeg en enheds adresse til at bruge den med I2C?

Bare en sidste advarsel, og det er, at når du køber IC'er fra europæiske, japanske eller amerikanske producenter, skal du angiv retningen skal du bruge til enheden. På den anden side detaljerer kineserne nogle gange ikke det, eller det er ikke korrekt, så det fungerer ikke. Det kan let løses med en adressescanner for at vide, hvilken retning du skal henvise til i din skitse.

La arduino samfund har oprettet dette kode for at scanne adressen og identificere den På en enkel måde. Selvom jeg viser dig koden lige her:

#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);
}


Vær den første til at kommentere

Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.