nul
I2C-communicatie-interface

I2C-communicatie-interface

20 oktober 2023

In de wereld van embedded systemen en elektronica is efficiënte communicatie tussen componenten essentieel. Van de vele communicatieprotocollen die tegenwoordig beschikbaar zijn, springt I2C (Inter-Integrated Circuit) eruit als een populaire keuze voor veel ingenieurs en ontwikkelaars vanwege zijn eenvoud, flexibiliteit en lage stroomverbruik.



Wat is I2C?

Inter-Integrated Circuit, afgekort als I²C (uitgesproken als "I-squared-C" of "I-two-C"), is een veelgebruikt serieel communicatieprotocol dat wordt gekenmerkt door zijn multi-master, multi-slave, single-ended seriële busontwerp dat geschikt is voor communicatie over korte afstanden. Het unieke kenmerk van I2C is dat er slechts twee draden worden gebruikt voor communicatie, SDA (Serial Data) en SCL (Serial Clock), waardoor verbindingen worden vereenvoudigd en ruimte wordt bespaard.

Hoewel de officiële notatie "I²C" is, uitgesproken als "eye-squared-see", zullen we voor het gemak verwijzen naar "I2C". Het symbool ² is een superscript 2, wat betekent dat de I twee keer met zichzelf wordt vermenigvuldigd. Dit verwijst naar de twee draden die worden gebruikt voor communicatie.

I2C-functies:

  • I2C is een serieel, synchroon datacommunicatieprotocol.
  • Gebruikt slechts twee draden voor communicatie: seriële data en seriële klok.
  • Ondersteunt meerdere masters en meerdere slave-apparaten op dezelfde bus.
  • Half-duplex transmissie - Communicatie tussen het master- en slave-apparaat kan in beide richtingen plaatsvinden, maar niet tegelijkertijd.
  • Klokverlenging - Een slave-apparaat kan de kloklijn vasthouden om meer tijd te geven voor het verwerken van gegevens.
  • Arbitrage - Als twee masters tegelijkertijd met verzenden beginnen, heeft I2C een ingebouwde methode om te bepalen welke master doorgaat en welke wacht, zodat de gegevensintegriteit gewaarborgd blijft.
  • 7-bits adresseringssysteem, maar het ondersteunt ook 10-bits adressen.
  • Ondersteunt verschillende snelheden - De standaard I2C-specificatie definieert vier snelheidsniveaus: standaardmodus (100 kbps), snelle modus (400 kbps), snelle modus Plus (1 Mbps) en hogesnelheidsmodus (3,4 Mbps).

Meer informatie:Seriële versus parallelle communicatie


Hoe werkt I2C?

I2C is een tweedraads seriële bus die gebruikmaakt van twee bidirectionele open-drain-lijnen, SDA en SCL, die beide hoog worden getrokken.

  1. SDA (Serial Data Line): Deze lijn transporteert gegevens.
  2. SCL (Serial Clock Line): Deze lijn zorgt voor synchronisatie.
I2C-seriecommunicatieschema
I2C seriële communicatie diagram. I2C maakt gebruik van twee open-drain lijnen, SDA en SCL. Deze lijnen worden omhoog getrokken met weerstanden, wat betekent dat ze normaal gesproken een hoge spanning hebben.

Apparaten op de I2C-bus kunnen een master of een slave zijn:

  • Master (controller): Start en regelt de gegevensoverdracht op de bus.
  • Slave (randapparaat): Reageert op de master.

De termen 'master' en 'slave' werden in het verleden gebruikt om de rollen van apparaten op de I2C-bus te beschrijven, maar zijn in veel contexten grotendeels vervangen door 'controller' en 'randapparaat'.

