Alles over de Arduino I2C-bus

Arduino I2C-bus

met Arduino kan een groot aantal projecten maken zoals je hebt gezien als je Hwlibre leest, programmeren van de microcontroller op een eenvoudige manier. Maar tussen de analoge en digitale aansluitingen van dit bord hardware libreEr zijn er enkele die bij veel beginners nog enigszins onbekend zijn, zoals het ware potentieel van de PWM-verbindingen, de SPI, de RX- en TX-pinnen van de seriële poort, of de I2C-bus zelf. Daarom weet u met dit artikel in ieder geval alles wat u nodig heeft over I2C.

met de I2C-bus u kunt veel apparaten van derden die dit type protocol hebben, aansluiten en gebruiken om met het Arduino-bord te communiceren. Daartussen kunt u dankzij deze Philips-uitvinding versnellingsmeters, displays, tellers, kompassen en nog veel meer geïntegreerde schakelingen aansluiten.

Wat is I2C?

I2C verwijst naar Inter-Integated Circuit, dat wil zeggen inter-geïntegreerde schakeling. Het is een seriële datacommunicatiebus die in 1982 is ontwikkeld door het bedrijf Philips Semiconductors, dat tegenwoordig NXP Semiconductors is nadat deze sectie is verwijderd. In eerste instantie werd het gemaakt voor televisies van dit merk, om op een eenvoudige manier verschillende interne chips te communiceren. Maar sinds 1990 heeft de I2C zich verspreid en wordt hij door veel fabrikanten gebruikt.

Momenteel gebruikt door tientallen chipmakers voor meerdere functies. Atmel, de maker van de microcontrollers voor Arduino-kaarten, introduceerde de TWI-aanduiding (Two Wired Interface) voor licentiedoeleinden, hoewel deze identiek is aan I2C. Maar in 2006 is het oorspronkelijke patent verlopen en is het niet langer auteursrechtelijk beschermd, dus de term I2C is hergebruikt (alleen het logo wordt nog steeds beschermd, maar de implementatie of het gebruik van de term is niet beperkt).

Technische details van de I2C-bus

I2C-bus

El I2C-bus is een industriestandaard geworden en Arduino heeft deze geïmplementeerd voor communicatie met randapparatuur die dit nodig heeft. Het heeft slechts twee lijnen of kabels nodig voor zijn werking, één voor het kloksignaal (CLK) en de andere voor het verzenden van seriële gegevens (SDA). Dit is voordelig in vergelijking met andere communicaties in vergelijking met de SPI-bus, hoewel de werking ervan wat complexer is vanwege de extra schakelingen die vereist zijn.

Op deze bus elk apparaat dat erop is aangesloten, heeft een adres gebruikt om deze apparaten afzonderlijk te benaderen. Dit adres wordt hardwarematig vastgelegd, waarbij de laatste 3 bits worden gewijzigd door middel van jumpers of switch DIP's, hoewel het ook softwarematig kan worden gedaan. Elk apparaat heeft een uniek adres, hoewel verschillende ervan hetzelfde adres kunnen hebben en het kan nodig zijn om een ​​secundaire bus te gebruiken om conflicten te voorkomen of deze indien mogelijk te wijzigen.

Bovendien heeft de I2C-bus een Master-Slave-architectuur, dat wil zeggen, meester-slaaf. Dit betekent dat wanneer de communicatie wordt gestart door een master-apparaat, het gegevens van zijn slaves kan verzenden of ontvangen. De slaves kunnen geen communicatie tot stand brengen, alleen de master kan het doen, en de slaves kunnen ook niet rechtstreeks met elkaar praten zonder tussenkomst van de master.

Als u verschillende leraren in de bus, kan er maar één tegelijk als leraar optreden. Maar het is het niet waard, omdat de verandering van leraar een hoge complexiteit vereist, dus het komt niet vaak voor.

Houd er rekening mee dat de master levert het kloksignaal om alle apparaten op de bus te synchroniseren. Dat elimineert de noodzaak voor elke slaaf om zijn eigen horloge te hebben.

