- Was ist das I2C-Kommunikationsprotokoll?
- Wie funktioniert die I2C-Kommunikation?
- Wo kann ich die I2C-Kommunikation verwenden?
- I2C auf Nuvoton N76E003 - Hardwareanforderung
- Schnittstelle AT24LC64 mit Nuvoton N76E003 - Schaltplan
- I2C-Pins am Nuvoton N76E003
- I2C-Kommunikation in N76E003
- Programmierung N76E003 für die I2C-Kommunikation
- Flashen des Codes und der Ausgabe
In dem riesigen System eingebetteter Anwendungen kann kein Mikrocontroller alle Aktivitäten selbst ausführen. Zu einem bestimmten Zeitpunkt muss es mit anderen Geräten kommunizieren, um Informationen auszutauschen. Es gibt viele verschiedene Arten von Kommunikationsprotokollen , um diese Informationen zu teilen. Die am häufigsten verwendeten sind jedoch USART, IIC, SPI und CAN. Jedes Kommunikationsprotokoll hat seine eigenen Vor- und Nachteile. Konzentrieren wir uns zunächst auf den IIC-Teil, da wir dies in diesem Tutorial lernen werden. Wenn Sie neu hier sind, lesen Sie die Nuvoton-Tutorials, in denen wir alle Peripheriegeräte des N76E003-Mikrocontrollers aus dem grundlegenden Tutorial für die ersten Schritte besprochen haben. Wenn Sie lernen möchten, wie I2C mit anderen Mikrocontrollern verwendet wird, können Sie die folgenden Links überprüfen.
- Verwendung von I2C in Arduino: Kommunikation zwischen zwei Arduino-Boards
- I2C-Kommunikation mit dem PIC-Mikrocontroller PIC16F877
- Verbindung von 16X2 LCD mit ESP32 über I2C
- I2C-Kommunikation mit dem MSP430 Launchpad
- Schnittstelle zwischen LCD und NodeMCU ohne Verwendung von I2C
- Umgang mit Multikommunikation (I2C SPI UART) in einem einzigen Programm von Arduino
I2C ist ein wichtiges Kommunikationsprotokoll, das von Philips (jetzt NXP) entwickelt wurde. Mit diesem I2C-Protokoll kann eine MCU mit mehreren Geräten verbunden werden und die Kommunikation starten. I2C arbeitet mit nur zwei Drähten, nämlich SDA und SCL. Wobei SDA für serielle Daten und SCL für serielle Uhr steht. Diese beiden Pins erfordern jedoch Pull-up-Widerstände bis zum VCC-Spannungspegel, und mit einem geeigneten Pull-up-Widerstand könnte der Bus 127 Geräte mit einer eindeutigen Adresse unterstützen.
Was ist das I2C-Kommunikationsprotokoll?
Der Begriff IIC steht für " Inter Integrated Circuits ". Es wird normalerweise an einigen Stellen als I2C oder I im Quadrat C oder sogar als 2-Draht-Schnittstellenprotokoll (TWI) bezeichnet, aber alles bedeutet dasselbe. I2C ist ein synchrones Kommunikationsprotokoll, dh beide Geräte, die die Informationen gemeinsam nutzen, müssen ein gemeinsames Taktsignal gemeinsam nutzen. Es gibt nur zwei Drähte zum Teilen von Informationen, von denen einer für das Taktsignal und der andere zum Senden und Empfangen von Daten verwendet wird.
Wie funktioniert die I2C-Kommunikation?
Die I2C-Kommunikation wurde erstmals von Phillips eingeführt. Wie bereits erwähnt, hat es zwei Drähte, diese beiden Drähte werden über zwei Geräte verbunden. Hier wird ein Gerät als Master und das andere Gerät als Slave bezeichnet. Die Kommunikation sollte und wird immer zwischen zwei, einem Master und einem Slave, stattfinden. Der Vorteil der I2C-Kommunikation besteht darin, dass mehr als ein Slave mit einem Master verbunden werden kann.
Die vollständige Kommunikation erfolgt über diese beiden Drähte, nämlich Serial Clock (SCL) und Serial Data (SDA).
Serial Clock (SCL): Teilt das vom Master erzeugte Taktsignal mit dem Slave
Serielle Daten (SDA): Sendet die Daten zum und vom Master und Slave.
Zu jedem Zeitpunkt kann nur der Master die Kommunikation initiieren. Da sich mehr als ein Slave im Bus befindet, muss der Master auf jeden Slave mit einer anderen Adresse verweisen. Wenn angesprochen, antwortet nur die Salbe mit dieser bestimmten Adresse mit den Informationen, während die anderen schweigen. Auf diese Weise können wir denselben Bus verwenden, um mit mehreren Geräten zu kommunizieren.
Wo kann ich die I2C-Kommunikation verwenden?
Die I2C-Kommunikation wird nur für die Kurzstreckenkommunikation verwendet. Es ist sicherlich bis zu einem gewissen Grad zuverlässig, da es einen synchronisierten Takt hat, um es intelligent zu machen. Dieses Protokoll wird hauptsächlich zur Kommunikation mit dem Sensor oder anderen Geräten verwendet, die Informationen an einen Master senden müssen. Dies ist sehr praktisch, wenn ein Mikrocontroller mit nur wenigen Kabeln mit vielen anderen Slave-Modulen kommunizieren muss. Wenn Sie nach einer Kommunikation über große Entfernungen suchen, sollten Sie RS232 ausprobieren. Wenn Sie nach einer zuverlässigeren Kommunikation suchen, sollten Sie das SPI-Protokoll ausprobieren.
I2C auf Nuvoton N76E003 - Hardwareanforderung
Da die Anforderung dieses Projekts darin besteht, die I2C-Kommunikation mit N76E003 zu lernen, verwenden wir ein EEPROM, das mit der I2C-Datenleitung verbunden wird. Wir werden einige Daten im EEPROM speichern und diese auch lesen und über den UART-Bildschirm anzeigen.
Da der gespeicherte Wert im UART gedruckt wird, ist jede Art von USB-UART-Konverter erforderlich. Sie können auch das Tutorial zu UART mit Nuvoton lesen, wenn Sie mit der UART-Kommunikation auf N76E003 noch nicht vertraut sind. Für unsere Anwendung verwenden wir den CP2102 UART-zu-USB-Konverter. Abgesehen von den oben genannten benötigen wir auch die folgenden Komponenten:
- EEPROM 24C02
- 2 Stück 4,7k Widerstände
Abgesehen von den oben genannten Komponenten benötigen wir ein auf einem N76E003-Mikrocontroller basierendes Entwicklungsboard sowie den Nu-Link-Programmierer. Zusätzlich sind Steckbrett- und Anschlusskabel erforderlich, um alle Komponenten anzuschließen.
Schnittstelle AT24LC64 mit Nuvoton N76E003 - Schaltplan
Wie wir im folgenden Schema sehen können, ist das EEPROM zusammen mit zwei Pull-up-Widerständen in der I2C-Leitung angeschlossen. Ganz links ist der Anschluss der Programmierschnittstelle dargestellt.
Ich habe ein Steckbrett für den AT24LC64-IC verwendet und den IC über Überbrückungskabel mit meinem Nuvoton-Programmierboard verbunden. Mein Hardware-Setup zusammen mit dem Nu-Ink-Programmierer ist unten dargestellt.
I2C-Pins am Nuvoton N76E003
Das Pin-Diagramm des N76E003 ist im folgenden Bild zu sehen.
Wie wir sehen können, hat jeder Pin unterschiedliche Spezifikationen und jeder Pin kann für mehrere Zwecke verwendet werden. Allerdings ist 1,4 - Pin als ein I2C SDA Stift verwendet, wird es die PWM und andere Funktionalität verlieren. Dies ist jedoch kein Problem, da für dieses Projekt keine weitere Funktionalität erforderlich ist. Das gleiche passiert beim P1.3 mit dem SCL-Pin von I2C.
Da I2C-Pins als GPIO fungieren, muss es konfiguriert werden. Alle GPIO-Pins können im unten beschriebenen Modus konfiguriert werden.
Gemäß Datenblatt PxM1.n und PxM2. n sind zwei Register, mit denen die Steueroperation des E / A-Ports bestimmt wird. Im Datenblatt wird angegeben, dass zur Verwendung der I2C-Funktionalität die E / A-Modi als Open-Drain für I2C-bezogene Kommunikation verwendet werden müssen.
I2C-Kommunikation in N76E003
Das I2C-Peripheriegerät ist eine wichtige Sache für jede Mikrocontroller-Einheit, die I2C-Funktionen unterstützt. Viele Arten verschiedener Mikrocontroller verfügen über ein eingebautes I2C-Peripheriegerät. In einigen Fällen kann I2C jedoch manuell mithilfe der Softwaresteuerung konfiguriert werden, wenn keine I2C-bezogene Hardwareunterstützung verfügbar ist (z. B. viele 8051-Mikrocontroller). Der Nuvoton N76E003 verfügt jedoch über eine I2C-Peripherieunterstützung.
Der M76E003 unterstützt vier Arten von Vorgängen im I2C-Modus: Master-Sender, Master-Empfänger, Slave-Sender und Slave-Empfänger. Es unterstützt auch Standardgeschwindigkeiten (100 kbps) und schnelle Geschwindigkeiten (bis zu 400 kbps) für die I2C-Leitung. I2C arbeitet mit wenigen generischen Regeln in den SCL- und SDA-Signalleitungen.
Start- und Stoppbedingung:
Dies ist eine wichtige Sache in der I2C-Kommunikation. Wenn Daten auf die I2C-Leitung übertragen werden, beginnen sie mit der Startbedingung und enden mit einer Stoppbedingung.
Die Startbedingung ist der Übergang von hoch zu niedrig auf dem SDA, wenn die SCL-Leitung hoch ist, und die Stoppbedingung ist der Übergang von niedrig zu hoch auf dem SDA, wenn die SCL-Leitung hoch ist. Diese beiden Bedingungen werden vom Master generiert (die MCU oder alles, was die anderen Slave-Geräte steuert). Die Busleitung bleibt in diesem Zustand besetzt, wenn die Startbedingung eingeleitet wird, und bleibt wieder frei, wenn die Stoppbedingung eingeleitet wird.
Die Start- und Stoppbedingung wird in der Signalperspektive im Datenblatt N76E003 hervorragend dargestellt.
7-Bit-Adresse mit Datenformat:
N76E003 unterstützt ein 7-Bit-Adress- und Datenformat. Nachdem die Startbedingung eingeleitet wurde, muss das Master-Gerät die Daten an die I2C-Leitung senden. Die ersten Daten sind wichtig. Wenn diese Daten nicht ordnungsgemäß erstellt oder übertragen werden, wird das angeschlossene Gerät nicht identifiziert und es kann keine weitere Kommunikation hergestellt werden.
Die Daten bestehen aus einer 7 Bit langen Slave-Adresse, die als SLA bezeichnet wird. Diese 7 Bit lange Adresse muss für jedes Gerät eindeutig sein, wenn mehrere Geräte am Bus angeschlossen sind. Nach der 7-Bit-Adresse ist das 8. Bit das Datenrichtungsbit. Das heißt, abhängig vom 8. Bit sendet der Master die Informationen an das Slave-Gerät, ob Daten in das Slave-Gerät geschrieben oder die Daten vom Slave-Gerät gelesen werden. Das 8. Bit ist das R / W-Bit, das als Lese- oder Schreibbenachrichtigung bezeichnet wird. Wie wir alle wissen, können 8-Bit-Informationen 128 Typen sein, wodurch 128 Geräte unterstützt werden. I2C unterstützt jedoch 127 Gerätetypen auf demselben Bus, jedoch nicht 128. Da die 0x00-Adresse eine reservierte Adresse ist, die als allgemeine Anrufadresse bezeichnet wird. Wenn der Master Informationen an alle Geräte senden möchte,Es wird 0x00 adressiert und jedes Gerät wird auf die gleiche Weise wie in den einzelnen Softwarekonfigurationen wiedergegeben.
Somit sieht die Datenübertragung wie folgt aus:
Bestätigen:
In dem obigen Datenadressbild wird das 9. Bit, gefolgt vom R / W-Bit, als Bestätigungsbit bezeichnet. Dies ist wichtig, da der Master oder Slave mit diesem Bit auf den Datensender reagiert, indem er die SDA-Leitung nach unten zieht. Um das Bestätigungsbit zu erhalten, muss der Sender die SDA-Leitung freigeben.
Programmierung N76E003 für die I2C-Kommunikation
Das vollständige Programm, das in diesem Tutorial verwendet wird, finden Sie unten auf dieser Seite. Die Erklärung wichtiger Segmente im Code lautet wie folgt:
Setzen Sie die Pins als Open Drain und konfigurieren Sie sie für I2C:
Beginnen wir zuerst mit dem I2C-Pin-Abschnitt. Wie zuvor beschrieben, müssen die I2C-SCL- und SDA-Ports konfiguriert und als Open-Drain-Konfiguration festgelegt werden. Zu diesem Zweck verwenden wir eine I2C.h-Headerdatei zusammen mit einer I2C.c-Quelldatei . Das Code-Snippet sieht so aus:
do {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
Der obige Code setzt P13 und P14 als Open-Drain-Pin und clr_I2CPX wird verwendet, um P13 und P14 als SCL-Pin auf P1.3 und SDA-Pin auf P1.4 auszuwählen.
Diese I2CPX ist das 0. Bit des I2C-Steuerregisters I2CON. Wenn dieser I2C_PX auf 1 gesetzt ist, werden die Pins in P0.2 als SCL und P1.6 als SDA geändert. Wir werden jedoch P13 und P14 verwenden. Alternative Pins werden hier nicht verwendet.
I2C-Steuerregister I2CON:
Das I2C-Steuerregister I2CON wird zur Steuerung der I2C-Operationen verwendet. Das erste Bit ist das I2C-Pinauswahlbit. Durch Setzen von 0 wird der I2C-Pin als P13 und P14 konfiguriert.
Das AA-Bit ist das Bestätigungs-Bestätigungsflag. Wenn das AA-Flag gesetzt ist, wird während des Bestätigungstaktimpulses der SCL-Leitung eine ACK zurückgegeben. Wenn es gelöscht wird, wird während des bestätigten Taktimpulses der SCL-Leitung ein NACK (hoher Pegel auf SDA) zurückgegeben.
Das nächste Bit ist SI, das der I2C-Statusinterrupt ist. Wenn der I2C-Status-Interrupt aktiviert ist, sollte der Benutzer das I2STAT-Register überprüfen, um festzustellen, welcher Schritt übergeben wurde, und die Aktion ausführen.
Das STO ist das STOP-Flag, das im Master-Modus gesetzt wird. STO wird automatisch von der Hardware gelöscht, sobald der STOP- Zustand erkannt wurde.
Das nächste Bit ist das STA-Bit. Wenn dieses Flag gesetzt ist, generiert I2C eine START-Bedingung, wenn der Bus frei ist. Wenn der Bus belegt ist, wartet der I2C auf eine STOP-Bedingung und generiert anschließend eine START-Bedingung. Wenn STA eingestellt ist, während sich der I2C bereits im Master-Modus befindet und ein oder mehrere Bytes gesendet oder empfangen wurden, generiert der I2C eine wiederholte START-Bedingung. Die STA muss manuell von der Software gelöscht werden.
Das letzte, I2CEN, ist das Aktivierungs- oder Deaktivierungsbit für den I2C-Bus.
EEPROM 24C02:
Kommen wir nun zum 24C02. Das Board-Support-Paket von N76E003 verfügt über einen I2C-Code für den 24LC64 und kann problemlos geändert werden. Wir werden jedoch eine einfache Methode verwenden, um die I2C-Funktion zu verstehen.
Wenn jemand eine detaillierte Schnittstelle zum EEPROM 24C02 verwenden möchte, kann das EEPROM-Programm im BSP verwendet werden.
Wir werden den 24C02 nur in I2C verbinden, wo der N76E003 Master und das EEPROM ein Slave sein wird. Daher schreiben wir alle Daten in die EEPROM-Adresse und lesen diese.
Die 24C02-EEPROM-Pinbelegung ist unten dargestellt.
A0, A1 und A2 sind drei Adressauswahlstifte. Die WP-Pins sind Schreibschutz-Pins und müssen mit VSS verbunden sein, damit in das EEPROM geschrieben werden kann.
Die Byte-Schreibfunktion ist in der folgenden Abbildung dargestellt.
Der vollständige Schreibzyklus erfolgt mit einem Startbit. Danach muss das Kontrollbyte gesendet werden. Im Steuerbyte sind folgende Dinge erforderlich:
Bestehen Sie nach dem Startbit aus der Slave-Adresse. 1010 ist die statische und A0, A1 und A2 sind die auf der Hardwareverbindung basierende Adresse. Wenn die drei Pins mit der GND- oder VSS-Versorgung verbunden sind, wird sie als 0 gelesen. Wenn sie mit VCC verbunden sind, wird sie als 1 gelesen. In unserem Fall sind alle A0, A1 und A2 mit VSS verbunden. Somit sind alle diese 0.
Ausgaben für die Lese- oder Schreibbedingung. Der Wert der Adresse mit dem Lese- oder Schreibbit ist - 0xA0 für Schreiben und 0xA1 für Lesen. Als nächstes folgt das Bestätigungsbit und danach wird eine 8-Bit-Adresse übertragen, an der die Daten gespeichert werden müssen, und schließlich die Daten, die an dem jeweiligen Ort gespeichert werden. Diese Dinge werden in der Hauptfunktion Schritt für Schritt ausgeführt.
Hauptfunktion und While-Schleife:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Wichtig, die Druckfunktion verwenden muss TI = 1 setzen; I2C_init (); während (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n Der gelesene Wert ist% x", c & 0xff); }; }}
Die Hauptfunktion ist einfach: Sie schreibt kontinuierlich Werte in das EEPROM in der Adresse 1 und liest die Daten. Die Daten werden dann mit der Funktion printf gedruckt. Der printf druckt den Wert in hex.
Die EEPROM-Schreibfunktion besteht aus den folgenden Dingen, die im Abschnitt EEPROM beschrieben wurden:
void EEPROM_write (vorzeichenlose Zeichenadresse, vorzeichenloser Zeichenwert) {I2C_start (); I2C_write (0xA0); I2C_write (Adresse); I2C_write (Wert); I2C_stop (); }}
Die I2C-Startfunktion besteht aus folgenden Elementen:
void I2C_start (void) {signiert int time = timeout; set_STA; clr_SI; while ((SI == 0) && (Zeit> 0)) {Zeit--; }; }}
In dieser Funktion wird der SI-Status zusammen mit der vordefinierten Zeitüberschreitungsperiode überprüft (definiert in I2C.h, wobei die vordefinierte Zeit auf 1000 eingestellt ist). Die Startfunktion beginnt mit dem Einstellen der STA und dem Löschen des SI.
void I2C_stop (void) {signiert int time = timeout; clr_SI; set_STO; while ((STO == 1) && (Zeit> 0)) {Zeit--; }; }}
Wie bei der Start-Stopp-Funktion wird auch diese verwendet. Die Stoppfunktion wird durch Einrichten des STO und anschließendes Löschen des SI ausgelöst. Die folgende Funktion ist die I2C-Lesefunktion.
vorzeichenloses Zeichen I2C_read (vorzeichenloses Zeichen ack_mode) {vorzeichenbehaftete int time = timeout; vorzeichenloser Zeichenwert = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; Wert = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {time--; }; } Rückgabewert; }}
Der ack_mode und I2C_NACK sind beide in der I2C-Header-Datei als 0 bzw. 1 definiert.
Ebenso wird die Schreibfunktion erstellt-
void I2C_write (vorzeichenloser Zeichenwert) {signierte int time = timeout; I2DAT = Wert; clr_STA; clr_SI; while ((SI == 0) && (Zeit> 0)) {Zeit--; }; }}
Flashen des Codes und der Ausgabe
Der Code gab 0 Warnungen und 0 Fehler zurück und wurde vom Keil mit der Standard-Blinkmethode geflasht. Wenn Sie neu sind, lesen Sie das Tutorial Erste Schritte mit Nuvoton, um zu verstehen, wie Sie Code hochladen. Die Kompilierungsinformationen des Codes finden Sie unten.
Build-Ziel 'I2C_EEPROM' Kompilieren von I2C_EEPROM.c… Kompilieren von I2C.c… Verknüpfen… Programmgröße: Daten = 59,2 xDaten = 0 Code = 2409 Erstellen einer Hex-Datei aus ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 Fehler, 0 Warnung (en). Verstrichene Erstellungszeit: 00:00:04 Zusammenfassung der Stapelerstellung: 1 erfolgreich, 0 fehlgeschlagen, 0 übersprungen - Verstrichene Zeit: 00:00:04
Die Hardware wird auf einem Steckbrett eingerichtet und funktioniert wie erwartet. Wie Sie in der Abbildung unten sehen können, konnten wir einen Wert in das EEPROM schreiben, ihn aus dem Speicher zurücklesen und auf dem seriellen Monitor anzeigen.
Schauen Sie sich das Video unten an, um eine vollständige Demonstration der Funktionsweise des Boards für diesen Code zu erhalten. Ich hoffe, Ihnen hat das Tutorial gefallen und Sie haben etwas Nützliches gelernt, wenn Sie Fragen haben. Lassen Sie diese im Kommentarbereich unten. Sie können auch unsere Foren verwenden, um andere technische Fragen zu stellen.