Lesen von I2c-Daten. Kontakte

10.09.2021

Jeder, der an der Entwicklung elektronischer Geräte beteiligt war, ist auf eine Situation gestoßen, in der es zum Koordinieren von Signalpegeln, Abtasten und Ansprechen funktional vollständiger Knoten erforderlich ist, eine große Anzahl von Zwischen-ICs zu verwenden.
Um die Effizienz zu steigern und Schaltungslösungen zu vereinfachen, Philips entwickelte einen einfachen bidirektionalen Zweidrahtbus für die sogenannte „Inter-IC“-Steuerung.
Der Bus erhielt den Namen InterIC oder IIC (I2C) Bus.

Derzeit produziert allein Philips mehr als 150 Arten von I2C-kompatiblen Geräten, die funktional für den Einsatz in elektronischen Geräten konzipiert sind für verschiedene Zwecke. Dazu gehören Speicher-ICs, Videoprozessoren und Audio- und Videosignalverarbeitungsmodule, ADCs und DACs, LCD-Display-Treiber, Prozessoren mit integriertem Hardware-I2C-Bus-Controller und vieles mehr.

Der I2C-Bus ist eine der Modifikationen serieller Datenaustauschprotokolle. Im Standardmodus werden serielle 8-Bit-Daten mit Geschwindigkeiten von bis zu 100 kbit/s übertragen, im „schnellen“ Modus mit bis zu 400 kbit/s. Um den Prozess des Informationsaustauschs auf dem I2C-Bus durchzuführen, werden nur zwei Signale verwendet: Datenleitung SDA-Synchronisationsleitung SCL Um die Umsetzung der Bidirektionalität des Busses ohne den Einsatz komplexer Bus-Arbiter sicherzustellen, werden die Ausgangsstufen der an die angeschlossenen Geräte angeschlossen Der Bus verfügt über einen offenen Drain oder einen offenen Kollektor, um die Montage-„UND“-Funktion bereitzustellen.

Einfacher Zweileiter Serien Bus I2C minimiert die Anzahl der Verbindungen zwischen ICs, die ICs haben weniger Pins und es sind weniger Leiterbahnen erforderlich. Infolge - Leiterplatten werden einfacher und technologisch fortschrittlicher in der Herstellung. Das integrierte I2C-Protokoll macht Adressdecoder und andere externe Aushandlungslogik überflüssig.

Die maximal zulässige Anzahl an an einen Bus angeschlossenen Chips wird durch die maximale Buskapazität von 400 pF begrenzt.

Der in die Chips integrierte Hardware-Rauschunterdrückungsalgorithmus gewährleistet die Datenintegrität unter Bedingungen mit erheblichem Rauschen.
Alle I2C-kompatiblen Geräte verfügen über eine Schnittstelle, die es ihnen ermöglicht, über den Bus miteinander zu kommunizieren, auch wenn ihre Versorgungsspannung deutlich unterschiedlich ist. Die folgende Abbildung zeigt das Prinzip des Anschlusses mehrerer ICs mit unterschiedlichen Versorgungsspannungen an einen Austauschbus.

Jedes Gerät wird über eine eindeutige Adresse erkannt und kann je nach Verwendungszweck des Geräts als Sender oder Empfänger fungieren.

Darüber hinaus können Geräte bei der Datenübertragung als Master und Slave klassifiziert werden. Der Master ist ein Gerät, das die Datenübertragung initiiert und Synchronisationssignale generiert. In diesem Fall gilt jedes adressierbare Gerät im Verhältnis zum Master als Slave.

Aufgrund der Spezifikation des Busbetriebs kann es zu jedem Zeitpunkt nur einen Master am Bus geben, nämlich das Gerät, das für die Generierung des Bus-SCL-Signals sorgt. Der Anführer kann sowohl als Anführer-Sender als auch als Anführer-Empfänger fungieren. Der Bus ermöglicht jedoch die Verwendung mehrerer Master, die bestimmte Verhaltensmerkmale bei der Generierung von Steuersignalen und der Überwachung des Busstatus festlegen. Die Möglichkeit, mehr als einen Master an den Bus anzuschließen, bedeutet, dass mehr als ein Master gleichzeitig versuchen kann, eine Übertragung zu starten. Um die in diesem Fall auftretenden „Kollisionen“ auszuschließen, wurde ein Schlichtungsverfahren entwickelt – das Verhalten des Masters, wenn eine „Eroberung“ des Busses durch einen anderen Master erkannt wird.

Verfahren zum Synchronisieren zweier Geräte Dieses Verfahren basiert darauf, dass alle I2C-Geräte gemäß der Verdrahtungs-UND-Regel an den Bus angeschlossen werden. Originalzustand Sowohl das SDA- als auch das SCL-Signal sind hoch.

START- und STOP-Status

Der Austauschvorgang beginnt damit, dass der Master den START-Zustand erzeugt – der Master erzeugt einen Übergang des SDA-Leitungssignals vom HIGH-Zustand in den LOW-Zustand bei einem HIGH-Pegel auf der SCL-Leitung. Dieser Übergang wird von allen am Bus angeschlossenen Geräten als Zeichen für den Beginn des Austauschvorgangs wahrgenommen.

Die Erzeugung des Taktsignals liegt immer in der Verantwortung des Masters; Jeder Master generiert sein eigenes Taktsignal, wenn er Daten über den Bus sendet.

Der Austauschvorgang endet damit, dass der Master den STOP-Zustand erzeugt – den Übergang des SDA-Leitungszustands von einem Low-Zustand in einen HIGH-Zustand, wenn der SCL-Leitungszustand HIGH ist.

Die Zustände START und STOP werden immer vom Master generiert. Der Bus gilt als belegt, nachdem der START-Zustand erkannt wurde. Der Bus gilt einige Zeit nach der Aufzeichnung des STOP-Zustands als frei.

Beim Senden von Nachrichten über den I2C-Bus generiert jeder Master sein eigenes Taktsignal auf der SCL-Leitung.

Nachdem der START-Zustand gebildet wurde, senkt der Master den SCL-Leitungszustand auf LOW und setzt das höchstwertige Bit des ersten Bytes der Nachricht auf die SDA-Leitung. Die Anzahl der Bytes in einer Nachricht ist nicht begrenzt.

Die I2C-Busspezifikation erlaubt Änderungen an der SDA-Leitung nur, wenn die SCL-Leitung LOW ist.

Die Daten sind gültig und sollten nur während des HIGH-Taktzustands stabil bleiben.

Um den Empfang eines Bytes vom Master-Sender durch den Slave-Empfänger zu bestätigen, wird in der Spezifikation des Austauschprotokolls auf dem I2C-Bus ein spezielles Bestätigungsbit eingeführt, das nach dem Empfang des 8. Datenbits auf dem SDA-Bus gesetzt wird.

Bestätigung

Somit wird die Übertragung von 8 Bit Daten vom Sender zum Empfänger mit einem zusätzlichen Zyklus (Bildung des 9. Taktimpulses der SCL-Leitung) abgeschlossen, in dem der Empfänger setzt niedriges Niveau Signal auf der SDA-Leitung als Zeichen für den erfolgreichen Empfang des Bytes.

Bei der Datenübertragung ist eine Bestätigung erforderlich. Der entsprechende Synchronisationsimpuls wird vom Master generiert. Für die Dauer des Quittungstaktes gibt der Sender die SDA-Leitung frei (HIGH). Der Empfänger muss die SDA-Leitung während des HIGH-Zustands des Bestätigungstakts in einem stabilen LOW-Zustand halten.

Für den Fall, dass der Empfänger-Slave seine Adresse nicht bestätigen kann (z. B. wenn er Folgendes ausführt). dieser Moment Für alle Echtzeitfunktionen muss die Datenleitung auf HIGH bleiben. Der Master kann dann ein STOP-Signal ausgeben, um die Datenübertragung zu unterbrechen.

Wenn ein Master-Empfänger an der Übertragung beteiligt ist, muss er dem Slave-Sender das Ende der Übertragung anzeigen, indem er das letzte Byte nicht quittiert. Der sendende Slave muss die Datenleitung freigeben, damit der Master ein STOP-Signal ausgeben oder das START-Signal wiederholen kann.

