01 Zuerst das Konzept.
I2C steht für Inter-Integrated Circuit und bedeutet wörtlich zwischen integrierten Schaltungen, was wir oft als I-C-Bus bezeichnen.Es handelt sich um einen seriellen Kommunikationsbus mit einer Multimaster-Architektur, der in den 80er Jahren von Philips, der Muttergesellschaft von NXP, entwickelt wurde, um Motherboards und Embedded-Systeme zur Verbindung von Peripheriegeräten mit niedriger Geschwindigkeit zu verwenden.
I2C besteht aus zwei bidirektionalen Öffnungsleitungen, was ein großer Vorteil ist, dass die Verkabelung einfach ist.Beide Leitungen nutzen den Aufzugswiderstand, um das Potential zu erhöhen.Typisches Potential ist +3,3V oder +5V.Die Standardübertragungsgeschwindigkeit beträgt 100 Kb/s und im Low-Speed-Modus 10 Kb/s.
02 Physische Schicht
In der folgenden Abbildung ist die physische Topologie des I2C-Busses dargestellt, und man kann sehen, dass es insgesamt nur zwei Busse gibt, eine SDA-Datenleitung (serielle Datenleitung), die Daten trägt, und eine SCL-Taktlinie (serielle Taktlinie), die die Zeitreihenfolge der Datensendung steuert.Die SDA aller I2C-Geräte wird auf dem SDA des Buses empfangen und die SCL auf dem SCL des Buses.Jedes Gerät hat seine eigene eindeutige Adresse, um die Genauigkeit des Zugriffs zwischen den Geräten zu gewährleisten.

Die Verbindung von I2C auf der physischen Ebene ist wahrscheinlich sehr einfach, und das ist der größte Vorteil, der besteht darin, dass das Signal, das für das I2C-Busprotokoll erforderlich ist, für die Datenübertragung erzeugt wird, indem die hohe und niedrige Zeitreihenfolge der SDA- und SCL-Leitungen gesteuert wird.SCL und SDA werden durch den Aufzugswiderstand hochgezogen, um ein hohes Niveau zu halten, wenn der Bus im Leerlaub ist.
Es ist wichtig zu beachten, dass die Kommunikationsmethode von I2C semi-duplex ist, da es nur eine Datenleitung gibt, die zu einem bestimmten Zeitpunkt nur in eine Richtung kommunizieren kann.Dies deutet auch darauf hin, dass I2C nicht für große Datenmengen geeignet ist.
Die Unterscheidung zwischen dem Host und der Maschine ist einfach, der Hauptbefehl ist der Host, der den Befehl von der Maschine empfängt, und der gleiche I2C-Bus erlaubt die Existenz mehrerer Hosts.
03 Protokoll-Ebene
Als Grundlage lernen wir zunächst einige wichtige kleine Konzepte kennen.
1,Anfangszustand (d.h. Leerlaufzustand): SDA und SCL sind der Anfangszustand, wenn die hohen Werte durch den Aufzugswiderstand verursacht werden;
2,Signal startenWenn der SCL hoch ist, wird der SDA niedergezogen, was ein Startsignal ist, das darauf hindeutet, dass die Kommunikation begonnen hat.
3 undSignal beendenWenn der SCL hoch ist, wird der SDA hochgezogen, ein Endsignal, das darauf hindeutet, dass die Kommunikation beendet ist.

Haben alle hier etwas gefunden?Wenn das SCL auf einem hohen Niveau liegt, ist das SDA-Niveau ein Signal, wenn sich das SDA-Niveau ändert, entweder ein Beginn oder ein Ende.Deshalb istWährend der Datenübertragung,Wenn das SCL auf einem hohen Niveau liegt, muss das SDA stabil bleiben und kann sich nur ändern, wenn das SCL auf einem niedrigen Niveau liegt.
4 undAntwort auf SignaleNachdem der Sender ein Byte / 8 Bit an den Empfänger gesendet hat, muss der Empfänger im neunten Taktzyklus dem Sender ein Antwortsignal geben, damit die Daten erfolgreich übertragen werden.Hohe Ebene nicht beantworten, niedrige Ebene beantworten.


Nachdem wir diese Signalzustande verstehen, sehen wir Schritt für Schritt, wie die Daten übertragen werden.
Schreiben Sie ein Byte von Daten in ein Register des Geräts von der Maschine: Startsignal + Geräteadresse (7 Bit) + Lesen / Schreiben (1 Bit) + Warten auf Antwort von der Maschine + Registeradresse (8 Bit) + Warten auf Antwort von der Maschine + Daten zu schreiben (8 Bit) + Warten auf Antwort von der Maschine + Endsignal.Die folgende Abbildung zeigt ein Zeitschema für das Schreiben von Daten im 24C02 EEPROM-Speicher.