Het I2C-busprotocol voorziet ook in het gebruik van pull-up-weerstanden in de voedingsspanningslijnen (Vcc), hoewel deze weerstanden meestal niet worden gebruikt met Arduino pull-up omdat programmeerbibliotheken aangezien Wire de interne onderdelen activeert met waarden van 20-30 k. Dit kan voor sommige projecten te zacht zijn, daarom zullen de stijgende flanken van het signaal langzamer zijn, zodat lagere snelheden en kortere communicatieafstanden kunnen worden gebruikt. Om dat te corrigeren, moet u mogelijk externe pull-up-weerstanden instellen van 1k tot 4k7.

signaal

I2C-signaal

La communicatie frame waarvan een I2C-bussignaal bestaat uit de bits of toestanden (die worden gebruikt in Arduino, aangezien de I2C-standaard andere toestaat):

  • 8 bits, waarvan 7 stuks adres van het slave-apparaat waartoe u toegang wilt hebben om er gegevens van te verzenden of te ontvangen. Met 7 bits kunnen tot 128 verschillende adressen worden aangemaakt, dus theoretisch zouden 128 apparaten kunnen worden benaderd, maar slechts 112 kunnen worden benaderd, aangezien er 16 zijn gereserveerd voor speciaal gebruik. En het extra bit dat aangeeft of je wilt verzenden of ontvangen slaaf apparaat informatie.
  • Er is ook een validatiebit, als het niet actief is, is de communicatie niet geldig.
  • Dan de databytes die ze willen verzenden of ontvangen door de slaven. Elke byte bestaat, zoals u weet, uit 8 bits. Merk op dat voor elke 8-bit of 1 byte aan verzonden of ontvangen gegevens 18 extra validatiebits, adres enz. Vereist zijn, wat betekent dat de snelheid van de bus zeer beperkt is.
  • Een laatste stukje bevestiging van de communicatie.

Daarnaast is de klokfrequentie voor transmissies zijn standaard 100 Mhz, hoewel er een snellere modus is op 400 Mhz.

Voor- en nadelen van de I2C-bus

De voordeel zijn:

  • eenvoud door slechts twee regels te gebruiken.
  • Het heeft mechanismen om te weten of het signaal is aangekomen vergeleken met andere communicatieprotocollen.

De nadelen zijn:

  • Snelheid vrij lage transmissie.
  • Het is geen full duplex, dat wil zeggen dat u niet tegelijkertijd kunt verzenden en ontvangen.
  • Maakt geen gebruik van pariteit noch enig ander type verificatiemechanisme om te weten of de ontvangen databits correct zijn.

I2C op Arduino

Arduino I2C-bus

En Arduino, afhankelijk van het modelvariëren de pinnen die kunnen worden ingeschakeld om deze I2C-bus te gebruiken. Bijvoorbeeld:

  • Arduino UNO, Nano, MiniPro: A4 wordt gebruikt voor SDA (data) en A5 voor SCK (klok).
  • Arduino mega: pin 20 voor SDA en 21 voor SCK.

Onthoud dat u het moet gebruiken om het te gebruiken maak gebruik van de bibliotheek Draad.h voor uw Arduino IDE-codes, hoewel er andere zijn zoals I2C y i2cdevlib. U kunt de documenten van deze bibliotheken of onze artikelen over de projecten die u interesseren lezen om codes te verkrijgen over hoe het zou worden geprogrammeerd.

Hoe weet ik het adres van een apparaat om het met I2C te gebruiken?

Nog een laatste waarschuwing, en dat is dat wanneer u IC's van Europese, Japanse of Amerikaanse fabrikanten koopt, u geef de richting aan je zou moeten gebruiken voor het apparaat. Aan de andere kant geven de Chinezen er soms geen details over of is het niet correct, dus het zal niet werken. Dat is eenvoudig op te lossen met een adresscanner om te weten in welke richting je in je schets moet verwijzen.

La arduino gemeenschap heeft dit gecreëerd code om het adres te scannen en te identificeren Op een simpele manier. Hoewel ik je de code hier laat zien:

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


Wees de eerste om te reageren

Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.