Die Synchronisation erfolgt über eine Verbindung zur SCL-Leitung mittels UND-Regel.

Dies bedeutet, dass der Master keine ausschließliche Kontrolle über den Übergang der SCL-Leitung von LOW nach HIGH hat. Für den Fall, dass der Slave zusätzliche Zeit benötigt, um ein empfangenes Bit zu verarbeiten, kann er die SCL-Leitung auf Low halten, bis er zum Empfang des nächsten Bits bereit ist. Somit ist die SCL-Leitung für die längste LOW-Taktperiode LOW.

Geräte mit einer kürzeren LOW-Periode gehen in einen Ruhezustand über, bis die lange Periode endet. Wenn alle aktivierten Geräte ihre LOW-Taktperiode abgeschlossen haben, geht die SCL-Leitung auf HIGH. Alle Geräte beginnen in ihrer Taktperiode auf HIGH zu gehen. Das erste Gerät, bei dem dieser Zeitraum abgelaufen ist, setzt die SCL-Leitung wieder auf LOW. Somit wird die LOW-Periode der SCL-Taktleitung durch die längste Taktperiode aller beteiligten Geräte und die HIGH-Periode durch die kürzeste Taktperiode der Geräte bestimmt.

Der Synchronisationsmechanismus kann von Empfängern als Mittel zur Steuerung der Datenübertragung auf Byte- und Bitebene verwendet werden.

Wenn ein Gerät auf Byte-Ebene Datenbytes mit hoher Rate empfangen kann, aber eine gewisse Zeit benötigt, um das empfangene Byte zu speichern oder sich auf den Empfang des nächsten vorzubereiten, kann es die SCL-Leitung nach dem Empfang und der Bestätigung auf LOW halten Byte, wodurch der Sender in einen Ruhezustand versetzt wird.

Auf Bitebene kann ein Gerät wie ein Mikrocontroller ohne integrierte I2C-Hardwareschaltungen oder mit begrenzten Schaltungen die Taktfrequenz verlangsamen, indem es seine LOW-Periode verlängert. Dadurch wird die Übertragungsgeschwindigkeit eines beliebigen Masters an die Geschwindigkeit des langsamen Geräts angepasst.

Adressierung am I2C-Bus

Jedes an den Bus angeschlossene Gerät kann per Software an eine eindeutige Adresse adressiert werden.

Um einen Nachrichtenempfänger auszuwählen, verwendet der Präsentator eine eindeutige Adresskomponente im Sendeformat. Bei Verwendung gleichartiger Geräte verfügen ICs häufig über einen zusätzlichen Adresswähler, der entweder als zusätzliche digitale Adresswählereingänge oder als analoger Eingang realisiert werden kann. Dabei werden die Adressen solcher Geräte gleichen Typs im Adressraum der an den Bus angeschlossenen Geräte verteilt.

Im Normalmodus wird die 7-Bit-Adressierung verwendet.

Das Adressierungsverfahren am I2C-Bus besteht darin, dass das erste Byte nach dem START-Signal bestimmt, welcher Slave vom Master für den Austauschzyklus angesprochen wird. Eine Ausnahme bildet die „General Call“-Adresse, die alle Geräte am Bus anspricht. Bei Verwendung dieser Adresse sollten theoretisch alle Geräte ein Bestätigungssignal senden. Allerdings sind Geräte, die einen „Generalruf“ bewältigen können, in der Praxis selten.

Die ersten sieben Bits des ersten Bytes bilden die Slave-Adresse. Das achte, niedrigstwertige Bit bestimmt die Richtung der Datenübertragung. „Null“ bedeutet, dass der Master Informationen an den ausgewählten Slave schreibt. „Eins“ bedeutet, dass der Master Informationen vom Slave liest.

Nachdem die Adresse gesendet wurde, vergleicht jedes Gerät im System die ersten sieben Bits nach dem START-Signal mit seiner Adresse. Bei Übereinstimmung geht das Gerät davon aus, dass es je nach Richtungsbit als Slave-Empfänger oder als Slave-Sender ausgewählt ist.

Die Slave-Adresse kann aus einem festen und einem programmierbaren Teil bestehen.

Es kommt häufig vor, dass das System über mehrere Geräte desselben Typs verfügt (z. B. Speicherchips oder LED-Anzeigetreiber), sodass es mithilfe des programmierbaren Teils der Adresse möglich ist, die größtmögliche Anzahl solcher Geräte an den Bus anzuschließen . Die Anzahl der programmierbaren Bits in der Adresse hängt von der Anzahl der freien Pins der Mikroschaltung ab. Manchmal wird ein Pin mit einer analogen Einstellung eines programmierbaren Adressbereichs verwendet, wie es beispielsweise im SAA1064 IC implementiert ist. Darüber hinaus ist es je nach Potenzial an diesem Adresspin des ICs möglich, den Adressraum des Treibers so zu verschieben, dass ICs gleichen Typs auf dem gemeinsamen Bus nicht miteinander in Konflikt geraten.

Alle ICs, die den Betrieb im I2C-Busstandard unterstützen, verfügen über einen Satz fester Adressen, deren Liste vom Hersteller in den Controllerbeschreibungen angegeben wird.

Die Adressbitkombination 11110XX ist für die 10-Bit-Adressierung reserviert.

IN Gesamtansicht Der Austauschvorgang auf dem Bus von der Bildung des START-Zustands bis zum STOP-Zustand kann durch die folgende Abbildung dargestellt werden:

Wie aus der Reifenspezifikation hervorgeht, sind sie als einfache Reifen zulässig Austauschformate und kombiniert, wenn im Intervall vom START-Zustand bis zum STOP-Zustand der Master und der Slave sowohl als Empfänger als auch als Datensender fungieren können. Kombinierte Formate können beispielsweise zur Verwaltung serieller Speicher verwendet werden.
Während des ersten Datenbytes kann eine Speicheradresse übergeben werden, die in ein internes Latchregister geschrieben wird. Nach Wiederholung des START-Signals und der Slave-Adresse werden Daten aus dem Speicher abgerufen. Alle Entscheidungen über die automatische Erhöhung oder Verringerung einer Adresse, auf die zuvor zugegriffen wurde, werden vom Entwickler eines bestimmten Geräts getroffen. Daher auf jeden Fall Der beste Weg Um eine unkontrollierte Situation im Bus zu vermeiden, sollten Sie vor der Verwendung eines neuen (oder bisher unbenutzten) ICs sorgfältig dessen Beschreibung (Datenblatt) lesen, nachdem Sie diese von der Website des Herstellers erhalten haben. Darüber hinaus platzieren Hersteller oft mehr detaillierte Anleitung per Antrag.

In jedem Fall müssen gemäß der Busspezifikation alle in der Entwicklung befindlichen Geräte beim Empfang eines START- oder Re-START-Signals die Buslogik zurücksetzen und sich auf den Empfang der Adresse vorbereiten.

Dennoch entstehen die Hauptprobleme bei der Nutzung des I2C-Busses gerade deshalb, weil Entwickler, die mit der Arbeit mit dem I2C-Bus „beginnen“, nicht berücksichtigen, dass der Master (häufig ein Mikroprozessor) kein ausschließliches Recht auf eine der Busleitungen hat .

I2C-Erweiterung

Der Standard-I2C-Bus mit einer Datenübertragungsrate von 100 kbit/s und einer 7-Bit-Adresse existiert seit mehr als 10 Jahren unverändert. Der I2C-Bus gilt weithin als Standard für Hunderte von Chiptypen, die von Philips und anderen Anbietern hergestellt werden. Derzeit wurde die I2C-Busspezifikation in zwei Richtungen erweitert: Erhöhung der Geschwindigkeit und Erweiterung des Adressraums, um die Palette neu entwickelter Geräte zu erweitern.

