Alt om Arduino I2C-bussen

Arduino I2C buss

med Arduino kan opprette et stort antall prosjekter som du har sett hvis du leser Hwlibre, programmering av mikrokontrolleren på en enkel måte. Men mellom de analoge og digitale tilkoblingene til dette brettet hardware libre, er det noen som fortsatt er noe ukjente for mange nybegynnere, for eksempel det sanne potensialet til PWM-forbindelsene, SPI, RX- og TX-pinnene til den serielle porten, eller selve I2C-bussen. Derfor vil du med denne oppføringen i det minste kunne vite alt du trenger om I2C.

med I2C-bussen Du kan koble til og bruke mange tredjepartsenheter som har denne typen protokoller for å kommunisere med Arduino-kortet. Mellom dem kan du koble til akselerometre, skjermer, teller, kompass og mange flere integrerte kretser takket være denne Philips-oppfinnelsen.

Hva er I2C?

I2C refererer til interintegrert krets, det vil si interintegrert krets. Det er en seriell datakommunikasjonsbuss utviklet i 1982 av Philips Semiconductors-selskapet, som i dag er NXP Semiconductors etter å ha kvitt denne delen. Først ble den opprettet for TV-er av dette merket, for å kommunisere flere interne sjetonger på en enkel måte. Men siden 1990 har I2C spredt seg og brukes av mange produsenter.

For tiden brukt av dusinvis av chipmakere for flere funksjoner. Atmel, skaperen av mikrokontrollere for Arduino-kort, introduserte TWI (Two Wired Interface) -betegnelsen for lisensieringsformål, selv om den er identisk med I2C. Men i 2006 utløp det opprinnelige patentet og er ikke lenger underlagt copyright, så begrepet I2C har blitt gjenbrukt (bare logoen er fortsatt beskyttet, men implementeringen eller bruken av begrepet er ikke begrenset).

I2C buss tekniske detaljer

I2C buss

El I2C-bussen har blitt en industristandard, og Arduino har implementert den for kommunikasjon med eksterne enheter som trenger det. Det trenger bare to linjer eller kabler for drift, en for kloksignalet (CLK) og den andre for sending av seriell data (SDA). Dette er fordelaktig sammenlignet med annen kommunikasjon sammenlignet med SPI-bussen, selv om dens drift er noe mer kompleks på grunn av de ekstra kretsene som kreves.

På denne bussen hver enhet som er koblet til den har en adresse brukes til å få tilgang til disse enhetene individuelt. Denne adressen er løst av maskinvare, og endrer de siste 3 bitene ved hjelp av hoppere eller bytter DIPer, selv om det også kan gjøres med programvare. Hver enhet vil ha en unik adresse, selv om flere av dem kan ha samme adresse, og det kan være nødvendig å bruke en sekundær buss for å unngå konflikter eller endre den hvis mulig.

I tillegg har I2C-bussen en Master-Slave-arkitektur, det vil si herreslave. Dette betyr at når kommunikasjonen startes av en masterenhet, vil den kunne sende eller motta data fra slaverne. Slaverne vil ikke være i stand til å initiere kommunikasjon, bare mesteren kan, og heller ikke slavene kan snakke direkte med hverandre uten mesterens inngripen.

Hvis du har det flere lærere på bussen, bare en kan fungere som lærer samtidig. Men det er ikke verdt det, siden lærerskiftet krever høy kompleksitet, så det er ikke hyppig.

Husk at master gir kloksignalet for å synkronisere alle enheter på bussen. Det eliminerer behovet for hver slave å ha sin egen klokke.

I2C-bussprotokollen forutsetter også bruk av opptrekksmotstander i forsyningsspenningslinjene (Vcc), selv om disse motstandene vanligvis ikke brukes med Arduino pull-up fordi programmering biblioteker da Wire aktiverer de interne med verdier på 20-30 k. Dette kan være for mykt for noen prosjekter, derfor vil de stigende kantene på signalet bli tregere, så lavere hastigheter og kortere kommunikasjonsavstander kan brukes. For å korrigere det kan det hende du må sette eksterne motstander fra 1k til 4k7.

Signal

I2C signal

La kommunikasjonsramme hvorav et I2C-bussignal består av biter eller tilstander (de som brukes i Arduino, siden I2C-standarden tillater andre):

  • 8 bits, 7 av dem av adresse av slaveenheten du vil ha tilgang til for å sende eller motta data fra den. Med 7 biter kan opptil 128 forskjellige adresser opprettes, slik at 128 enheter kunne teoretisk fås, men bare 112 er tilgjengelig, siden 16 er reservert for spesiell bruk. Og den ekstra biten som indikerer om du vil sende eller motta informasjon om slaveenhet.
  • Det er også en valideringsbit, hvis den ikke er aktiv, vil kommunikasjonen ikke være gyldig.
  • Og så databytes som skal sendes eller mottas av slaverne. Hver byte består som kjent av 8-bits. Merk at for hver 8-bit eller 1 byte data som sendes eller mottas, kreves ytterligere 18 bits validering, adresse osv., Noe som betyr at bussen har svært begrenset hastighet.
  • En siste bit av validering av kommunikasjonen.

I tillegg er klokkefrekvensen for overføringer er 100 MHz som standard, selv om det er en raskere modus på 400 MHz.

Fordeler og ulemper ved I2C-bussen

Las nytte er:

  • enkelhet ved å bare bruke to linjer.
  • Det har den mekanismer for å vite om signalet har kommet sammenlignet med andre kommunikasjonsprotokoller.

Las ulemper er:

  • Fart ganske lav overføring.
  • Det er ikke full dupleks, det vil si at du ikke kan sende og motta samtidig.
  • Bruker ikke paritet ei heller noen annen type verifiseringsmekanisme for å vite om de mottatte databitene er riktige.

I2C på Arduino

Arduino I2C buss

En Arduino, avhengig av modell, pinnene som kan aktiveres for å bruke denne I2C-bussen, varierer. For eksempel:

  • Arduino UNO, Nano, MiniPro: A4 brukes til SDA (data) og A5 for SCK (klokke).
  • arduino mega: pin 20 for SDA og 21 for SCK.

Husk at du må bruke den for å bruke den gjøre bruk av biblioteket wire.h for dine Arduino IDE-koder, selv om det er andre som I2C y i2cdevlib. Du kan lese dokumentene i disse bibliotekene eller artiklene våre om prosjektene som interesserer deg for å få koder for hvordan den vil bli programmert.

Hvordan vet jeg adressen til en enhet for å bruke den med I2C?

Bare en siste advarsel, og det er at når du kjøper ICer fra europeiske, japanske eller amerikanske produsenter, du angi retningen du bør bruke til enheten. På den annen side beskriver kineserne noen ganger ikke det, eller det er ikke riktig, så det vil ikke fungere. Det kan enkelt løses med en adresseskanner for å vite hvilken retning du skal henvise til i skissen din.

La arduino samfunn har skapt dette kode for å skanne adressen og identifisere den På en enkel måte. Selv om jeg viser deg koden 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);
}


Bli den første til å kommentere

Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.