Allt om Arduino I2C-bussen

Arduino I2C-buss

med Arduino kan skapa ett stort antal projekt som du har sett om du läser Hwlibre, programmera mikrokontrollern på ett enkelt sätt. Men bland de analoga och digitala anslutningarna på det här gratis hårdvarukortet finns det några som fortfarande är okända för många nybörjare, till exempel den verkliga potentialen för PWM-anslutningar, SPI, RX- och TX-stiften på den seriella porten eller egen I2C-buss. Därför kan du med det här inlägget åtminstone veta allt du behöver från I2C.

med I2C-bussen du kan ansluta och använda många enheter från tredje part som har denna typ av protokoll för att kommunicera med Arduino-kortet. Mellan dem kan du ansluta accelerometrar, skärmar, räknare, kompasser och många fler integrerade kretsar tack vare denna Philips-uppfinning.

Vad är I2C?

I2C hänvisar till inter-integrerad krets, det vill säga interintegrerad krets. Det är en seriell datakommunikationsbuss som utvecklades 1982 av Philips Semiconductors-företaget, som idag är NXP Semiconductors efter att ha blivit av med detta avsnitt. Först skapades det för tv-apparater av detta märke för att kommunicera flera interna marker på ett enkelt sätt. Men sedan 1990 har I2C spridit sig och används av många tillverkare.

För närvarande används av dussintals chiptillverkare för flera funktioner. Atmel, skaparen av mikrokontroller för Arduino-kort, introducerade TWI (Two Wired Interface) beteckning för licensändamål, även om den är identisk med I2C. Men 2006 upphörde det ursprungliga patentet och omfattas inte längre av upphovsrätt, så termen I2C har återanvändits (endast logotypen fortsätter att skyddas, men dess implementering eller användning av termen är inte begränsad).

I2C buss tekniska detaljer

I2C-buss

El I2C-bussen har blivit en industristandard och Arduino har implementerat den för kommunikation med kringutrustning som behöver det. Det behöver bara två linjer eller kablar för att fungera, en för klocksignalen (CLK) och den andra för att skicka seriell data (SDA). Detta är fördelaktigt jämfört med annan kommunikation jämfört med SPI-bussen, även om dess funktion är något mer komplex på grund av den extra krets som krävs.

På den här bussen varje enhet som är ansluten till den har en adress används för att komma åt dessa enheter individuellt. Denna adress fixas av hårdvara, modifierar de sista 3 bitarna med hjälp av hoppare eller switch DIP, även om det också kan göras med programvara. Varje enhet har en unik adress, även om flera av dem kan ha samma adress och det kan vara nödvändigt att använda en sekundärbuss för att undvika konflikter eller ändra den om möjligt.

Dessutom har I2C-bussen en Master-Slave-arkitektur, det vill säga master-slav. Det betyder att när kommunikation startas av en huvudenhet kommer den att kunna skicka eller ta emot data från sina slavar. Slavarna kommer inte att kunna initiera kommunikation, bara befälhavaren kan göra det, och inte heller kan slavarna prata med varandra direkt utan befälhavarens ingripande.

Om du har flera lärare på bussen, bara en kan fungera som lärare samtidigt. Men det är inte värt det, eftersom lärarbytet kräver hög komplexitet, så det är inte ofta.

Tänk på att master tillhandahåller klocksignalen för att synkronisera alla enheter på bussen. Det eliminerar behovet av varje slav att ha sin egen klocka.

I2C-bussprotokollet föreskriver också användning av uppdragningsmotstånd i matningsspänningsledningarna (Vcc), även om dessa motstånd vanligtvis inte används med Arduino pull-up eftersom programmeringsbibliotek då Wire aktiverar de interna med värden 20-30 k. Detta kan vara för mjukt för vissa projekt, därför kommer signalens stigande kanter att bli långsammare, så lägre hastigheter och kortare kommunikationsavstånd kan användas. För att rätta till det kan du behöva sätta externa dragmotstånd från 1k till 4k7.

Signal

I2C-signal

 

La kommunikationsram varav en I2C-bussignal består av bitar eller tillstånd (de som används i Arduino, eftersom I2C-standarden tillåter andra):

  • 8 bitar, 7 av dem av adress på den slavenhet som du vill komma åt för att skicka eller ta emot data från den. Med 7 bitar kan upp till 128 olika adresser skapas, så 128 enheter kan teoretiskt nås, men endast 112 kan nås, eftersom 16 är reserverade för speciell användning. Och den ytterligare biten som indikerar om du vill skicka eller ta emot information om slavenheter.
  • Det finns också en valideringsbit, om den inte är aktiv kommer kommunikationen inte att vara giltig.
  • Sedan databyte som de vill skicka eller ta emot av slavarna. Varje byte består, som du vet, av 8-bitar. Observera att för varje 8-bitars eller 1 byte data som skickas eller tas emot krävs ytterligare 18 bitar av validering, adress etc., vilket innebär att bussen är mycket begränsad i hastighet.
  • En sista bit av validering av kommunikationen.

Dessutom har klockfrekvensen för överföringar är 100 MHz som standard, även om det finns ett snabbare läge vid 400 MHz.

Fördelar och nackdelar med I2C-bussen

den ventajas ljud:

  • enkelhet genom att bara använda två rader.
  • Den har det mekanismer för att veta om signalen har kommit jämfört med andra kommunikationsprotokoll.

den nackdelar ljud:

  • Hastighet ganska låg transmission.
  • Det är inte en fullständig duplexDet vill säga, du kan inte skicka och ta emot samtidigt.
  • Använder inte paritet inte heller någon annan typ av verifieringsmekanism för att veta om de mottagna databitarna är korrekta.

 

 

I2C på Arduino

Arduino I2C-buss

En Arduino, beroende på modell, stiften som kan aktiveras för att använda denna I2C-buss varierar. Till exempel:

  • Arduino UNO, Nano, MiniPro: A4 används för SDA (data) och A5 för SCK (klocka).
  • Arduino Mega: stift 20 för SDA och 21 för SCK.

Kom ihåg att du måste använda den för att använda den använda biblioteket Wire.h för dina Arduino IDE-koder, även om det finns andra som I2C y I2Cdevlib. Du kan läsa dokumenten från dessa bibliotek eller våra artiklar om de projekt som intresserar dig för att få koder för hur det skulle programmeras.

Hur vet jag adressen till en enhet för att använda den med I2C?

Bara en sista varning, och det är att när du köper IC från europeiska, japanska eller amerikanska tillverkare, du ange riktningen du bör använda för enheten. Å andra sidan specificerar kineserna ibland inte det eller är det inte korrekt, så det kommer inte att fungera. Det kan enkelt lösas med en adressskanner för att veta vilken riktning du ska hänvisa till i din skiss.

La arduino community har skapat detta kod för att skanna adressen och identifiera den På ett enkelt sätt. Även om jag visar dig koden här:

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


Innehållet i artikeln följer våra principer om redaktionell etik. Klicka på för att rapportera ett fel här.

Bli först att kommentera

Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.