Einführung der „Fast“-Mode-Spezifikation, die eine Vervierfachung der Datenübertragungsrate auf 400 kBit/s ermöglicht. Die Notwendigkeit dieser „Erweiterung“ des Standards war aufgrund der Notwendigkeit der Übertragung großer Informationsmengen und der daraus resultierenden Erhöhung erforderlich Bandbreite Kanal.

Einführung der Spezifikation „10-Bit-Adressierung“, die die Nutzung von 1024 zusätzlichen Adressen ermöglicht, denn Die meisten der 112 Adressen, die die 7-Bit-Adressierung zulässt, wurden bereits mehr als einmal verwendet. Um Probleme bei der Platzierung von Adressen neuer Geräte zu vermeiden, ist es wünschenswert, über eine größere Anzahl von Adresskombinationen zu verfügen. Durch die neue 10-Bit-Adressierung konnte die Anzahl der verfügbaren Adressen etwa verzehnfacht werden.

Alle neuen Geräte mit I2C-Schnittstelle funktionieren schneller Modus. Vorzugsweise sollten sie in der Lage sein, Daten mit 400 kbit/s zu empfangen und/oder zu senden. Sie müssen zumindest in der Lage sein, die Synchronisierung in einem schnellen Modus durchzuführen, um die Übertragungsrate (durch Verlängerung der LOW-SCL-Periode) auf einen akzeptablen Wert zu reduzieren.

Schnelle Geräte sind im Allgemeinen aufwärtskompatibel, das heißt, sie können über einen langsamen Bus mit Standardgeräten zusammenarbeiten. Es ist klar, dass Standardgeräte können nicht auf einem schnellen Bus betrieben werden, da sie sich nicht mit hoher Geschwindigkeit synchronisieren können und ihr Zustand unvorhersehbar wird. Schnelle Slave-Geräte können entweder eine 7-Bit- oder eine 10-Bit-Adresse haben. Allerdings ist die 7-Bit-Adresse vorzuziehen, da ihre Hardware-Implementierung einfacher und die Nachrichtenlänge kürzer ist. Geräte mit 7-Bit- und 10-Bit-Adressen können unabhängig von der Baudrate gleichzeitig am selben Bus verwendet werden. Sowohl bestehende als auch zukünftige Master werden in der Lage sein, sowohl 7-Bit- als auch 10-Bit-Adressen zu generieren.

Im Schnellmodus bleiben Protokoll, Format, Logikpegel und maximale kapazitive Belastung der Busleitungen unverändert. Der Synchronisationsalgorithmus für die SDA- und SCL-Leitungen wurde nicht geändert. „Schnelle“ Geräte müssen jedoch nicht mit CBUS-Geräten kompatibel sein, da sie nicht mit hohen Geschwindigkeiten arbeiten können. Eingangskreise schnelle Geräte muss über eine integrierte Überspannungsunterdrückung und einen Schmitt-Trigger auf beiden Leitungen verfügen. Der Ausgangspuffer schneller Geräte muss über eine Kaskade mit Steuerung der Abfallflankenzeit der SDA- und SCL-Leitungen verfügen. Bei Ausfall der schnellen Versorgungsspannung kommt es in der Regel Geräteausgänge, Busse, die an die I2C-Leitungen angeschlossen sind, müssen in den dritten Zustand wechseln. Das Schaltungsdesign der Ausgangsstufen wurde geändert, um die Anstiegszeit der Vorderflanke (Übergang vom LOW- in den HIGH-Zustand) sicherzustellen. Wenn diese Rolle bei Buslasten bis 200 pF von Pull-up-Widerständen übernommen wird, wird diese Funktion bei Lasten von 200 pF bis 400 pF von einer Stromquelle oder einem geschalteten Widerstandsschaltkreis übernommen, der für ein „erzwungenes“ Schalten der I2C-Busleitungen sorgt .

Auch die 10-Bit-Adressierung verändert das Busformat nicht. Hierzu wird die reservierte Adresskombination 1111ХХХ der ersten sieben Bits des ersten Bytes verwendet. Die 10-Bit-Adressierung hat keinen Einfluss auf die bestehende 7-Bit-Adressierung. An den gleichen Bus können Geräte mit 7-Bit- und 10-Bit-Adressierung angeschlossen werden. Obwohl es acht mögliche Kombinationen der Sequenz 1111XXX gibt, werden nur vier verwendet – 11110XX. Kombinationen wie 11111XX bleiben weiteren Reifenverbesserungen vorbehalten. Bitbelegung der ersten beiden Bytes Die 10-Bit-Adresse wird aus den ersten beiden Bytes gebildet. Die ersten sieben Bits des ersten Bytes sind eine Kombination der Form 11110XX, wobei die beiden niedrigstwertigen Bits (XX) die beiden höchstwertigen (9 und 8) Bits der 10-Bit-Adresse sind; Das achte Bit des ersten Bytes ist das Richtungsbit.
Eine „Null“ in diesem Bit bedeutet, dass der Master Informationen an den Slave schreiben wird, und eine „Eins“ bedeutet, dass der Master Informationen vom Slave lesen wird. Wenn das Richtungsbit Null ist, enthält das zweite Byte die restlichen 8 Bits der 10-Bit-Adresse. Wenn das Richtungsbit eins ist, enthält das nächste Byte die vom Slave zum Master übertragenen Daten.

Zusammenfassend ist festzuhalten, dass der I2C-Busstandard ganz einfach die Kollisionsarbitrierung implementiert – er löst das Problem der gleichzeitigen Initialisierung des Austauschs auf dem Bus durch mehrere Master, ohne dass Daten verloren gehen.

Diese und weitere, spezifischere Besonderheiten der Nutzung des I2C-Busses, seiner Implementierung und Nutzung finden Sie direkt auf der Website Philips .

Bei der Erstellung der Beschreibung wurden die im Artikel vorgestellten Materialien verwendet

Die I2C-Schnittstelle (oder auch IIC) ist ein ziemlich weit verbreitetes Netzwerk serielle Schnittstelle, erfunden von Philips und zunehmend beliebter hohe Geschwindigkeit Datenübertragung (normalerweise bis zu 100 kbit/s, in modernen Mikroschaltungen bis zu 400 kbit/s), niedrige Kosten und einfache Implementierung.

1) Physik.

Physikalisch handelt es sich bei dem Netzwerk um einen Zweidrahtbus, dessen Leitungen aufgerufen werden DATEN Und UHR(Ein dritter Draht ist ebenfalls erforderlich – Masse, aber die Schnittstelle wird aufgrund der Anzahl der Signaldrähte normalerweise als zweidrahtig bezeichnet.) Dementsprechend erfolgt die Datenübertragung über die DATA-Leitung und die CLOCK-Leitung dient zur Taktung. An den Bus können bis zu 128 Teilnehmer mit jeweils eigenem Anschluss angeschlossen werden einzigartige Nummer. Zu jedem Zeitpunkt werden Informationen nur von einem Teilnehmer und nur in eine Richtung übertragen.

I2C-Geräte verfügen über einen „Open Collector“-Ausgang. Bei geschlossenem Ausgangstransistor wird über einen externen Pull-up-Widerstand ein High-Pegel auf der entsprechenden Leitung eingestellt; bei geöffnetem Ausgangstransistor wird die entsprechende Leitung auf Masse gezogen und auf ihr ein Low-Pegel eingestellt (siehe Abbildung). . Widerstände haben einen Wert von mehreren KiloOhm bis zu mehreren zehn KiloOhm (je höher die Geschwindigkeit, desto niedriger der Wert der Widerstände, aber desto höher der Stromverbrauch). In der Abbildung zeigen die Dreiecke am Eingang, dass die Eingänge hochohmig sind und dementsprechend keinen Einfluss auf die Signalpegel auf den Leitungen haben, sondern diese nur „lesen“. Typischerweise werden 5V- oder 3,3V-Pegel verwendet.

2) Logiken.

Jedes Gerät am I2C-Bus kann einen von zwei Typen haben: Master (Master) oder Slave (Slave). Der Datenaustausch erfolgt in Sitzungen. Das „Master“-Gerät steuert die Sitzung vollständig: Es initiiert die Datenaustauschsitzung, steuert die Übertragung durch Senden von Taktimpulsen an die Clock-Leitung und beendet die Sitzung.

