Waarom de Inter-Integrated Circuit-bus (I2C) het aansluiten van IC's zo gemakkelijk maakt en hoe het te gebruiken.

Door Art Pini

Bijgedragen door De Noord-Amerikaanse redacteurs van DigiKey

Communicatie en controle tussen geïntegreerde schakelingen met behulp van een parallelle bus op een printplaat (pc-board) is niet praktisch. Zelfs een 8-bits processor zou 16 regels nodig hebben voor data en nog veel meer voor een adresbus. Het is nog problematischer als meerdere IC's op een gedeelde communicatiebus moeten zitten. Er is niet genoeg ruimte voor al die printplaatsporen. De oplossing is om IC's te koppelen met behulp van een seriële communicatiebus zoals de Inter-Integrated Circuit (I2C) bus, een tweedraads seriële bus die dit probleem oplost.

Dit artikel beschrijft de oorsprong van de I2C-bus en hoe deze werkt om een efficiënte seriële verbinding tussen de IC's tot stand te brengen. Vervolgens wordt besproken hoe de I2C-bus fysiek wordt geïmplementeerd, de protocolstructuur en de gangbare toepassingen van deze alomtegenwoordige communicatiebus. Voorbeeld I2C-interfaces en oplossingen van Microchip Technology zullen worden gebruikt voor demonstratiedoeleinden. Het artikel gaat ook in op de I2C-overeenkomsten en -verschillen met de System Management Bus (SMBus).

Wat is de I2C-bus?

De I2C-bus is ontwikkeld door Phillips Semiconductors, nu NXP Semiconductors, in het begin van de jaren '80 als een eenvoudige bidirectionele, tweedraadse bus voor efficiënte communicatie en controle van geïntegreerde schakelingen op een gemeenschappelijke pc-kaart. De eerste specificatie werd voltooid in 1992 en de bus is sindsdien een de facto standaard geworden die wordt aangeboden in componenten van meer dan 50 IC-fabrikanten. Deze grote inzet maakt een systeembenadering van het ontwerp mogelijk waarbij IC's gemakkelijk kunnen worden opgenomen in de I2C-busstructuur zonder dat er een aangepast ontwerp nodig is. Verschillende andere gespecialiseerde bussen zoals de SMBus en de Power Management Bus (PMBus) delen samen met enkele andere de basisarchitectuur.

De I2C-bus kan meerdere IC's en sensors koppelen omdat het een adresseerbare bus is; een zeven- of tien-bits adresveld maakt het mogelijk om berichten naar een geselecteerd apparaat te sturen door het masterapparaat. De oorspronkelijke I2C had een maximale kloksnelheid van 100 kilohertz (kHz), maar door de jaren heen hebben de hogere snelheidsmodi die limiet naar 3,4 megahertz (MHz) geduwd.

De I2C-bus maakt gebruik van twee draden, aangeduid als seriële datalijn, of SDA, en seriële kloklijn, of SCL. SDA en SCL zijn open afvoer-/verzamelleidingen in twee richtingen en zijn via een stroombron of een pullupweerstand verbonden met de positieve vermogensbus. Er kunnen meerdere apparaten op de bus worden aangesloten, waarbij het maximale aantal wordt beperkt door de buscapaciteit. Een masterapparaat bestuurt de bus en elk apparaat op de bus heeft een uniek adres. Het masterapparaat kan zowel verzenden als ontvangen via de bus (Afbeelding 1). I2C ondersteunt multi-masterbediening met botsingsdetectie en arbitrage om te voorkomen dat twee of meer masterapparaten tegelijkertijd de gegevensoverdracht in gang zetten. Dit artikel zal zich echter richten op enkelvoudige masterconfiguraties.

Schema van een printplaatdemonstratie van Microchip Technology (klik om te vergroten)Afbeelding 1: Schema van een printplaatdemonstratie van Microchip Technology dat de I2C-bus implementeert en verbindt met vijf verschillende apparaten. Het masterapparaat is uitgeschakeld via connector P1. De SCL- en SDA-lijnen zijn in het groen omlijnd en de twee pullupweerstanden zijn in het blauw omcirkeld. (Bron afbeelding: Microchip Technology)

Afbeelding 1 toont het schema van een PKSERIAL-I2C1 I2C-printplaatdemonstratie van Microchip Technology. Deze printplaat implementeert de I2C-bus met behulp van vijf verschillende apparaten, waaronder een EEPROM, een temperatuursensor, een 12-bits analoog-digitaalconvertor (ADC), een 10-bits digitaal-analoog-convertor (DAC), en een 8-bits serieel-parallelconvertor. Het masterapparaat staat niet op de printplaat en wordt aangesloten via connector P1. De SDA- en SCL-buslijnen zijn in het groen omlijnd en de pullupweerstanden zijn in het blauw omcirkeld.