2, schreiben Sie, dass wir gesehen haben, das Lesen eines Versuches: Die folgende Abbildung ist das Lesen von 24C02 aktuelle Adresse ein Byte Datenreihendiagramm, ist nicht auf einen Blick klar.Es ist wichtig zu beachten, dass das Lese- und Schreibstatusbit nach 7 Bits der Adresse 1 ist, wenn es gelesen wird.Hier wird erwähnt, warum es am Ende KEIN ACK ist, während der Host der Empfänger ist und der KEIN ACK des Hosts bedeutet, dass der Empfang von Daten von 24C02 aufgehört hat, sonst wird 24C02 weitersenden.

3, lesen wir noch ein bisschen länger: Das folgende Diagramm ist ein Zeitdiagramm, das ein Byte Daten einer beliebigen Adresse 24C02 liest.Startsignal + Geräteadresse (7 Bit) + Schreiben (1 Bit) + Warten auf eine Antwort von der Maschine + Datenadresse (8 Bit) + Warten auf eine Antwort von der Maschine.Der vorherige Schritt ist eine Hypothese und soll 24C02 sagen, welche Adresse zu lesen ist.Weiter starten Sie mit dem Startsignal + der Geräteadresse (7 Bit) + dem Lesen (1 Bit) + dem Warten auf eine Antwort von der Maschine + den gelesenen Daten (8 Bit) + dem Warten auf eine Antwort des Hosts (Empfängers) + dem Beendigungssignal.

04 Trockenfüllung
1,Adresse des GerätsDie Adresse eines I2C-Geräts ist 8 Bits, aber das letzte Bit gehört nicht zur Adresse, sondern zum Lese- oder Schreibstatusbit.Das ist der Grund, warum die SH1106-Curry von Arduino die Adresse nicht 0x7- sondern 0x3- bedient, da die ersten 7 Bits nützlich sind und die Adresse insgesamt um ein Bit rechts verschoben wird.Die ersten vier Stellen einer anderen Geräteadresse sind fest tot, die vom Hersteller verwendet werden, um den Gerätetyp anzugeben, z. B. die ersten vier Stellen der Geräteadresse für Temperatursensoren mit Schnittstelle I2C sind in der Regel 1001 oder 9X, die ersten vier Stellen der EEPROM-Speicheradresse sind in der Regel 1010 oder AX, die ersten vier Stellen der OLED-Bildschirmadresse sind in der Regel 0111 oder 7X usw.
2,Der letzte Nachteil der I2C-Schnittstelle ist, dass die Übertragungsdistanz fast gleichzeitig langsam ist. .Denken Sie daran, wenn Sie die I2C-Bus-Schnittstelle verwenden, nicht lange Leitungen zu übertragen, versuchen Sie, nur in der Leiterplatte zu übertragen, sonst können Sie gelegentlich Daten verlieren oder sogar Daten nicht lesen, die Menschen zusammenbrechen, fragen Sie mich nicht, wie ich das weiß, fragen Sie nur Tränen.
3 undWarum zwei Leitungen als Öffnungen konzipiert sindIch erinnere mich an diese Frage, die ich Ihnen beim Schreiben von „8 Arbeitsmodi für STM32 Single-Chip-I / O“ beigelegt habe.Erzählen Sie heute den konkreten Grund.Hauptsächlich gibt es zwei Punkte, um einen Kurzschluss zu verhindern: Denken Sie daran, wenn Sie nicht als Öffnung eingestellt haben, sondern als Schub eingestellt haben, mehrere Geräte auf dem gleichen Bus angeschlossen sind, dann ist ein bestimmtes Gerät mit einem hohen IO-Ausgang, ein anderes Gerät mit einem bestimmten IO-Ausgang mit einem niedrigen Niveau, dann finden Sie diese beiden IOs VCC und GND Kurzschluss;Allerdings wird das Problem nicht auftreten, wie in der folgenden Abbildung:

Der zweite Grund ist „Linie und“, wir denken an ein Szenario: Wenn ein A-Gerät auf dem Bus den SDA hochzieht, dann hat das andere B-Gerät auf dem Bus den SDA niedrig gezogen, da 1 & 0 = 0, wird das A-Gerät das SDA nicht hoch, sondern niedrig prüfen, was darauf hindeutet, dass andere Geräte auf dem Bus bereits den Bus besetzen.A muss aufgeben, wenn die Erkennung hoch ist, kann sie verwendet werden.Die folgende Abbildung ist ein internes Diagramm des 24C02-Chips, das den Zustandserkennungsfuß zeigt.

05 Zusammenfassung
Der I2C-Bus ist ein gängiges Busprotokoll, das es sehr wert ist, genau nachzudenken, so dass wir später auf Geräte mit beliebigen I2C-Schnittstellen vertrauen können.Ich habe immer das Gefühl, dass im Lernprozess „benutzen“ nicht unbedingt das Ziel ist, das wir verfolgen, aber gleichzeitig etwas tieferes zu verstehen, um unerwartete Freude zu ernten.