Darüber hinaus können je nach Richtung der Datenübertragung sowohl „Master“- als auch „Slave“-Geräte „Empfänger“ oder „Sender“ sein. Wenn der „Master“ Daten vom „Slave“ empfängt, ist er der „Empfänger“ und der „Slave“ ist der „Sender“. Wenn der „Slave“ Daten vom „Master“ empfängt, ist er bereits ein „Empfänger“ und der „Master“ in diesem Fall ein „Sender“.

Verwechseln Sie den Gerätetyp „Master“ nicht mit dem Status „Sender“. Obwohl der „Master“ Informationen vom „Slave“ liest und dieser Daten auf den Datenbus legt, tut er dies nur, wenn der „Master“ dies zulässt, indem er den entsprechenden Pegel auf der Taktleitung einstellt. Obwohl also in diesem Fall der „Slave“ den Datenbus steuert, wird der Austausch selbst immer noch vom „Master“ gesteuert.

Im Standby-Modus (wenn keine Datenaustauschsitzung stattfindet) befinden sich beide Signalleitungen (Daten und Takt) in einem High-Pegel-Zustand (mit Strom versorgt).

Jede Austauschsitzung beginnt mit der Abgabe der sogenannten Startbedingung durch den „Master“. „Startbedingung“ ist eine Änderung des Pegels auf der Datenleitung von hoch nach niedrig, wenn auf der Taktleitung ein hoher Pegel anliegt.

Nach der Übermittlung der „Startbedingung“ muss der „Master“ zunächst sagen, mit wem er kommunizieren möchte und angeben, was er genau möchte – Daten an das Gerät übertragen oder von diesem auslesen. Dazu gibt es auf dem Bus die 7-Bit-Adresse des „Slave“-Geräts (sonst sagt man: „adressiert das „Slave“-Gerät“) aus, mit dem es kommunizieren möchte, und ein Bit, das die Richtung der Datenübertragung angibt (0 – wenn vom „Master“ zum „Slave“ und 1 – wenn vom „Slave“ zum „Master“). Das erste Byte nach Absenden der „Start“-Bedingung wird von allen „Slaves“ immer als Adressierung wahrgenommen.

Da die Richtung der Datenübertragung beim Öffnen einer Sitzung zusammen mit der Adressierung des Geräts angegeben wird, ist es zum Ändern dieser Richtung erforderlich, eine andere Sitzung zu eröffnen (erneut die „Start“-Bedingung einreichen, dasselbe Gerät adressieren und eine neue Übertragung angeben). Richtung).

Nachdem der „Master“ sagt, wen er genau anspricht und die Richtung der Datenübertragung angibt, beginnt die eigentliche Übertragung: Der „Master“ gibt Daten für den „Slave“ auf den Bus oder empfängt sie von ihm. Dieser Teil des Austauschs (welche Daten und in welcher Reihenfolge der „Master“ an den Bus senden muss, damit das Gerät sie versteht und tut, was es braucht) wird bereits von jedem einzelnen Gerät festgelegt.

Jede Feed-Austauschsitzung durch den „Master“ endet mit der sogenannten Stop-Bedingung, die darin besteht, den Pegel auf der Datenleitung von niedrig auf hoch zu ändern, wiederum bei Vorhandensein eines hohen Pegels auf der Taktleitung. Wenn am Bus eine Stop-Bedingung erzeugt wird, werden alle offenen Austauschsitzungen geschlossen.

Innerhalb der Sitzung sind jegliche Änderungen an der Datenleitung verboten, während die Taktleitung hoch ist, da zu diesem Zeitpunkt die Daten vom „Empfänger“ gelesen werden. Wenn solche Änderungen auftreten, werden sie in jedem Fall entweder als „Start“-Bedingung (die den Datenaustausch stoppt) oder als „Stop“-Bedingung (die das Ende der aktuellen Austauschsitzung bedeutet) wahrgenommen. Dementsprechend kann es während einer Austauschsitzung zu einer Dateninstallation durch den „Sender“ (Einstellung des gewünschten Pegels auf der Datenleitung) kommen
nur, wenn die Clock-Leitung niedrig ist.

Ein paar Worte dazu, was in diesem Fall der Unterschied zwischen „Beendigung des Datenaustauschs“ und „Ende der Austauschsitzung“ ist. Grundsätzlich ist es dem „Master“ erlaubt, ohne die erste Austauschsitzung zu schließen, eine oder mehrere Austauschsitzungen mit demselben zu eröffnen (z. B. wie oben erwähnt, um die Richtung der Datenübertragung zu ändern) oder auch mit anderen „Slaves“. “, indem eine neue „Start“-Bedingung übermittelt wird, ohne „Stop“-Bedingungen zum Schließen der vorherigen Sitzung zu hinterlegen. Steuern Sie die Datenleitung, um auf den „Master“ zu antworten. In diesem Fall wird es dem Gerät gestattet, an das der „Master“ gesendet wird.zuletzt gedrehtDie alte Sitzung kann jedoch nicht als abgeschlossen betrachtet werden. Und deshalb. Um den Betrieb zu beschleunigen, legen viele Geräte (z. B. 24Cxx-EEPROMs) die vom „Master“ empfangenen Daten in einen Puffer und beginnen mit der Verarbeitung dieser empfangenen Daten erst, nachdem sie ein Signal über das Ende der Austauschsitzung erhalten haben (d. h , „Stoppbedingungen“).

Das heißt zum Beispiel, wenn zwei EEPROM-24Cxx-Chips am Bus hängen und Sie eine Aufzeichnungssitzung für einen Chip geöffnet und Daten zur Aufzeichnung dorthin übertragen haben, und dann, ohne diese erste Sitzung zu schließen, eine neue Sitzung zum Schreiben geöffnet haben Ein weiterer Chip, dann erfolgt die eigentliche Aufnahme und in den ersten und zweiten Mikroschaltkreis erst nach der Bildung einer „Stopp-Bedingung“ auf dem Bus, die beide Sitzungen schließt. Nachdem es Daten vom „Master“ empfangen hat, legt das Eeprom diese in den internen Puffer und wartet auf das Ende der Sitzung, um mit dem eigentlichen Schreibvorgang aus seinem internen Puffer direkt in das Eeprom zu beginnen. Das heißt, wenn Sie nach der Übertragung der Daten zur Aufzeichnung an das erste Mikrukh diese Sitzung nicht geschlossen, eine zweite Sitzung geöffnet und die aufzuzeichnenden Daten an das zweite Mikrukh gesendet und dann, ohne eine „Stopp-Bedingung“ zu erstellen, umgedreht haben Wenn das Gerät ausgeschaltet ist, werden die Daten weder im ersten noch im zweiten Chip tatsächlich aufgezeichnet. Wenn Sie beispielsweise Daten abwechselnd in zwei Mikrukhs schreiben, können Sie im Prinzip eine Sitzung öffnen, um in die erste zu schreiben, dann eine andere Sitzung, um in die zweite zu schreiben, dann eine dritte Sitzung, um erneut in die erste zu schreiben usw. , aber wenn Sie diese Sitzungen nicht schließen, führt dies schließlich zu einem Überlauf der internen Puffer und letztendlich zu Datenverlust.

Hier können wir die folgende Analogie anführen: Schüler einer Klasse („Sklaven“) und ein Lehrer („Meister“). Nehmen wir an, der Lehrer hat einen Schüler (es sei Vasya) an die Tafel gerufen und ihn gebeten, ein Beispiel zu lösen. Nachdem Vasya dieses Beispiel gelöst hatte, rief der Lehrer Petya an die Tafel und fragte ihn nach seinen Hausaufgaben, ließ Vasya jedoch nicht zu seinem Platz zurück. In diesem Fall scheint das Gespräch mit Vasya beendet zu sein – der Lehrer spricht mit Petya, aber Vasya steht an der Tafel und kann seinem Geschäft nicht ruhig nachgehen (die Kommunikationssitzung mit ihm ist nicht geschlossen).

