Datenaustausch zwischen zwei (oder mehreren) PIC16Fxx-Mikrocontrollern via I²C in C (Elektronik)

(oder: Wie realisiere ich einen I²C-Slave mit einem PIC16Fxx-Mikrocontroller)

zurück zu Elektronik, Homepage


2. I²C-Protokoll

Jede Aktion auf dem I²C-Bus geht vom Master aus. Als Master dient hier ein PIC (z.B. PIC16F887). Die erste Aufgabe des Masters einer jeden Datenübertragung ist das Erzeugen der Startbedingung. Die Startbedingung ist wie folgt definiert: Auf der Datenleitung (SDA) erfolgt eine High-Low-Flanke, während die Taktleitung (SCL) High ist. Damit wird gekennzeichnet, dass auf dem I²C-Bus ein Datenverkehr stattfindet. Würden sich auf dem Bus weitere Master befinden (Multi-Master-Mode) so dürfen diese jetzt keine Datenübertragung zu einem Slave beginnen, da der Bus jetzt belegt ist.
Nun muss der Master die Adresse des Slaves mit welchem er kommunizieren möchte bekannt geben. Zu diesem Zweck besitzt jeder Slave eine Adresse. Diese Adresse besteht in den meisten Fällen aus einem vom Hersteller festgelegtem Bauteilkode und einer Bausteinadresse, welche durch Beschaltung dafür reservierter Anschlüsse wählbar ist. So ist es möglich mehrere gleichartiger Bausteine an einem Bus anzuschließen. (Z.B. mehrere Speicherbausteine oder mehrere Porterweiterungsbausteine.)
Nach der Bauteiladresse (diese besteht in den meisten Fällen aus 7 Bit oder aus 10 Bit) erfolgt als nächstes die Bekanntgabe der Übertragungsrichtung. Möchte der Master (also der PIC) von einem Slave Daten lesen, so erfolgt als Übertragungsrichtung ein Low (0). Möchte der Master (PIC) zu einem Slave Daten (oder Befehle) übertragen, so erfolgt als Übertragungsrichtung ein High (1).
Die Adresse und das Bit welches die Übertragungsrichtung festlegt werden auch als Kontrollbyte bezeichnet.

Nach dem Kontrollbyte muss der Master auf ein Bestätigungsbit vom adressierten Slave warten.

Je nach Slave kann nun entweder ein Datenbyte oder mehrere Datenbytes vom Master zum Slave oder vom Slave zum Master übertragen werden.
Werden Daten vom Master zum Slave übertragen (Schreibvorgang), so muss der Master nach jedem übertragenen Byte auf eine Bestätigung vom Slave warten.
Erfolgt der Datenverkehr in die andere Richtung (vom Slave zum Master, man spricht hier auch von einem Lesevorgang) so muss der Master jedes empfange Byte bestätigen.

Sind alle Daten übertragen, muss der I²C-Bus wieder freigegeben werden. Diese Freigabe erfolgt mit einer Stoppbedingung. Die Stoppbedingung ist wie folgt definiert: Auf der Datenleitung (SDA) erfolgt eine Low-High-Flanke, während die Taktleitung (SCL) High ist. Der I²C-Bus ist nun frei und kann von einem anderen Master zur Datenübertragung benutzt werden.

Das folgende Bild zeigt zur besseren Verdeutlichung nochmals den gesamten Vorgang.

I²C-Protokoll
Achtung:
Das hier beschriebene Protokoll zum I2C-Bus - also das Setzen und das Löschen der Leitungen SDA und SCL muss in der Software nicht nachgebildet werden. Diese Aufgabe übernimmt das Hardwaremodul MSSP des PIC16Fxx-Mikrocontroller. In der Software müssen nur die Steuerbits gesetzt (oder gelöscht) werden und die zu übermittelten Daten bereitgestellt oder abgeholt werden. Mehr dazu in den folgenden Abschnitten.
nach oben


zurück zu Elektronik, Homepage

Autor: Stefan Buchgeher
Erstellt: 31. Juli 2014
Letzte Änderung: