Beschreibung
I2C steht für Inter Integrated Circuit, ist ein Protokoll für die Kommunikation zwischen zwei ICs an Bordprotokoll. Es ist ein serielles, zwei Drahtprotokoll. Dies folgt dem Master -Sklavenmodus. I2C Master initiiert immer die Kommunikation und Uhr für die Kommunikation, die auch von I2C Master bereitgestellt wird. In zwei Zeilen können mehrere Geräte angeschlossen sein. Bei Single Master und vielen Sklavenkonfiguration wird jeder Sklave mit einer einzigartigen Sklavenadresse unterschieden.
Beispielkonfiguration von einzelnen Master und mehreren Sklaven:
Im obigen Blockdiagramm können wir sehen, dass ein einzelner Master und 3 Sklaven mit Adressen vorhanden sind.
I2C -Protokoll
Die in der Kommunikation zwischen Master und Slave verwendete allgemeine I2C -Nachrichtensequenz ist unten gezeigt:
Start -> Adresse + R/W Byte -> ACK -> Daten Byte1 -> ACK -> Daten Byte2 -> ACK -> Daten Byte3 -> ACK -> STOP
Start: Zustand, der vom Meister erzeugt wird, um anzuzeigen, dass er mit dem Sklaven kommunizieren möchte.
Adresse + R/W -Byte: 7-Bit-Sklavenadresse und 1 Bit, um anzuzeigen, ob die Operation gelesen oder schreiben wird.
Ack: Für jede Byte -Übertragung wird immer eine Bestätigung gesendet. Dies wird vom Empfangsgerät gesendet.
Stoppen: Sobald die Übertragung abgeschlossen ist, sendet Controller/Master die Stoppbedingung, um die Übertragung abzuschließen.
In Linux sind I2C -Treiber in drei logische Schichten organisiert:
I2C Master/Adapter -Treiber
Diese befinden sich im Kernel -Quellbaum am Pfad: Treiber/ I2C/ Busse/. Für jeden I2C -Master oder jeder Controller sollte ein Treiber auf diesem Weg vorhanden sein. Dies ist der Treiber, der sich in die I2C-Core-Ebene registriert und die I2C-Käufer steuert/verwaltet. Dies ist der Fahrer, der mit den I2C -Slave -Geräten über I2C -Busse kommuniziert, die auf der Plattform vorhanden sind.
I2C-Core-Treiber
Dies ist die übliche I2C -Kernlogik von Linux. Dies ist üblich und unabhängig von einem bestimmten i2C -Meister oder Sklaven. Dies ist die Kernimplementierung des I2C -Subsystems unter Linux.
I2C Slave/Client -Treiber
Dies ist der Slave -Chip -Treiber, der für jedes Sklavengerät benötigt wird. Jedes I2C -Slave -Gerät sollte in dieser Kategorie Treiber oder Implementierung vorhanden sein. Dies ist erforderlich, damit sich jedes Slave -Gerät beim Linux I2C -Subsystem registriert.
Aktivieren der I2C -Treiber im Linux -Kernel
I2C Core -verwandte Implementierung wird mit i2c Core -Kernel -Konfigurationsflags aktiviert. Der I2C -Master -Treiber wird auch mit dem spezifischen Board I2C Controller aktiviert. Ebenso sollte ein Konfigurationsflag für den I2C -Slave -Treiber aktiviert sein.
Alle erforderlichen Konfigurationen können auf zwei Arten aktiviert werden. Einer als eingebauter Fahrer oder als Kernelmodul. Kernelmodule bieten uns den Vorteil, es als Laufzeit zu laden, ohne den Linux -Kernel zu ändern oder zu kompilieren.
Der Modulansatz kann nur verwendet werden, wenn der Gerätezugriff nicht Teil des Startwegs ist. Wenn die Daten eines Geräts für das Booten des Systems benötigt werden, müssen diese Treiber integriert werden. Solche Treiber können zur Laufzeit nicht als dynamisch geladene Module kompiliert werden.
Instanzipieren der I2C -Geräte
Unter Linux sind unterschiedliche Wege vorhanden, um die I2C -Geräte zu instanziieren. Zwei weit verbreitete Methoden sind: statisch und dynamisch
Statisch: Auf ARM -Systemen kann der Gerätebaum verwendet werden, um eine Instanz des I2C -Geräts zu erstellen.
Der spezifische Geräteknoten kann im Gerätebaum hinzugefügt werden. Beispiel: Die Deklaration von Gerätebäumen für I2C -Geräte lautet:
I2C0: I2C@60000000
eeprom@50
kompatibel = "Atmel, eeprom-at";
Reg = <0x50>;
;
RTC@60
kompatibel = "RTC, RTC-Maxim";
Reg = <0x60>;
;
;
Das obige Beispiel erstellt eine Instanz von 2 I2C -Sklavengeräten. Einer ist EEPROM -Gerät und ein anderer ist RTC -Gerät. Nach dem Auftauchen des Systems können diese Einträge in/sys/bus/i2c/devices/i2c-0/gefunden werden. Beide werden im I2C-0-Verzeichnis erstellt, da diese im I2C-Knoten 0 platziert sind.
Dynamisch: Laufzeitinstanz des I2C -Geräts kann über SYSFS -Dateien erstellt werden.
Für jeden I2C -Bus sind zwei SYSFS -Dateien vorhanden. NEW_DEVICE und DELETE_DEVICE, beide Dateien sind nur Schreib- und I2C-Slave-Adresse können auf diese Dateien geschrieben werden, um die Geräteinstanz zu erstellen und Geräteinstanzen zu löschen.
So erstellen.
Erstellen Sie die EEPROM -Instanz mit Slave -Adresse 0x50:
# echo eeprom 0x50>/sys/bus/i2c/devices/i2c-0/new_device
Löschen der EEPROM -Geräteinstanz:
# echo 0x50>/sys/bus/i2c/devices/i2c-0/delete_device
Als nächstes kann die Prüfung des Geräts mit dem Treiber auch aus SYSFS-Dateien erfolgen. Exportieren der Geräte -ID in die Bind- und Unbind -Dateien resultieren zum Verknüpfen und Abnehmen des Treibers mit dem Gerät. Zum Beispiel hat Treiber RTC-DS1307 die folgenden Dateien in den SYSFs, wie zuvor erläutert.
[root] $ ls/sys/bus/i2c/treiber/rtc-ds1307/
Binden Sie uevent ungebind
[Root] $
Lassen Sie uns ein wenig mehr über die SYSFS -Dateien des I2C -Subsystems diskutieren:
I2C SYSFS ist am Ort vorhanden:/sys/bus/i2c/
Schnappschuss des I2C -SYSFS:
Wie wir sehen können, gibt es zwei Verzeichnisse: Geräte und Treiber
Geräte enthalten alle vorhandenen und dem Linux -Kernel bekannten Geräteinstanzen. In unserem Vorstand haben wir unter i2C -Geräten im Verzeichnis der Geräte:
Die Fahrer enthalten alle vorhandenen und dem Linux -Kernel bekannten I2C -Treiber. In unserem Vorstand haben wir unter i2C -Treiber im Verzeichnis der Fahrer:
Für die Bindung und Entbindung der Geräte mit Treibern sind in jedem Treiber zwei nur Schreibdateien vorhanden. Für die Verknüpfung eines jeden Geräts mit dem Treiber kann durch die Echo der Geräte -ID an die Binddatei erfolgen und das Verenden erfolgen.
Bindung des I2C -Geräts mit I2C -Treiber
[Root] $ echo 1-0068>/sys/bus/i2c/treiber/rtc-ds1307/bindend
[592061.085104] RTC-DS1307 1-0068: registriert als RTC0
[Root] $
Die Bestätigung der erfolgreichen Bindung kann durchgeführt werden, indem die nach dem Bindungsvorgang erstellte Soft Link überprüft wird. Ein neuer Geräte -Soft -Link ist in der folgenden Protokollinstanz zu sehen, nachdem der im Abschnitt Bindungsabschnitt erwähnte Befehl ausgeführt wurde:
[root] $ ls/sys/bus/i2c/treiber/rtc-ds1307/
1-0068 binden uevent unbind
[Root] $
Entbindung des I2C -Geräts mit dem I2C -Treiber
[Root] $ echo 1-0068>/sys/bus/i2c/treiber/rtc-ds1307/ungebind
Die Bestätigung des erfolgreichen Entbindens kann durchgeführt werden, indem der zuvor im Verzeichnis der Treiber erstellte Soft Link -Geräteknoten überprüft wird, wird entfernt. Wenn wir den Inhalt des Verzeichnisses der Treiber überprüfen, sollten wir den Snapshot der Protokolle wie unten sehen:
[Root] $ ls/sys/bus/i2c/treiber/rtc-ds1307
Binden Sie uevent ungebind
[Root] $
I2C -Anwendungen oder Anwendungsfälle in Bezug auf Linux
I2C-Tools
Benutzerraumanwendungen in der Linux -Umgebung werden zum Zugriff auf I2C -Slave -Geräte verwendet. I2CDETECT, I2CGET, I2CSET, I2CDUMP und I2Ctransfer sind die Befehle, die verfügbar sind, wenn I2C-Tools auf jeder Linux-Plattform installiert sind. Alle in den Abschnitten i2C -Anwendungen diskutierten Anwendungsfälle der Geräte können über diese Tools zugegriffen werden.
Wenn Sie versuchen, mit I2C-Tools auf das Slave-Gerät zuzugreifen. Mit diesen Tools können wir auf die Geräte im RAW -Format zugreifen. Weitere Details zu diesen Dienstprogrammen finden Sie in einem anderen Artikel.
Abschluss
Wir haben das I2C -Subsystem unter Linux besprochen. I2C Framework mit logischer Code -Organisationsübersicht wurde gegeben. Wir haben auch über I2C -SYSFS -Dateien besprochen. Wir haben die I2C -Kommunikationsnachrichtensequenz besprochen. Wir haben die Geräteinstanz -Erstellung in beiden Arten durchlaufen, ich.e., statisch und dynamisch. Wir haben auch die Bind/Unbind -Treiber mit Geräten untersucht. Einige der I2C -Echtzeitanwendungen.