Wenn der „Slave“ während der Austauschsitzung keine Zeit hat, die Daten zu verarbeiten, kann er den Austauschvorgang verlängern, indem er die Clock-Leitung auf einem niedrigen Pegel hält. Daher muss der „Master“ die Rückkehr der Clock-Leitung auf einen hohen Pegel prüfen Level, nachdem er es losgelassen hat. Ich möchte betonen, dass Sie den Zustand, in dem der „Slave“ keine Zeit zum Empfangen oder Senden von Daten hat, nicht mit dem Zustand verwechseln sollten, in dem er lediglich damit beschäftigt ist, die als Ergebnis der Austauschsitzung empfangenen Daten zu verarbeiten. Im ersten Fall (während des Datenaustauschs) kann er den Austausch verlängern, indem er die Clock-Leitung hält, und im zweiten Fall (wenn die Austauschsitzung mit ihm abgeschlossen ist) hat er kein Recht, irgendwelche Leitungen zu berühren. Im letzteren Fall wird er einfach nicht auf den „Anruf“ des „Meisters“ an ihn reagieren.

Innerhalb einer Sitzung besteht die Übertragung aus Paketen mit neun Bits, die in normaler positiver Logik übertragen werden (d. h. hoch ist 1 und niedrig ist 0). Davon werden 8 Bit vom „Sender“ an den „Empfänger“ übertragen und das letzte neunte Bit wird vom „Empfänger“ an den „Sender“ übertragen. Bits in einem Paket werden zuerst mit dem höchstwertigen Bit übertragen. Das letzte, neunte Bit wird als ACK-Bestätigungsbit (vom englischen Wort „acknowledgment“) bezeichnet. Es wird invertiert übertragen, d. h. 0 auf der Leitung entspricht dem Vorhandensein des Bestätigungsbits und 1 seinem Fehlen. Das Quittierungsbit kann entweder die Abwesenheit oder Beschäftigung des Geräts signalisieren (sofern es bei der Adressierung nicht gesetzt wurde), oder dass der „Receiver“ die Übertragung abschließen möchte oder dass der vom „Master“ gesendete Befehl nicht abgeschlossen wurde.

Jedes Bit wird in einem Taktzyklus übertragen. Die Hälfte des Taktzyklus, in der die Taktleitung auf Low gesetzt ist, wird vom sendenden Teilnehmer dazu verwendet, ein Datenbit auf dem Bus zu setzen (wenn das vorherige Bit von einem anderen Teilnehmer gesendet wurde, muss er zu diesem Zeitpunkt den Datenbus freigeben). . Die Hälfte des Taktzyklus, während der die Taktleitung auf High gesetzt ist, wird vom empfangenden Teilnehmer genutzt, um den gesetzten Bitwert vom Datenbus zu lesen.

Das ist alles. Die folgenden Abbildungen zeigen diese gesamte Beschreibung in grafischer Form.

3) Diagramme und Zeitpläne.



Parameter Bezeichnung Mindestwert

I 2 C ist eine von der Philips Corporation entwickelte Zweidrahtschnittstelle. Im Original technische Anforderung zur Schnittstelle maximale Geschwindigkeit Die Datenübertragung betrug 100 Kbit/s. Mit der Zeit entstanden jedoch Standards für schnellere I 2 C-Betriebsarten. Geräte mit unterschiedlichen Zugriffsgeschwindigkeiten können an denselben I 2 C-Bus angeschlossen werden, da die Datenübertragungsgeschwindigkeit durch das Taktsignal bestimmt wird.

Das Datenübertragungsprotokoll ist so konzipiert, dass ein zuverlässiger Empfang der übertragenen Daten gewährleistet ist.

Bei der Datenübertragung fungiert ein Gerät als „Master“, der die Datenübertragung initiiert und Synchronisationssignale generiert. Ein anderes Gerät „Slave“ – beginnt mit der Übertragung nur auf einen Befehl vom „Master“.

Die PIC16CXXX-Mikrocontroller implementieren den „Slave“-Modus des Geräts in Hardware im SSP-Modul. Der „Master“-Modus ist in Software implementiert.

Grundbegriffe zur Beschreibung der Arbeit mit dem I 2 C-Bus:

Sender– ein Gerät, das Daten über einen Bus überträgt

Empfänger– Gerät, das Daten vom Bus empfängt

"Meister"- ein Gerät, das die Übertragung initiiert und ein Taktsignal erzeugt

„Sklave“- das vom „Master“ angesprochene Gerät

Multi-"Master"- I 2 C-Bus-Betriebsart mit mehr als einem „Master“

Schiedsverfahren– ein Verfahren, das sicherstellt, dass nur ein „Master“ den Bus steuert

Synchronisation– Verfahren zum Synchronisieren eines Taktsignals von zwei oder mehr Geräten

Die Ausgangsstufen der Synchronisationssignal- (SCL) und Datengeneratoren (SDA) müssen gemäß Open-Collector-Schaltungen (Drain) ausgeführt werden, um mehrere Ausgänge zu kombinieren, und über einen externen Widerstand mit dem positiven Netzteil verbunden werden, damit der Buspegel „ 1“, wenn keines der Geräte ein „0“-Signal erzeugt. Die maximale kapazitive Last ist auf 400 pF Kapazität begrenzt.

Initialisierung und Abschluss der Datenübertragung

Wenn keine Datenübertragung auf dem Bus stattfindet, werden die SCL- und SDA-Signale aufgrund eines externen Widerstands auf High gehalten.

Die START- und STOP-Signale werden vom „Master“ generiert, um den Beginn bzw. das Ende der Datenübertragung festzulegen.

Das START-Signal wird durch den Übergang des SDA-Signals von High nach Low erzeugt, während das SCL-Signal High ist. Das STOP-Signal ist definiert als SDA, der von Low auf High geht, wenn SCL High ist. Daher kann sich das SDA-Signal bei der Datenübertragung nur ändern, wenn das SCL-Signal niedrig ist.

Adressierung von Geräten am I 2 C-Bus

Zur Adressierung von Geräten werden zwei Adressformate verwendet:

Einfaches 7-Bit-Format mit R/W-Lese-/Schreibbit;

und 10-Bit-Format – das erste Byte enthält die beiden höchstwertigen Bits der Adresse und das Schreib-/Lesebit, das zweite Byte enthält den niederwertigen Teil der Adresse.

Annahmebestätigung

Beim Übertragen von Daten muss der Empfänger nach jedem übertragenen Byte den Empfang des Bytes mit einem ACK-Signal bestätigen.

Wenn der Slave den Empfang der Adresse oder des Datenbytes nicht bestätigt, muss der Master die Übertragung durch Erzeugen eines STOP-Signals unterbrechen.

Bei der Übertragung von Daten vom „Slave“ zum „Master“ generiert der „Master“ ACK-Datenbestätigungssignale. Wenn der „Master“ den Empfang des Bytes nicht bestätigt, stoppt der „Slave“ die Datenübertragung, indem er die SDA-Leitung „freigibt“. Danach kann der „Master“ ein STOP-Signal generieren.

Um die Datenübertragung zu verzögern, kann der „Slave“ eine logische Null setzen, die dem „Master“ anzeigt, dass er warten soll. Nachdem die SCL-Leitung freigegeben wurde, wird die Datenübertragung fortgesetzt.

Datenübertragung vom „Master“ zum „Slave“

Daten vom „Slave“ lesen

Mit dem Re-START-Signal auf den „Slave“ zugreifen

Multi-Master-Modus

Das I 2 C-Datenübertragungsprotokoll ermöglicht es Ihnen, mehr als einen „Master“ am Bus zu haben. Arbitrations- und Synchronisationsfunktionen werden verwendet, um Buskonflikte während der Übertragungsinitialisierung zu lösen.

Schiedsverfahren