I2C-datacommunicatieproces

  1. Bus inactief (bus vrij) toestand:
    • Voordat de communicatie begint, blijven zowel de SDA (Serial Data Line) als de SCL (Serial Clock Line) hoog, wat aangeeft dat de bus inactief is.
  2. Startvoorwaarde:
    • Op initiatief van de master treedt een startvoorwaarde op wanneer de SDA-lijn van hoog naar laag gaat terwijl de SCL-lijn hoog is. Dit geeft aan alle slave-apparaten door dat de communicatie op het punt staat te beginnen.
  3. Het adres verzenden:
    • Het masterapparaat stuurt een 7-bits adres naar de slave waarmee het wil communiceren. Dit wordt gevolgd door een 8e bit, de lees-/schrijfbit (R/W), die de richting van de bewerking aangeeft: 0 voor schrijven en 1 om te lezen.
    • Deze gecombineerde 8-bits reeks wordt het adresframe genoemd.
    • In het speciale geval van 10-bits adressen verzendt de master 2 bytes. De eerste byte begint met 11110, gevolgd door bits 9 en 8 van het 10-bits adres, gevolgd door de R/W-bit. De tweede byte bevat bits 7-0 van het 10-bits adres.
  4. Bevestigingsbit (ACK):
    • Nadat het adres en de R/W-bits zijn verzonden, geeft de master de SDA-lijn vrij. Het geadresseerde slave-apparaat trekt de SDA-lijn naar beneden (bevestigingsbit) om te bevestigen dat het zijn adres met succes heeft ontvangen en klaar is voor communicatie.
  5. Gegevensoverdracht:
    • Voor een schrijfbewerking stuurt de master een byte aan gegevens naar de slave. De slave bevestigt de ontvangst door de SDA-lijn gedurende één klokpuls laag te trekken.
    • Bij een leesbewerking stuurt de slave een byte aan gegevens naar de master. De master bevestigt de ontvangst, maar geeft de SDA-lijn vrij (een NACK of geen bevestiging) na de laatste byte tijdens een leesbewerking, waarmee hij de slave aangeeft te stoppen met het verzenden van gegevens.
  6. Stopvoorwaarde:
    • Om een communicatiesessie te beëindigen, genereert de master een stopconditie door de SDA-lijn van laag naar hoog te schakelen terwijl de SCL-lijn hoog is. Na de stopconditie keert de bus terug naar de rusttoestand.
    • De master kan ook een herhaalde startconditie genereren om de controle over de bus te behouden voor een andere lees- of schrijfbewerking. Dit wordt vaak gebruikt bij complexere bewerkingen, zoals het wijzigen van de gegevensrichting zonder de bus vrij te geven.
I2C seriële datacommunicatieproces
I2C seriële datacommunicatieproces.

Meer informatie:Wat is baudrate?

Meerdere slaves aanspreken

Als er meerdere slave-apparaten zijn, communiceert de master met elk apparaat via hun unieke adressen. Alleen de slave met het overeenkomende adres reageert en communiceert, terwijl de andere apparaten de berichten negeren.

Klok uitrekken

Een slave kan de SCL-lijn ingedrukt houden (een proces dat bekend staat als clock stretching) als hij meer tijd nodig heeft om een instructie te verwerken of gegevens op te halen. De master moet wachten tot de SCL wordt vrijgegeven voordat hij verder kan gaan.

Busarbitrage (voor multi-master)

Arbitrage is het proces waarbij wordt bepaald welk masterapparaat de controle over de bus krijgt wanneer meerdere masters tegelijkertijd of binnen een kort tijdsbestek communicatie proberen te starten. I2C ondersteunt meerdere masters, wat betekent dat meer dan één master op een bepaald moment kan proberen de bus te controleren zonder het bericht te beschadigen.

I2C-arbitrageprocedure:
  • Wanneer een master een transmissie start, gaat deze ervan uit dat hij de controle over de bus heeft.
  • Terwijl het de adres- en databits verstuurt, controleert het de SDA-lijn na het schrijven van elke bit. Als het een 0 en leest een 1, weet het dat een andere meester de controle heeft en trekt het zich terug, waardoor het de arbitrage verliest.
  • De master die de arbitrage heeft verloren, stopt onmiddellijk met verzenden en wacht tot de SCL-lijn (Serial Clock) op HIGH staat, wat het einde van de huidige overdracht aangeeft, voordat hij het opnieuw probeert.

Met efficiënte gegevensoverdracht via slechts twee draden is I2C een populaire seriële communicatie-interface geworden voor systemen die op zoek zijn naar betrouwbare en kosteneffectieve communicatie.

Meer informatie:Voorbeeldcode voor het implementeren van I2C op een 16x2 COG LCD-scherm


Voordelen van I2C:

  • Eenvoud: Er zijn slechts twee draden nodig, ongeacht hoeveel apparaten er zijn aangesloten.
  • Flexibiliteit: Ondersteunt meerdere masters en slaves.
  • Energie-efficiëntie: I2C-randapparatuur kan worden uitgeschakeld wanneer deze niet wordt gebruikt, zonder dat dit invloed heeft op de bus.
  • Ingebouwde adressering: elk apparaat op de bus heeft een uniek adres.
  • Breed ondersteund: veel microcontrollers en randapparatuur zijn voorzien van ingebouwde I2C-hardware-interfaces, wat de integratie vergemakkelijkt.
  • Flexibele snelheidsmodi: I2C ondersteunt verschillende snelheidsmodi.

