- Hardware-Setup und Anforderungen zum Aktivieren der SPI-Funktion auf N76E003
- Schaltung zur Schnittstelle
- SPI-Pins am Nuvoton N76E003-Mikrocontroller
- SPI-Informationen N76E003
- Meister
- Programmierung
- Testen der SPI-Kommunikation auf Nuvoton mit Arduino
SPI ist ein wichtiges Kommunikationsprotokoll, das häufig für die Kommunikation zwischen Mikrocontrollern, SD-Karten und verschiedenen anderen Sensoren verwendet wird. SPI steht für Serial Peripheral Interface, ein synchrones Datenübertragungsprotokoll, bei dem das Master-Gerät mit mehreren Slave-Geräten kommunizieren und Daten von diesen abrufen kann. Es ist synchron, da der Master eine Uhr in einer separaten E / A-Leitung generiert, die garantiert, dass beide Geräte, Master und Slave, mit derselben Taktrate laufen.
Das SPI-Protokoll verwendet zwei Datenleitungen, eine Auswahlleitung und eine Taktleitung. Die Verbindungen sind SS (Slave Select), MISO (Master In Slave Out), MOSI (Master Out Slave In) und SCK (Serial Clock). Trotz einer SCK-Leitung erzeugt der Master eine Uhr, und der SS wird zur Auswahl eines einzelnen Slaves in einer Busleitung verwendet, an der mehrere Slave-Geräte mit dem Master verbunden sind. MISO wird verwendet, um die Daten vom Slave zu empfangen, und MOSI wird verwendet, um Daten vom Master an das Slave-Gerät zu senden.
Zuvor haben wir viele Projekte erstellt, die das SPI-Protokoll verwenden, um zwischen Sensoren zu kommunizieren. Sehen Sie sich diese an, wenn Sie mehr über das Thema erfahren möchten. Wenn Sie mit den Grundlagen einer Nuvoton N76E003-Karte beginnen möchten, sollten Sie die ersten Schritte mit der Nuvoton-Anleitung überprüfen
Hardware-Setup und Anforderungen zum Aktivieren der SPI-Funktion auf N76E003
Das Ziel dieses Projekts ist die SPI - Kommunikation mit N76E003, zu lernen und der beste Weg ist zum Einrichten eines SPI Beispiel, in dem wir eine Nachricht zwischen zwei Mikrocontroller - Einheiten übertragen, dies zu tun, werden wir eine verwenden Arduino als Slave - Gerät, das ist verbunden mit der N76E003 SPI-Leitung. Wir senden Daten an das Arduino, validieren sie und drucken sie mit Arduinos UART aus. Als nächstes senden wir Daten von Arduino an den N76E003, validieren sie und drucken sie mit N76E003 UART. Deshalb wird für unsere Beispielanwendung ein USB-UART-Konverter für den N76E003 und ein Arduino erforderlich. Wir verwenden CP2102 UART zu USB Konverter und ein Arduino Nano, um unsere Anforderungen zu erfüllen.
Abgesehen von den oben genannten Dingen benötigen wir das auf Mikrocontrollern basierende Entwicklungsboard N76E003 sowie den Nu-Link-Programmierer, um das Board zu programmieren. Zusätzlich werden Bergdrähte für alle Hardwareverbindungen verwendet.
Vor einiger Zeit haben wir einige Artikel wie die serielle RS-485 MODBUS-Kommunikation mit Arduino als Master und die Bluetooth-Kommunikation zwischen Arduino und Arduino mithilfe der Master-Slave-Konfiguration verfasst, bei der wir ein Arduino als Master-Gerät eingerichtet haben Interesse.
Schaltung zur Schnittstelle
Wie wir im Schema sehen können, ist der Arduino Nano mit dem SPI von N76E003 verbunden. Ganz links ist der Anschluss der Programmierschnittstelle dargestellt.
SPI-Pins am Nuvoton N76E003-Mikrocontroller
Das Pin-Diagramm des N76E003 ist im folgenden Bild zu sehen.
Wie wir im obigen Pin-Diagramm sehen können, verfügt jeder Pin über gemultiplexte Funktionsspezifikationen und kann je nach Anwendung programmiert werden. Jedoch Stifte 0,1, 0,0, 1,0 und 1,5 werden eingesetzt als MISO, MOSI, SPCLK und SS - Pins verbunden. Wenn wir SPI aktivieren, gehen PWM und andere Funktionen verloren. Dies ist jedoch kein Problem, da für dieses Projekt keine weitere Funktionalität erforderlich ist. Dieser Chip betrachtet alle SPI-Pins als GPIO, weshalb diese konfiguriert werden müssen. Die Konfigurationsmethode wird unten beschrieben.
Gemäß Datenblatt sind PxM1.n und PxM2.n zwei Register, mit denen die Steueroperation des E / A-Ports bestimmt wird. Im N76E003-Datenblatt wird angegeben, dass zur Verwendung der SPI-Funktionalität die E / A-Modi als Quasi-Modus für die SPI-Kommunikation verwendet werden müssen.
SPI-Informationen N76E003
Das SPI-Peripheriegerät ist ein Muss für jeden Mikrocontroller. Es ist nicht nur einfach zu bedienen, sondern kann auch die schnellsten Übertragungsgeschwindigkeiten unter vielen anderen generischen Kommunikationsprotokollen erzielen, weshalb verschiedene Arten von Mikrocontrollern mit einem eingebauten SPI-Peripheriegerät ausgestattet sind.
Bevor Sie mit der SPI-Kommunikation fortfahren, ist es wichtig, einige Dinge über die SPI-Kommunikation auf dem N7E003 zu wissen.
SS-Pin des N76E003:
Es ist ein wichtiger Pin in der SPI-Kommunikation. Der Slave-Auswahl-Pin wählt bestimmte Slaves in einem Multi-Slave-SPI-Bus aus. Alle einzelnen Slaves müssen einen Slave-Auswahlstift benötigen. Ein einzelner SS-Pin kann nicht mit mehreren Slaves verbunden werden.
Das folgende Bild zeigt die möglichen Mehrfach-Slave-Verbindungen.
Auswahl des MSB First- oder LSB First-Bits in N76E003:
N76E003 unterstützt zwei Arten der Datenkommunikation - MSB zuerst oder LSB zuerst. Standardmäßig wird zuerst das MSB ausgewählt. Die ersten Daten von LSB können jedoch auch in N76E003 ausgewählt werden. Wir werden uns im Codierungsprozess um diese Auswahl kümmern.
Die einfache SPI-Verbindung mit Single-Master und Single-Salve ist in der folgenden Abbildung dargestellt.
SPI Peripheral Control Register (SPCR) des N76E003:
SPI-Steuerregister SPCR wird zur Steuerung der SPI-Operationen verwendet.
Die ersten beiden Bits sind das SPI-Taktratenauswahlbit. Die Taktraten sind unten dargestellt, wobei die Systemfrequenz 16 MHz beträgt.
Das CPHA-Bit ist das Taktphasenauswahlbit. Wenn das CPHA-Flag gesetzt ist, werden die Daten an der zweiten Flanke des SPI-Takts abgetastet. Wenn es gelöscht wird, werden die Daten an der ersten Kante abgetastet. Das nächste Bit ist CPOLI, das der Leerlaufzustandspegel des SPI-Takts ist. Wenn auf 0 gesetzt, ist der Takt im Ruhezustand niedrig, wenn er auf 1 gesetzt ist, ist er im Leerlauf hoch. Der MSTR ist das Aktivierungsbit für den Master-Modus, mit dem der N76E003 als Master-Modus konfiguriert wird. Durch Löschen dieses Bits wird er zum Slave-Modus. LSBFE wird zur Datenübertragungsrichtung verwendet. Durch Löschen dieses Bits wird die Datenübertragung zuerst als MSB ausgeführt, während durch Setzen von 1 die erste Richtung des LSB aktiviert wird. SPIEN wird verwendet, um das SPI zu aktivieren. Einstellung 1 aktiviert das SPI-Peripheriegerät. Die letzte SSOE ist das Aktivierungsbit für die SPI-Slave-Auswahlausgabe.und es wird zum Konfigurieren des SS-Pins als Allzweck- oder im automatischen Modus verwendet.
Abgesehen von den oben genannten gibt es ein anderes Register, das als Serial Peripheral Status Register bezeichnet wird.
Das obige Register wird verwendet, um die verschiedenen SPI-Status zu erhalten.
Meister
Die Hauptfunktion ist einfach: Sie initiiert das SPI-Peripheriegerät und den UART und ruft auch Start_Sending_SPI () auf. Funktion in der while-Schleife. Wenn Sie mit der Verwendung von UART mit Nuvoton noch nicht vertraut sind, lesen Sie das verknüpfte Lernprogramm.
void main (void) {Set_All_GPIO_Quasi_Mode; InitialUART0_Timer1 (115200); / * 115200 Baudrate * / SPI_Initial (); printf ("\ nSPI Start Transmit… \ n"); while (1) // SPI-Übertragung beendet {Start_Sending_SPI (); }}
Werfen wir einen Blick auf SPI_Initial (). Funktion.
void SPI_Initial (void) {P15_Quasi_Mode; // P15 (SS) Quasi-Modus P10_Quasi_Mode; // P10 (SPCLK) Quasi-Modus P00_Quasi_Mode; // P00 (MOSI) Quasi-Modus P01_Quasi_Mode; // P22 (MISO) Quasi-Modus set_DISMODF; // SS Allzweck-E / A (kein Modusfehler) clr_SSOE; clr_LSBFE; // MSB first clr_CPOL; // Der SPI-Takt ist im Leerlauf niedrig. Set_CPHA; // Die Daten sind
Sample an der zweiten Flanke der SPI-Uhr.
set_MSTR; // SPI im Master-Modus SPICLK_DIV2; // SPI-Uhr auswählen Enable_SPI_Interrupt; // SPI Interrupt aktivieren set_SPIEN; // SPI-Funktion aktivieren}
Wie zuvor beschrieben, müssen die SPI-Port-Pins als Quasi-Konfiguration konfiguriert und festgelegt werden. Die erste vierzeilige Funktion innerhalb der SPI_Initial () -Funktion erledigt genau das. Die Konfiguration für das SPI wird als universeller SS-Pin ausgewählt Daten werden zuerst als MSB übertragen, der SPI-Takt ist im Leerlaufmodus mit Datenabtastung der zweiten Flanke niedrig. Da der N76E003 als Master-Modus fungiert, wird er als Master eingestellt. Der SPI-Interrupt wird mit dem SPI-aktivierten Bit SPIEN gesetzt. Diese alle Funktionen sind in der Header-Datei SFR_Macro.h verfügbar.
In der Funktion Start_Sending_SPI () wird zuerst der SS-Pin nach unten gezogen und die Daten über SPI an das Arduino gesendet. Das SPDR-Register enthält den Wert, der an den SPI-Slave gesendet werden soll, und empfängt den Wert vom Slave.
void Start_Sending_SPI () {SS = 0; SPDR = 0x90; // Sende 0x90 an Slave PCON - = SET_BIT0; // In den Leerlaufmodus wechseln, wenn (SPDR! = 0x4E) // Slave empfangen 1. DATA SPI_Error (); printf ("\ nSlave Return% x \ n", SPDR & 0xFF); SS = 1; }}
Es gibt jedoch eine Validierungsbedingung, bei der der SPRD-Wert mit (0x4E) überprüft wird, das vom Arduino empfangen wird. Wenn die Daten nicht 0x4E sind, wird die SPI-Kommunikation gestoppt, indem in die while-Schleife gewechselt wird.
void SPI_Error (void) {printf ("\ nSlave hat das Senden von Daten gestoppt. \ n"); while (1) // SPI-Fehler und P0.7 flash / {}}
Da der SPI im Timer-Interrupt verwendet wird, wird hier eine ISR-Funktion verwendet.
void SPI_ISR (void) Interrupt 9 // Vecotr @ 0x4B {clr_SPIF; Timer3_Delay10us (1); }}
Das SPIF wird mit einer Zeitlücke von 1 Mikrosekunde gelöscht.
Programmierung
Arduino Nano hat auch die gleichen SPI-Pins wie im Bild unten gezeigt.
Wir werden jedoch nicht auf die Details zu Arduino SPI eingehen, da eine Menge Details verfügbar sind, die zeigen, wie SPI auf einem Arduino verwendet wird.
Zunächst enthalten wir alle erforderlichen Header und Variablen.
#einschließen
Als nächstes initialisieren wir im Setup-Abschnitt UART, setzen unseren vordefinierten MISO-Pin als Ausgang, aktivieren SPI im Slave-Modus, setzen unsere vordefinierte Empfangsvariable auf false und aktivieren schließlich unseren Interrupt, der das Ende von markiert die Setup-Schleife.
void setup () {Serial.begin (115200); PinMode (MISO, OUTPUT); // Setzt MISO als OUTPUT (Daten müssen an Master IN SPCR gesendet werden - = _BV (SPE); // SPI im Slave-Modus aktivieren empfangen = false; SPI.attachInterrupt (); // Interuupt ON ist für die SPI-Kommunikation eingestellt}
Als nächstes haben wir unsere Interrupt-Serviceroutine definiert. In der Interrupt-Serviceroutine sichern wir die Daten aus dem SPDR-Register in unsere vordefinierte Variable Slavereceived , drucken die Daten mit den integrierten Serial.print- Funktionen und setzen die empfangene Variable auf true.
Im Loop-Bereich senden wir einmal pro Sekunde einen vordefinierten Wert an das SPDR-Register, der die Daten an das Master-Modul überträgt.
Testen der SPI-Kommunikation auf Nuvoton mit Arduino
Der vollständige Code ist am Ende dieser Seite angegeben. Der hochgeladene Code gab 0 Warnungen und 0 Fehler zurück und blitzte mit der Standard-Blinkmethode des Keil. Die Anwendung beginnt zu arbeiten.
Erstellen der Zielverknüpfung 'SPI_INT_M'… Programmgröße: Daten = 58,2 xDaten = 0 Code = 2402 Erstellen einer Hex-Datei aus ". \ Output \ Master_P"… ". \ Output \ Master_P" - 0 Fehler, 0 Warnung (en). Verstrichene Erstellungszeit: 00:00:01 Zusammenfassung der Stapelerstellung: 1 erfolgreich, 0 fehlgeschlagen, 0 übersprungen - Verstrichene Zeit: 00:00:01
Ich habe Überbrückungskabel verwendet, um meine Nuvoton-Platine mit Arduino zu verbinden. Meine Test-Setup-Verbindung ist unten dargestellt.
Die Ausgabe des UART ist in den folgenden Bildern zu sehen. Wenn wir den seriellen Monitor von Arduino öffnen, können wir die Werte von der Nuvoton-Karte sehen, die über die SPI-Kommunikation empfangen werden.
In ähnlicher Weise haben wir auf der Nuvoton-Seite einen Tera-Begriff verwendet, um zu überwachen, dass die Daten vom Slave (hier Arduino) empfangen werden. Grundsätzlich senden wir 90 von Nuvoton nach Arduino und 4e00 von Arduino nach Nuvoton. Aus den Schnappschüssen auf dem seriellen Monitor geht hervor, dass sowohl SPI-Master als auch Slave wie erwartet funktionieren.
Sie können das unten verlinkte Video ansehen, um eine vollständige Demonstration dieses Tutorials zu erhalten. Ich hoffe, Ihnen hat der Artikel gefallen und Sie haben etwas Nützliches gelernt. Wenn Sie Fragen haben, können Sie diese im Kommentarbereich unten hinterlassen oder in unseren Foren andere technische Fragen stellen.