Die Arbitrierung wird auf der SDA-Leitung durchgeführt, wenn die SCL-Leitung hoch ist. Ein Gerät, das auf der SDA-Leitung einen High-Pegel erzeugt, während ein anderes Low sendet, verliert das Recht, den „Master“ zu übernehmen, und muss in den „Slave“-Modus wechseln. Ein „Master“, der die Initiative am Bus verloren hat, kann bis zum Ende des Bytes, in dem er seine Mastereigenschaften verloren hat, Taktimpulse erzeugen.

Synchronisation

Die Synchronisierung auf dem Bus erfolgt, nachdem die Arbitrierung des SCL-Signals durchgeführt wurde. Wenn das SCL-Signal von High auf Low wechselt, beginnen alle interessierten Geräte, die Dauer des Low-Pegels zu zählen. Die Geräte beginnen dann, den SCL-Pegel entsprechend der erforderlichen Datenrate von niedrig auf hoch umzustellen. Nach dem Übergang des Pegels von niedrig nach hoch zählen die betroffenen Geräte die Dauer des hohen Pegels. Das erste Gerät, das das SCL-Signal auf Low setzt, bestimmt die Taktsignalparameter.

LCD Bildschirm– ein häufiger Gast in Arduino-Projekten. Aber in komplexe Schemata Möglicherweise haben wir das Problem, dass es an Arduino-Anschlüssen mangelt, da ein Schild mit sehr, sehr vielen Pins angeschlossen werden muss. Die Lösung in dieser Situation könnte sein I2C/IIC Ein Adapter, der ein fast standardmäßiges Arduino 1602-Shield mit nur 4 Pins mit Uno-, Nano- oder Mega-Boards verbindet. In diesem Artikel erfahren Sie, wie Sie eine Verbindung herstellen können LCD Bildschirm Welche Bibliotheken mit der I2C-Schnittstelle genutzt werden können, schreiben wir eine kurze Beispielskizze und analysieren typische Fehler.

Flüssigkristallanzeige LCD 1602 Ist gute Wahl zur Ausgabe von Zeichenketten in verschiedenen Projekten. Es ist kostengünstig, es gibt verschiedene Modifikationen mit unterschiedlichen Farben der Hintergrundbeleuchtung, Sie können problemlos vorgefertigte Bibliotheken für Arduino-Skizzen herunterladen. Der Hauptnachteil dieses Bildschirms ist jedoch die Tatsache, dass das Display 16 hat digitale Ausgänge, von denen mindestens 6 erforderlich sind. Daher führt die Verwendung dieses LCD-Bildschirms ohne i2c zu erheblichen Einschränkungen für Arduino Uno- oder Nano-Boards. Wenn nicht genügend Kontakte vorhanden sind, müssen Sie kaufen Arduino-Board Mega oder Kontakte speichern, auch durch Anschließen des Displays über i2c.

Kurze Beschreibung der LCD 1602-Pins

Schauen wir uns die Pins des LCD1602 genauer an:

Jeder der Pins hat seinen eigenen Zweck:

  1. Masse GND;
  2. Spannungsversorgung 5 V;
  3. Einstellen des Monitorkontrasts;
  4. Befehl, Daten;
  5. Daten schreiben und lesen;
  6. Aktivieren;

7-14. Datenleitungen;

  1. Plus Hintergrundbeleuchtung;
  2. Minus Hintergrundbeleuchtung.

Display-Spezifikationen:

  • Zeichenanzeigetyp, es ist möglich, Symbole zu laden;
  • LED Lichter;
  • Controller HD44780;
  • Versorgungsspannung 5V;
  • Format 16x2 Zeichen;
  • Betriebstemperaturbereich von -20 °C bis +70 °C, Lagertemperaturbereich von -30 °C bis +80 °C;
  • Betrachtungswinkel 180 Grad.

Anschlussdiagramm von LCD zu Arduino-Board ohne i2C

Das Standarddiagramm zum direkten Anschluss eines Monitors an einen Arduino-Mikrocontroller ohne I2C sieht wie folgt aus.

Aufgrund der großen Anzahl angeschlossener Kontakte ist möglicherweise nicht genügend Platz vorhanden, um die erforderlichen Elemente anzuschließen. Die Verwendung von I2C reduziert die Anzahl der Drähte auf 4 und die belegten Pins auf 2.

Wo kann man LCD-Bildschirme und -Abschirmungen für Arduino kaufen?

Der LCD-Bildschirm 1602 (und Version 2004) ist sehr beliebt, sodass Sie ihn sowohl in inländischen Online-Shops als auch auf ausländischen Websites leicht finden können. Hier sind einige Links zu den am häufigsten verfügbaren Optionen:

LCD1602+I2C Bluescreen-Modul, Arduino-kompatibel Einfach LCD Bildschirm 1602 (grüne Hintergrundbeleuchtung) billiger als 80 Rubel Großer LCD2004-Bildschirm mit I2C HD44780 für Arduino (blaue und grüne Hintergrundbeleuchtung)
1602-Display mit IIC-Adapter und blauer Hintergrundbeleuchtung Eine weitere Version des LCD1602 mit einem angelöteten I2C-Modul Port IIC/I2C/TWI/SPI-Adaptermodul für 1602 Shield, kompatibel mit Arduino
RGB-hinterleuchtetes Display! LCD 16×2 + Tastatur + Buzzer Shield für Arduino Schild für Arduino mit Tasten und Bildschirm LCD1602 LCD 1602 LCD-Display für 3D-Drucker (Smart Controller für RAMPS 1.4, Text LCD 20×4), SD- und MicroSD-Kartenlesermodul

Beschreibung des I2C-Protokolls

Bevor wir uns mit dem Anschluss des Displays an Arduino über einen i2c-Adapter befassen, wollen wir kurz auf das i2C-Protokoll selbst eingehen.

I2C/IIC(Inter-Integrated Circuit) ist ein Protokoll, das ursprünglich zur Kommunikation integrierter Schaltkreise entwickelt wurde elektronisches Gerät. Die Entwicklung gehört Philips. Das i2c-Protokoll basiert auf der Verwendung eines 8-Bit-Busses, der für die Kommunikation von Blöcken in der Steuerelektronik benötigt wird, und eines Adressierungssystems, dank dem Sie über dieselben Leitungen mit mehreren Geräten kommunizieren können. Wir übertragen einfach Daten an das eine oder andere Gerät und fügen den Datenpaketen die Kennung des gewünschten Elements hinzu.

Am meisten einfache Schaltung I2C kann ein Master-Gerät (meist ein Arduino-Mikrocontroller) und mehrere Slaves (z. B. ein LCD-Display) enthalten. Jedes Gerät hat eine Adresse im Bereich von 7 bis 127. Es sollten sich nicht zwei Geräte mit derselben Adresse im selben Stromkreis befinden.

Das Arduino-Board unterstützt i2c in der Hardware. Sie können die Pins A4 und A5 verwenden, um Geräte anzuschließen, die dieses Protokoll verwenden.

Der I2C-Betrieb bietet mehrere Vorteile:

  • Der Betrieb erfordert nur 2 Leitungen – SDA (Datenleitung) und SCL (Synchronisationsleitung).
  • Anbindung einer großen Anzahl führender Geräte.
  • Reduzierte Entwicklungszeit.
  • Zur Steuerung des gesamten Gerätesatzes ist nur ein Mikrocontroller erforderlich.
  • Die mögliche Anzahl der an einen Bus angeschlossenen Mikroschaltungen wird nur durch die maximale Kapazität begrenzt.
  • Hohe Datensicherheit durch einen speziellen, in die Schaltkreise eingebauten Überspannungsschutzfilter.
  • Ein einfaches Verfahren zur Diagnose auftretender Fehler und zur schnellen Fehlerbehebung.
  • Der Bus ist bereits im Arduino selbst integriert, sodass keine zusätzliche Busschnittstelle entwickelt werden muss.

Mängel:

  • Es gibt eine kapazitive Grenze auf der Leitung – 400 pF.
  • Es ist schwierig, einen I2C-Controller zu programmieren, wenn mehrere verschiedene Geräte am Bus angeschlossen sind.
  • Bei große Mengen Geräte haben Schwierigkeiten, einen Fehler zu lokalisieren, wenn eines von ihnen fälschlicherweise den Low-Level-Zustand einstellt.