Nadelen van I2C:

  • Snelheidsbeperkingen: Doorgaans langzamer dan andere protocollen zoals SPI.
  • Afstandsbeperkingen: I2C is ontworpen voor korte afstanden. Bij langere afstanden kunnen signaalintegriteit en ruis een probleem vormen.
  • Complexiteit bij grote netwerken: naarmate er meer apparaten worden toegevoegd, kan de adressering ingewikkeld worden.
  • Geen foutcontrole: mist een ingebouwd mechanisme voor foutcontrole.
  • Single-ended: geen differentiële signaaloverdracht, wat de ruisimmuniteit zou kunnen verbeteren.

I2C versus andere seriële communicatieprotocollen

Bij het kiezen van een serieel communicatieprotocol voor uw project is het belangrijk om rekening te houden met de specifieke behoeften van uw toepassing. Hoewel I2C een populaire keuze is, zijn er ook andere protocollen beschikbaar, zoals SPI, RS-232, CAN en UART. Elk protocol heeft zijn eigen voor- en nadelen, dus het is belangrijk om de voor- en nadelen af te wegen voordat u een beslissing neemt.

I2C versus SPI (Serial Peripheral Interface):

  • Kabels: SPI vereist meer kabels: SCLK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) en een unieke SS (Slave Select) voor elk apparaat. I2C daarentegen vereist alleen SDA en SCL.
  • Snelheid: SPI kan sneller zijn dan I2C, omdat er geen adresfase is bij de gegevensoverdracht.
  • Flexibiliteit: Terwijl I2C standaard multi-masterconfiguratie ondersteunt, doet SPI dat niet.

I2C versus UART (Universal Asynchronous Receiver-Transmitter):

  • Complexiteit van het protocol: UART is eenvoudiger omdat er slechts twee apparaten met elkaar communiceren via twee lijnen (TX en RX). I2C kan meerdere apparaten verbinden via slechts twee lijnen.
  • Synchronisatie: UART is asynchroon (geen kloklijn), terwijl I2C synchroon is (vereist een kloklijn).

I2C versus CAN (Controller Area Network):

  • Gebruiksscenario: CAN is ontworpen voor voertuigen en industriële systemen waar betrouwbaarheid onder ruwe omstandigheden cruciaal is. I2C is meer bedoeld voor korteafstandscommunicatie tussen IC's aan boord.
  • Betrouwbaarheid: CAN heeft ingebouwde mechanismen voor foutcontrole en -correctie, terwijl I2C dat niet heeft.

I2C versus RS232:

  • RS232 maakt gebruik van 3 draden en ondersteunt slechts twee apparaten (één zender en één ontvanger), terwijl I2C meerdere apparaten ondersteunt met slechts 2 draden.
  • RS-232 is geschikt voor communicatie over lange afstanden.
Protocol Aantal draden Snelheid Complexiteit Stroomverbruik Veelvoorkomende toepassingen
I2C 2 Langzaam Gemiddeld Laag Ingebouwde systemen, sensoren, displays, actuatoren, randapparatuur.
SPI 4 Snel Gemiddeld Gemiddeld Snelle communicatie, geheugenchips.
UART 2 Langzaam Laag Laag Asynchrone communicatie, seriële communicatie over lange afstanden.
KAN 2 Snel Gemiddeld Gemiddeld Toepassingen in de automobielindustrie en de industrie.
RS-232 3 Langzaam Gemiddeld Gemiddeld Computers, printers, modems.

Conclusie

I2C is een onmisbaar communicatieprotocol dat zich al tientallen jaren bewezen heeft in de elektronicawereld. Door zijn eenvoud en de mogelijkheid om meerdere apparaten met slechts twee lijnen aan te sluiten, is het een populaire keuze voor veel toepassingen. Maar zoals elk protocol heeft het zijn beperkingen en is het niet voor alle scenario's ideaal. Bij het ontwerpen van een systeem moet men de specifieke behoeften van de toepassing evalueren en het communicatieprotocol kiezen dat het beste bij die behoeften past.