De SDA- en SCL-niveaus zijn over het algemeen een vast percentage van de positieve voedingsspanning, meestal aangeduid als VDD. De referentieniveaus zijn vastgesteld op 70% en 30% van VDD voor respectievelijk de logica "1" (hoog) en de logica "0" (laag).

Kloksignalen komen in bursts voor met één klok voor elke overgedragen databit. De gegevens op de SDA-lijn moeten geldig zijn als de klok hoog staat. De gegevens kunnen alleen worden gewijzigd als de klok laag staat.

Vanuit het oogpunt van een ontwerper worden nieuwe projecten vereenvoudigd omdat de I2C-interfaces in de IC's zijn geïntegreerd en er geen noodzaak is om een interface te ontwerpen. Elk apparaat wordt eenvoudigweg rechtstreeks op de bus aangesloten. IC's kunnen worden toegevoegd of verwijderd van de bus zonder de andere circuits te beïnvloeden (ervan uitgaande dat het aantal IC's in totaal niet de capaciteitslimiet duwt). De eenvoudige tweedraadsbus minimaliseert het aantal pinnen op elk IC en het aantal runs op de pc-print.

Het I2C-protocol

De bus is 8-bits georiënteerd en communiceert in bytes. Zoals gezegd was de oorspronkelijke maximale kloksnelheid 100 kHz in wat nu de standaardmodus wordt genoemd. De bus ondersteunt nu 400 kilobits per seconde (kbits/s) in de Fast Mode, tot 1 megabit per seconde (Mbit/s) in de Fast Mode Plus, en tot 3,4 Mbits/s in de High Speed Mode (Hs-Mode).

Het I2C-protocol wordt het best geïllustreerd door te kijken naar een typische transfer op de bus (Afbeelding 2). De bron van het schermbeeld is een Teledyne LeCroy-oscilloscoop met een lage snelheid seriële gegevenstrigger en WS4KHD-EMB TDdecodeeroptie. Deze oscilloscoopoptie kan tot 19 seriële data-interfaces met lage snelheid, inclusief I2C, triggeren en decoderen.

Afbeelding van een typisch I2C-datapakket (klik om te vergroten)Afbeelding 2: Een typisch I2C-datapakket bestaande uit een startbit, een adresveld, een bevestigingsbit, 17 databytes met elk een eigen ACK-bit en ten slotte een stopbit. Elk veld wordt geïdentificeerd door een kleurgecodeerde overlay. Het bovenste (gele) spoor is het hele SDA-pakket, daaronder zit de SCL-klok (rood). De derde en vierde sporen zijn horizontaal uitgebouwde aanzichten van beide signalen. (Bron afbeelding: DigiKey)

De oscilloscoop kan op specifieke seriële gebeurtenissen triggeren, waaronder start, stop, ontbrekende bevestiging (ACK), adres, gegevens, adres plus gegevens, framelengte en EEPROM-datatatransmissie. De protocolelementen van de seriële datastandaard worden geïdentificeerd door een kleurgecodeerde overlay. Elk protocolveld wordt gedecodeerd in binair, hex of ASCII met de geselecteerde code in de overlay.

Het SDA-signaal verschijnt als een geel spoor, terwijl het SCL-signaal als een rood spoor wordt weergegeven. Het grijze overlay geeft de start- en stopfuncties aan. De steenrode overlay markeert adresgegevens, het blauwe veld zijn de pakketgegevens en de olijfkleurige overlayboxes markeren de ACK-functies.

Het bovenste spoor toont het hele I2C SDA-pakket van begin tot eind. Direct daaronder bevindt zich het bijbehorende SCL-signaal. Het derde spoor naar beneden is een tijdsuitgebreid zoomspoor van het SDA-signaal, en daaronder ligt het synchrone SCL-signaal.

Zowel de SDA- als de SCL-lijnen rusten in de hoge staat tussen de transfers wanneer de bus vrij is. Het SCL-signaal bestaat uit uit uitbarstingen van negen pulsen met de kloksnelheid, één voor elke databit die wordt overgedragen en één extra voor de ACK-bit.

Alle bustransacties beginnen met een mastergegenereerde startbit die in het ingezoomde SDA-spoor wordt aangegeven als een grijskleurige overlaybox. Het begin wordt aangegeven door de master die de SDA-lijn laag trekt terwijl de SCL-lijn in een hoge staat is. Zodra de master het startbit uitbrengt, wordt de bus als bezet beschouwd. De master kan meerdere starts uitgeven, een situatie waarin de volgende starts vaak herstarten worden genoemd.

Alle gegevensoverdrachten zijn 8 bits (een byte) lang, elk gevolgd door een ACK-bit. Bits worden met het meest significante bit (MSB) als eerste verzonden. Elke byte-overdracht moet worden erkend. Als het slave-apparaat bezig is en geen gegevens kan ontvangen of verzenden, kan het de SCL-lijn laag trekken. Dit dwingt het masterapparaat in een wachttoestand totdat het slave-apparaat de SCL-lijn vrijgeeft.

De ACK-bit wordt gevormd nadat het zendapparaat de SDA-lijn vrijgeeft voordat de negende klokpuls wordt bevestigd. Als het ontvangende apparaat de databyte heeft ontvangen, trekt het de SDA-lijn laag. In de zoomweergave van de SDA in Afbeelding 2 is er een smalle piek vlak voor de negende klokpuls, dat is de SDA-lijn die wordt vrijgegeven om terug te keren naar de hoge staat. De ontvanger trekt de SDA-lijn naar beneden die het ACK-signaal genereert, dat symbolisch wordt gemarkeerd door de olijfkleurige overlaybox. Als de ontvanger de SDA-lijn niet voor de negende klokpuls naar beneden trekt, is het een niet bevestigende (NACK) reactie. Als er een NACK optreedt, kan de master ofwel een stopsignaal genereren en de overdracht afbreken, ofwel een herhaalde start maken om het opnieuw te proberen.

Onmiddellijk na de startvoorwaarde wordt een slave-adres afgegeven. Dit wordt aangegeven door een steenrode overlaybox. Er zijn twee mogelijke adresformaten; 7 bit of 10 bit, waarbij het 7-bits adres het meest voorkomt. De eerste 7 bits na de start staan voor de adresgegevens. De 8e bit geeft de datarichting aan - ofwel lezen ofwel schrijven. Een schrijven wordt aangegeven doordat de SDA-regel in een lage staat is, terwijl het feit dat de SDA-regel op dit moment hoog is, duidt op een leesoperatie. De 10-bits adressering gebruikt de eerste twee bytes na de startvoorwaarde. I2C reserveert verschillende adressen voor interne functies. De decodeeradresgegevens verschijnen in het adresoverlaybox in binair, hex of ASCII-formaat.

De blauwe overlayvelden markeren de gegevensoverdrachten. Elk daarvan is acht bits lang en wordt gevolgd door een ACK/NACK-reactie. Het aantal databytes in een I2C-pakket is onbeperkt, maar Afbeelding 2 bevat 17. De gedecodeerde gegevens verschijnen, net als de adresdecodering, in de data-overlaybox. De datastroom wordt gevolgd door een mastergegenereerde stopbit aan het einde van de datatransfer, aangegeven door een grijze overlaybox in het bovenste datatraject. De stopbit is een lage-naar-hoge overgang op de SDA-lijn terwijl de SCL-lijn in hoge staat is. Na het stopsignaal is de bus weer vrij.

De tabel onderaan het scherm geeft een samenvatting van alle informatie over het betreffende gegevenspakket, inclusief de tijd sinds de activering, de adreslengte, de lees- of schrijfbewerking, de pakketlengte en een samenvatting van de gegevensinhoud. Het aantal items in de tabel komt overeen met het aantal I2C-pakketten dat door de scoop is verworven, wat in dit geval slechts een enkele regel is.

Als er een protocolfout optreedt, wordt dit aangegeven door een fel rood vakje achter de andere protocollaire vakken.

I2C-apparaten

Een van de grootste voordelen van de I2C-bus is het extreem grote aantal apparaten dat in het ontwerp is verwerkt. De demokaart van Microchip Technology geeft enkele voorbeelden van de typen IC's waarin de I2C-bus of een van de afgeleiden daarvan, zoals de SMBus, is verwerkt.

De PIC16F677 van de Microchip Technology is een 8-bits microcontroller die in veel embedded ontwerpen wordt gebruikt. Het implementeert een Synchrone Seriële Poort die kan worden bestuurd om te communiceren met ofwel de seriële randapparatuur interface (SPI) of I2C naar andere controllers of randapparatuur (Afbeelding 3).

Diagram van de PIC16F677 8-bit microcontroller van Microchip TechnologyAfbeelding 3: De PIC16F677 van Microchip Technology is een 8-bit microcontroller die een Synchrone Seriële Poort (in oranje omlijnd) bevat die geprogrammeerd kan worden als een SPI- of een I2C-bus. (Bron afbeelding: Microchip Technology)

Deze microcontroller ondersteunt zowel de master- als de slave-modus van I2C met behulp van 7- of 10-bits adressering. Het gebruikt de SCK/SCL pin voor het I2C SCL-kloksignaal en de SDI/SDA-pin voor het datasignaal.

Deze twee pinnen zijn verbonden met de SCL- en SDA-lijnen op de I2C-bus om communicatie met andere apparaten mogelijk te maken. Een gebruikelijke aansluiting is op een I2C-gebaseerde sensor, zoals de TCN75AVOA713 twee-draads seriële temperatuursensor van Microchip Technology (Afbeelding 4).

Diagram van de temperatuursensor TCN75A van Microchip TechnologyAfbeelding 4: De temperatuursensor TCN75A van Microchip Technology is rechtstreeks aangesloten op de PIC16F677-microcontroller om de temperatuurgegevens te communiceren. (Bron afbeelding: Microchip Technology)

Met de seriële communicatiemogelijkheden heeft deze temperatuursensor de functionaliteit verhoogd. De interne, door de gebruiker te programmeren registers kunnen worden gebruikt om de resolutie van de temperatuurmeting en de energiebesparende uitschakelmodus in te stellen en zelfs de alarmuitgang aan te geven wanneer het temperatuurbereik de vooraf ingestelde limieten overschrijdt.

Er zijn ook een aantal apparaten die de I2C seriële datastroom decoderen en in parallelle data uitbouwen. Overweeg de MIC74YQS-TR 2-draads I/O-expander en ventilatorcontroller van Microchip Technology (Afbeelding 5).

Diagram van de  MIC74YQS-TR I/O-expander van Microchip TechnologyAfbeelding 5: De MIC74YQS-TR I/O-expander van Microchip Technology zet de seriële datastroom om in acht onafhankelijke parallelle I/O lijnen. (Bron afbeelding: Microchip Technology)

Dit IC is een volledig programmeerbare I/O-expander met acht onafhankelijke I/O-lijnen. De I/O-lijnen kunnen individueel worden geprogrammeerd als een ingang of een uitgang. Afbeelding 5 toont de MIC74YQS-TR die acht LED's aanstuurt onder de besturing van de seriële bus. Dit is vergelijkbaar met het gebruik van de MCO23008 op de I2C-demokaart in Afbeelding 1. De MIC74YQS-TR kan, in combinatie met een vermogensregelaar, ook de snelheid van de ventilatormotor regelen met behulp van de vier belangrijkste bits.

SMBus en I2C

De seriële ingang van de I/O-expander is ontworpen voor de SMBus, maar is ook compatibel met de I2C-bus. De SMBus-specificatie is gebaseerd op I2C en werd in 1994 door Intel en Duracell gedefinieerd. Het belangrijkste verschil is dat de logische niveaus van standaardmodus I2C relatief zijn ten opzichte van VDD en die van SMBus vast zijn. In de meeste gevallen, met VDD tussen 3 en 5 volt, heeft de ervaring geleerd dat dit geen probleem is.

Een ander verschil is dat SMBus beperkt is tot kloksnelheden van 100 kHz of minder, terwijl I2C verschillende modi heeft die hogere kloksnelheden ondersteunen. Wanneer het gaat om buscompatibiliteit, beperkt dit de maximale kloksnelheid tot 100 kHz of de I2C-standaardklokmodus.

Dus, behalve in zeer speciale situaties, zijn SMBus en I2C compatibel.

Conclusie

De I2C-bus en zijn afgeleiden zijn alomtegenwoordig in honderden IC's van alle soorten, waardoor ze gemakkelijk te verbinden zijn in veelzijdige ontwerpen en toepassingen. Het koppelen van gemengde signaal- en analoge sensoren breidt de reikwijdte van op microcontrollers gebaseerde embedded systemen uit. Dit alles via een eenvoudige, tweedraads seriële digitale interface.

DigiKey logo

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.

Achtergrondinformatie over deze auteur

Image of Art Pini

Art Pini

Arthur (Art) Pini is een verdienstelijke auteur bij DigiKey. Hij behaalde een Bachelor-diploma in Elektrotechniek bij het City College van New York en een Master-diploma in Elektrotechniek bij de City University van New York. Hij heeft meer dan 50 jaar ervaring in elektronica en vervulde belangrijke technische en marketingfuncties bij Teledyne LeCroy, Summation, Wavetek en Nicolet Scientific. Hij is geïnteresseerd in meettechnologie en heeft heel veel ervaring met oscilloscopen, spectrumanalysators, arbitraire golfvormgenerators, digitizers en vermogenmeters.

Over deze uitgever

De Noord-Amerikaanse redacteurs van DigiKey