i2c-Modul für LCD 1602 Arduino

Der schnellste und bequemste Weg, ein i2c-Display in Arduino zu verwenden, ist der Kauf eines vorgefertigten Bildschirms mit integrierter Protokollunterstützung. Aber es gibt nicht sehr viele dieser Bildschirme und sie sind nicht billig. Es wurde jedoch bereits eine Vielzahl unterschiedlicher Standardbildschirme hergestellt. Daher ist die günstigste und beliebteste Option heute der Kauf und die Verwendung eines separaten I2C-Moduls – eines Adapters, der so aussieht:

Auf einer Seite des Moduls sehen wir i2c-Pins – Masse, Strom und 2 für die Datenübertragung. Am anderen Adapter sehen wir externe Stromanschlüsse. Und natürlich verfügt die Platine über viele Pins, mit denen das Modul an die Standard-Bildschirmpins angelötet wird.


i2c-Ausgänge werden zum Anschluss an das Arduino-Board verwendet. Bei Bedarf vernetzen wir uns externe Stromversorgung zur Hintergrundbeleuchtung. Mit dem eingebauten Trimmer können wir benutzerdefinierte Kontrastwerte J einstellen

Auf dem Markt finden Sie LCD 1602-Module mit bereits angelöteten Adaptern; deren Verwendung wird so weit wie möglich vereinfacht. Wenn Sie einen separaten Adapter erworben haben, müssen Sie diesen zunächst an das Modul anlöten.

Anschließen des LCD-Bildschirms an Arduino über I2C

Zum Anschließen benötigen Sie das Arduino-Board selbst, ein Display, ein Steckbrett, Anschlussdrähte und ein Potentiometer.

Wenn Sie einen speziellen separaten i2c-Adapter verwenden, müssen Sie diesen zunächst an das Bildschirmmodul anlöten. Es ist schwer, da einen Fehler zu machen; Sie können diesem Schema folgen.


Ein LCD-Monitor mit i2c-Unterstützung wird über vier Drähte mit der Platine verbunden – zwei Drähte für Daten, zwei Drähte für Strom.

  • Der GND-Pin wird mit GND auf der Platine verbunden.
  • Der VCC-Pin liegt auf 5V.
  • SCL wird an Pin A5 angeschlossen.
  • SDA ist an Pin A angeschlossen.

Und das ist alles! Keine Kabelnetze, in denen man sich sehr leicht verheddern kann. Gleichzeitig können wir die gesamte Komplexität der Implementierung des i2C-Protokolls einfach den Bibliotheken anvertrauen.

Bibliotheken für die Arbeit mit i2c-LCD-Displays

Um mit Arduino und LCD 1602 über den I2C-Bus zu interagieren, benötigen Sie mindestens zwei Bibliotheken:

  • Die Wire.h-Bibliothek für die Arbeit mit I2C ist bereits in verfügbar Standardprogramm Arduino-IDE.
  • Die Bibliothek LiquidCrystal_I2C.h, die eine Vielzahl von Befehlen zur Steuerung des Monitors über den I2C-Bus enthält und es Ihnen ermöglicht, den Sketch einfacher und kürzer zu gestalten. Sie müssen die Bibliothek zusätzlich installieren. Nach dem Anschließen des Displays müssen Sie zusätzlich die Bibliothek LiquidCrystal_I2C.h installieren

Nachdem wir alle notwendigen Bibliotheken mit der Skizze verbunden haben, erstellen wir ein Objekt und können alle seine Funktionen nutzen. Zum Testen laden wir die folgende Standard-Beispielskizze.

#enthalten #enthalten // Einbinden der Bibliothek //#include // Anschließen einer alternativen Bibliothek LiquidCrystal_I2C lcd(0x27,16,2); // Geben Sie die I2C-Adresse (den häufigsten Wert) sowie Bildschirmparameter an (im Fall von LCD 1602 - 2 Zeilen mit jeweils 16 Zeichen //LiquidCrystal_PCF8574 lcd(0x27); // Option für die PCF8574-Bibliothek void setup( ) ( lcd.init (); // Initialisieren Sie die Anzeige lcd.backlight(); // Schließen Sie die Hintergrundbeleuchtung an lcd.setCursor(0,0); // Setzen Sie den Cursor an den Anfang der ersten Zeile lcd.print(" Hello"); lcd.setCursor(0,1); // Cursor an den Anfang der zweiten Zeile setzen lcd.print("ArduinoMaster"); // Text in die zweite Zeile eingeben ) void loop() ( )

Beschreibung der Funktionen und Methoden der LiquidCrystal_I2C-Bibliothek:

  • home() und clear() – die erste Funktion ermöglicht es Ihnen, den Cursor an den Anfang des Bildschirms zurückzusetzen, die zweite macht dasselbe, löscht aber gleichzeitig alles, was zuvor auf dem Monitor war.
  • write(ch) – ermöglicht das Drucken eines einzelnen Zeichens ch auf dem Bildschirm.
  • Cursor() und NoCursor() – zeigt/versteckt den Cursor auf dem Bildschirm.
  • blink() und noBlink() – der Cursor blinkt/blinkt nicht (sofern seine Anzeige zuvor aktiviert war).
  • display() und noDisplay() – ermöglicht Ihnen, die Anzeige zu verbinden/deaktivieren.
  • scrollDisplayLeft() und scrollDisplayRight() – scrollt den Bildschirm um ein Zeichen nach links/rechts.
  • autoscroll() und noAutoscroll() – ermöglicht Ihnen das Aktivieren/Deaktivieren des Autoscroll-Modus. In diesem Modus wird jedes neue Zeichen an derselben Stelle geschrieben und ersetzt so das, was zuvor auf dem Bildschirm geschrieben wurde.
  • leftToRight() und rightToLeft() – Festlegung der Richtung des angezeigten Textes – von links nach rechts oder von rechts nach links.
  • createChar(ch, bitmap) – erstellt ein Zeichen mit dem Code ch (0 – 7) und verwendet ein Array von Bitmaps, um schwarze und weiße Punkte zu erstellen.

Alternative Bibliothek für die Arbeit mit i2c-Display

In einigen Fällen können Fehler auftreten, wenn die angegebene Bibliothek mit Geräten verwendet wird, die mit PCF8574-Controllern ausgestattet sind. In diesem Fall kann als Alternative die Bibliothek LiquidCrystal_PCF8574.h vorgeschlagen werden. Es erweitert LiquidCrystal_I2C, sodass es bei der Verwendung keine Probleme geben sollte.

Probleme beim Anschließen des i2c-LCD-Displays

Wenn Sie nach dem Hochladen der Skizze keine Meldung auf dem Display sehen, versuchen Sie die folgenden Schritte.

Zunächst können Sie den Kontrast des Monitors erhöhen oder verringern. Oft sind Zeichen aufgrund des Kontrasts und des Hintergrundbeleuchtungsmodus einfach nicht sichtbar.

Wenn dies nicht hilft, überprüfen Sie, ob die Kontakte richtig angeschlossen sind und ob die Stromversorgung der Hintergrundbeleuchtung angeschlossen ist. Wenn Sie einen separaten i2c-Adapter verwendet haben, überprüfen Sie noch einmal die Qualität der Verlötung der Kontakte.

Ein weiterer häufiger Grund für fehlenden Text auf dem Bildschirm kann eine falsche i2c-Adresse sein. Versuchen Sie zunächst, die Geräteadresse im Sketch von 0x27 0x20 oder auf 0x3F zu ändern. Verschiedene Hersteller können unterschiedliche Standardadressen programmiert haben. Wenn dies nicht hilft, können Sie den i2c-Scanner-Sketch ausführen, der alle angeschlossenen Geräte scannt und deren Adresse mit Brute-Force ermittelt. Ein Beispiel für eine i2c-Scanner-Skizze.

Wenn der Bildschirm immer noch nicht funktioniert, versuchen Sie, den Adapter abzulöten und das LCD wie gewohnt anzuschließen.

Abschluss

