Stap 4: een paar woorden over I²C bus
Korte beschrijving van de bus
De I²C bus is een 8 of 10 bits, bidirectionele seriële communicatieprotocol, met overdrachtsnelheden van 100 KHz, 400 KHz of onlangs 1 MHz (plus voor gebruik met Fast-modus). De bus bestaat uit twee bidirectionele signalen (gewoonlijk genoemd SCL - seriële klok, SDA - seriële data). Deze signalen verbinden met elk apparaat van de I²C in onze schakeling die we communiceren willen met.
Thhe SDA lijn wordt gebruikt voor de overdracht van seriële gegevens, de SCL-regel verzekert dat de communicatie is in sync, in beide richtingen. Naast deze twee moeten ook de I²C meester en de I²C slaven te delen een gemeenschappelijke grond.
De pinnen van de apparaten die zijn aangesloten op een I²C bus zijn open collector, of open-afvoer. Dit betekent, dat zij de drijvende communicatielijn kunnen brengen op de grond, en zij kunnen vrij om te stijgen naar het niveau waarop ze bent trok.
Het is zeer belangrijk om te begrijpen, dat de term 'release' betekent niet dat een '1', het betekent alleen, dat de meester of de slaaf de communicatielijn is niet rijden. Hebben gezegdd dat, moeten we ervoor zorgen, dat de lijn is niet steeds laag zijn, wanneer het is niet verondersteld om. Dit kan worden gedaan door het installeren van een pull-up aan de rail van de macht van het circuit. Wij niet moet (of mag) zetten een pull-up naar elke slaaf in het circuit, dat dat een parallelle aansluiting, die betekenen zou - als teveel weerstanden zijn geïnstalleerd - zou niet toestaan dat de pin om de regel naar beneden.
De waarde van de weerstand gebruikt hoeft te zijn van een bepaalde waarde, meestal een paar k-ohm weerstand zal prima werken.
Het protocol van de I²C is master-slave gebaseerd. Een master beslist wanneer de slave-apparaten communiceren, door middel van enkele gegevens die worden verzonden op de I²C bus. In ons geval moet de PIC worden geconfigureerd als een slaaf, aangezien de Arduino zal de meester in het circuit. Een slaaf is meestal een sensor, een spaander van het geheugen, of om het even wat die vermag de functies van een microcontroller uitbreiden.
Alle transmissie worden getriggerd door de meester, de slaven niet communiceren iets, tenzij de meester vraagt hen om dit te doen. Juiste I²C bus werking wordt ervan uitgegaan, dat een enkele slaaf adres is alleen herkend door een enkele slaaf. Als een slaaf is geselecteerd, mogen alle andere slaven zwijgen.
De kapitein is verantwoordelijk voor alle soorten tijdsinstellingen - in de meeste systemen (single-master) de clock lijn wordt gemanipuleerd alleen door de meester. Dit betekent dat is de snelheid van de transmissie ingegeven door de I²C kapitein van het circuit.
• Wanneer een meester wil een overdracht starten, het voert een reeks start op de I²C bus. Een start-voorwaarde treedt op, wanneer de SDA-lijn op laag niveau gebracht is terwijl de SCL-lijn hoog is.
• Wanneer de meester wil signaal, dat de overdracht voorbij is, het verzendt een stop-voorwaarde, oftewel een stijgende rand op SDA terwijl de SCL hoog is.
• Gegevens wordt verzonden in het tijdsbestek tussen deze twee gebeurtenissen. Voor een data-bit om geldig te zijn, moet de SDA waarde, niet wijzigen terwijl de SCL hoog is. Als dat zo is, de reeks bits is geïnterpreteerd als een stop of conditie, en leidt tot communicatiefouten.
In mijn geval, wordt gegevensoverdracht gedaan in groepen van 8 bits. De gegevens die - na de big endian patroon - is geklokt uit met het meest significante bit eerst. Na elke 8-th-bit krijgt geklokt uit, moet de slaaf signaal terug voor de doorgifte naar een succesvolle gegevensuitwisseling worden beschouwd. Dit signaal wordt genoemd een 'erkennen', waarbij ervan wordt uitgegaan, dat de slaaf brengt de SDA-lijn naar beneden op de 9-th kloksignaal op de SCL-regel.
Zoals ik eerder al noemde, elke slaaf moet een unieke slave-adres hebben. Dit adres slaaf is 7 bits lang, wat betekent dat, dat een totaal van 128 apparaten kan worden aangesloten op de I²C bus, zonder enige vorm van geknoei met het circuit.
Als het gaat om aan te pakken, de kapitein stuurt 8 bits, adres 7 die daarvan de slaaf zijn bits, de laatstgenoemde bepaling of de master wil lezen of schrijven in de apparaten van de interne registers van slaaf. Dit laatste stukje staat bekend als de R/W-bit, een '0' op deze bitfield betekent een schrijven, een '1' op deze bitfield betekent een te lezen.
Bijvoorbeeld als men wenst te schrijven naar een slave-apparaat met een slaaf adres van 0b1010000, moet hij 0b1010000 verzenden nadat de eerste voorwaarde hebt gestart. Als een meester wil lezen van hetzelfde apparaat, moet de eerste byte na de start-voorwaarde 0b10100001. Deze, omgezet in hexadecimale geven 0xA0 en 0xA1. Datasheets geven normaal gesproken het adres van de slaaf in hexadecimale notatie.
In sommige gevallen, kan de fabrikant de gebruiker meer toe te voegen voor dezelfde chip naar de I²C bus: dit wordt bereikt doordat de gebruiker om te bepalen van een aantal slave adres bits. Bijvoorbeeld, heeft een I²C EEPROM meestal de onderste 3 bits van het adres van haar slaaf dat op pennen. Trekken deze hoge betekent een '1' op de corresponderende de slaaf adres byte, betekent trekken ze naar de grond een '0' op die locatie.
Er zijn situaties, waar de meester gewoon te snel is voor de slaaf, het wil lezen sneller, dan de slaaf aankon. Om te voorkomen dat dit soort situaties, kunnen de I²C slave apparaat fabrikanten bouwen in een functie, waarmee de slaaf te trekken van de SCL-lijn laag, terwijl ze bezig zijn het uitvoeren van de opdrachten van de meester. Als de slaaf is klaar met meten, lezing, sensing, etc. - vrijkomen het van de SCL-lijn, waardoor de pull-ups de hoge lijn te volgen. De meester zal niet een andere overdracht, starten, tenzij zij de hoge SCL-lijn ziet. Dit is vaak genoemd 'klok uitrekken'.
Voorbeeld van een START-voorwaarde, gevolgd door een lees opdracht van slaaf 0xA3. De leesbewerking is geldig, we nu dit, uit de ACK (erkennen) signaal door de slaaf.
Ik zoomde in een beetje op het einde van de dezelfde gegevensoverdracht te vangen twee meer signalen, de halte en de NACK. Deze bitpatroon plaatsvindt aan het einde van een lees sequentie.
Helaas heb ik niet kunnen vangen klok uitrekken van fasen, maar als ik zie een tijdens het werken met de PIC I²C, zal ik ervoor te laten zien aan de lezers.
Dus, we net geleerd dit en dat over de seriële communicatieprotocol we, nu laten we gebruiken zullen in actie zien. Eerst laat me presenteren u een voorbeeld van bestuur, een PC hulpmiddel en een microcontroller-programma.