In diesem Artikel haben wir uns mit den Hauptproblemen bei der Verwendung eines LCD-Bildschirms in komplexen Arduino-Projekten befasst, wenn wir freie Pins auf der Platine einsparen müssen. Mit einem einfachen und kostengünstigen i2c-Adapter können Sie einen 1602-LCD-Bildschirm anschließen und dabei nur 2 analoge Pins belegen. In vielen Situationen kann dies sehr wichtig sein. Der Preis für die Bequemlichkeit ist die Notwendigkeit, ein zusätzliches Modul zu verwenden – einen Konverter und eine Bibliothek. Unserer Meinung nach ist dies kein hoher Preis für den Komfort und wir empfehlen dringend, diese Funktion in Projekten zu verwenden.

Mit Nennwerten von 10 Ohm bis 1 MOhm);

  • 2 Widerstände von 4,7 kOhm (aus dem gleichen Satz);
  • Verbindungsdrähte (hier ist zum Beispiel ein guter Satz);
  • Computer mit Arduino IDE.
  • 1 Beschreibung I2C-Schnittstelle

    Serial IIC (auch I2C – Inter-Integrated Circuits) genannt, verwendet zur Datenübertragung zwei bidirektionale Kommunikationsleitungen, den sogenannten seriellen Datenbus. SDA (Serielle Daten) und Uhrenbus SCL (Serieller Takt). Es gibt auch zwei Stromleitungen. Die SDA- und SCL-Busse werden über Widerstände an den Leistungsbus herangezogen.

    Es gibt mindestens einen online Master-Gerät, der die Datenübertragung initiiert und Synchronisationssignale erzeugt. Das Netzwerk hat auch Slave-Geräte, die Daten auf Anfrage des Leiters übermitteln. Jedes Slave-Gerät verfügt über eine eindeutige Adresse, über die der Master darauf zugreift. Die Geräteadresse ist im Datenblatt angegeben. Bis zu 127 Geräte, darunter mehrere Master, können an einen I2C-Bus angeschlossen werden. Geräte können im laufenden Betrieb an den Bus angeschlossen werden, d.h. Es unterstützt Hot-Plugging.

    Schauen wir uns das Zeitdiagramm des Austauschs über das I2C-Protokoll an. Es gibt verschiedene Optionen. Schauen wir uns eine der häufigsten an. Nutzen wir den Vorteil Logikanalysator, verbunden mit den SCL- und SDA-Bussen.

    Der Master initiiert den Austausch. Dazu beginnt es Taktimpulse zu erzeugen und sendet diese in einem Paket von 9 Stück über die SCL-Leitung. Gleichzeitig wird auf der SDA-Datenleitung gesetzt Geräteadresse, mit denen eine Kommunikation aufgebaut werden muss, die durch die ersten 7 Taktimpulse getaktet wird (daher die Einschränkung des Adressbereichs: 2 7 = 128 minus Nulladresse). Der nächste Teil der Nachricht ist Operationscode(lesen oder schreiben) und noch ein Bit - Quittungsbit(ACK), dass das Slave-Gerät die Anfrage angenommen hat. Wenn das Bestätigungsbit nicht eintrifft, endet der Austausch. Oder der Master sendet weiterhin wiederholt Anfragen.

    Dies ist in der folgenden Abbildung dargestellt. Im ersten Fall trennen wir beispielsweise das Slave-Gerät vom Bus. Es ist zu erkennen, dass der Master versucht, eine Kommunikation mit dem Gerät mit der Adresse 0x27 aufzubauen, aber keine Bestätigung (NAK) erhält. Der Austausch endet.


    Verbinden Sie nun das Slave-Gerät mit dem I2C-Bus und wiederholen Sie den Vorgang. Die Situation hat sich geändert. Das erste Paket mit der Adresse erhielt eine Bestätigung (ACK) vom Slave. Der Austausch ging weiter. Informationen werden ebenfalls in 9-Bit-Paketen übertragen, allerdings sind nun 8 Bit belegt Daten und 1 Bit - Quittungsbit Der Slave empfängt jedes Datenbyte. Wenn die Verbindung zu irgendeinem Zeitpunkt unterbrochen wird und das Bestätigungsbit nicht eintrifft, stoppt der Master die Übertragung.

    2 I2C-Implementierung im Arduino

    Arduino verwendet zwei Ports für den Betrieb über die I2C-Schnittstelle. Zum Beispiel in Arduino UNO und Arduino Nano analoger Anschluss A4 entspricht SDA, analoger Port A5 entspricht SCL.


    Bei anderen Platinenmodellen ist die Pin-Entsprechung wie folgt:

    3 Bibliothek „Draht“ für die Arbeit mit IIC

    Um den Datenaustausch mit Geräten über den I2C-Bus zu erleichtern, wurde eine Standardbibliothek für Arduino geschrieben Draht. Es hat folgende Funktionen:

    FunktionZweck
    beginnen(Adresse) Initialisierung der Bibliothek und Verbindung mit dem I2C-Bus; Wenn die Adresse nicht angegeben ist, gilt das angeschlossene Gerät als Master. Es wird eine 7-Bit-Adressierung verwendet;
    Anfrage von() Wird vom Master verwendet, um eine bestimmte Anzahl von Bytes vom Slave anzufordern.
    beginTransmission(Adresse) Beginn der Datenübertragung zum Slave-Gerät an einer bestimmten Adresse;
    endTransmission() Stoppen der Datenübertragung zum Slave;
    schreiben() Aufzeichnen von Daten vom Slave als Reaktion auf eine Anfrage;
    verfügbar() gibt die Anzahl der Bytes an Informationen zurück, die zum Empfang vom Slave verfügbar sind;
    lesen() Lesen eines von einem Slave an einen Master oder von einem Master an einen Slave übertragenen Bytes;
    onReceive() gibt eine Funktion an, die aufgerufen werden soll, wenn der Slave eine Übertragung vom Master empfängt;
    auf Anfrage() gibt eine Funktion an, die aufgerufen werden soll, wenn der Master eine Übertragung vom Slave empfängt.

    4 Anschließen eines I2C-Geräts zu Arduino

    Mal sehen, wie man mit dem I2C-Bus arbeitet mit Arduino.

    Lassen Sie uns zunächst eine Schaltung zusammenbauen, wie in der Abbildung. Die Helligkeit der LED steuern wir über ein digitales 64-Positionen-Potentiometer AD5171 (siehe technische Beschreibung), das an den I2C-Bus angeschlossen ist. Die Adresse, unter der wir auf das Potentiometer zugreifen, ist 0x2c (44 in Dezimalzahl).


    5 Geräteverwaltungüber IIC-Bus

    Betrachten wir Diagramme des Informationsaustauschs mit digitales Potentiometer AD5171 vorgestellt in Technische Beschreibung:


    Uns interessiert das Diagramm zum Schreiben von Daten in das Register RDAC. Dieses Register dient zur Steuerung des Widerstandes des Potentiometers.

    Öffnen wir eine Skizze aus den Beispielen der „Wire“-Bibliothek: Dateibeispiele Wire digital_potentiometer. Laden wir es in den Arduino-Speicher.

    #enthalten // die Bibliothek „Wire“ verbinden byte val = 0; // Wert, der an das Potentiometer übertragen werden soll void setup() ( Wire.begin(); // Als Master mit dem I2C-Bus verbinden } void loop() ( Wire.beginTransmission(44); // Austausch mit einem Gerät mit der I2C-Adresse „44“ (0x2C) starten Wire.write(byte(0x00)); // einen Schreibbefehl an das RDAC-Register senden Wire.write(val); // Position des 64-Positionen-Potentiometers einstellen Wire.endTransmission(); // I2C-Übertragung abschließen val++; // Wert um 1 erhöhen, wenn (Wert == 63) ( // wenn das Potentiometer sein Maximum erreicht val = 0; // Wert zurücksetzen) Verzögerung (500); }

    Nach dem Einschalten sehen Sie, wie die Helligkeit der LED zyklisch zunimmt und dann erlischt. In diesem Fall steuern wir das Potentiometer mit Arduino über den I2C-Bus.