Spi-Blinksignale während des normalen Betriebs. Was ist eine SPI-Schnittstelle

SPI (Serial Peripheral Interface) ist ein serieller, synchroner Vollduplex-Datenübertragungsstandard, der von Motorola entwickelt wurde, um eine einfache und kostengünstige Anbindung von Mikrocontrollern und Peripheriegeräten zu ermöglichen. SPI wird manchmal auch als Vierdrahtschnittstelle bezeichnet SPI ist ein synchrones Protokoll, bei dem jede Übertragung mit einem gemeinsamen Taktsignal synchronisiert wird, das vom Host (Prozessor) generiert wird. Das empfangende Peripheriegerät (Slave) synchronisiert den Empfang der Bitfolge mit dem Taktsignal. Mehrere ICs können mit einer einzelnen seriellen Peripherieschnittstelle eines Master-IC verbunden werden. Der Master wählt den zu sendenden Slave aus, indem er das Chipauswahlsignal auf dem Slave-Chip aktiviert. Nicht vom Prozessor ausgewählte Peripheriegeräte nehmen nicht an der SPI-Übertragung teil.
SPI verwendet vier digitale Signale:

  • MOSI oder SI - Master-Ausgang, Slave-Eingang (englisch Master Out Slave In). Dient zur Datenübertragung vom Master zum Slave;
  • MISO oder SO - Master-Eingang, Slave-Ausgang (englisch Master In Slave Out). Dient zur Datenübertragung vom Slave zum Master.
  • SCK oder SCLK - serielles Taktsignal (engl. Serial CLocK). Dient zur Übertragung eines Taktsignals für Slave-Geräte.
  • CS oder SS - Chipauswahl, Slaveauswahl (engl. Chip Select, Slave Select) In der Regel erfolgt die Auswahl eines Chips durch einen niedrigen Logikpegel.

Abhängig von der Polarität und den Taktphasenkombinationen gibt es vier Modi des SPI-Betriebs.

SPI-Modus Zeitdiagramm
SPI0-Modus

SPI1-Modus
Aktiver Impulspegel ist hoch.

SPI2-Modus

Erst einrasten, dann verschieben.

SPI3-Modus
Der aktive Impulspegel ist niedrig.
Erst verschieben, dann schnappen.

Die Tabelle akzeptiert:

  • MSB – höchstwertiges Bit;
  • LSB ist das niedrigstwertige Bit.

Der Master muss sich auf den vom Slave verwendeten Modus einstellen.
Beim Datenaustausch über die SPI-Schnittstelle kann der Mikrocontroller als Master (Master-Modus) oder als Slave (Slave-Modus) arbeiten. In diesem Fall kann der Benutzer die folgenden Parameter einstellen:

  • Betriebsart laut Tabelle;
  • Übertragungsgeschwindigkeit;
  • Übertragungsformat (vom niederwertigsten zum höchstwertigen Bit oder umgekehrt).

Die Verbindung zweier Mikrocontroller nach der Struktur Master - Slave über die SPI-Schnittstelle erfolgt nach folgendem Schema.

Die SCK-, CS-Pins für den Master-Mikrocontroller sind Ausgänge und die Slave-Mikrocontroller sind Eingänge.

Die Datenübertragung erfolgt wie folgt. Beim Schreiben in das SPI-Datenregister des Master-Mikrocontrollers wird der Taktsignalgenerator des SPI-Moduls gestartet und die Daten werden bitweise an den MOSI-Pin und entsprechend an den MOSI-Pin des Slaves ausgegeben Mikrocontroller. Nach Ausgabe des letzten Bits des aktuellen Bytes stoppt der Taktgeber bei gleichzeitigem Setzen des "End of Transmission"-Flags auf "1". Wenn Interrupts vom SPI-Modul unterstützt und aktiviert werden, wird eine Interrupt-Anfrage generiert. Danach kann der Master-Mikrocontroller mit der Übertragung des nächsten Bytes beginnen oder ihn durch Anlegen einer logischen „1“-Spannung an den SS-Eingang des Slaves in den Wartezustand versetzen.

Gleichzeitig mit der Übertragung von Daten vom Master zum Slave erfolgt eine Übertragung in entgegengesetzter Richtung, sofern am SS-Eingang des Slaves eine Low-Pegel-Spannung anliegt. Somit werden in jedem Schaltzyklus Daten zwischen Geräten ausgetauscht. Am Ende jedes Zyklus wird das Interrupt-Flag sowohl im Master-Mikrocontroller als auch im Slave auf "1" gesetzt. Empfangene Bytes werden zur späteren Verwendung in Empfangspuffern gespeichert.

Beim Empfang von Daten muss das empfangene Byte aus dem SPI-Datenregister gelesen werden, bevor das letzte Bit des nächsten Bytes in das Schieberegister gelangt. Andernfalls geht das erste Byte verloren.

Der SS-Pin dient zur Auswahl des aktiven Slaves und ist im Slave-Modus immer ein Eingang. Jedes Mal, wenn der SS-Pin auf logisch 1 gesetzt wird, wird das SPI-Modul zurückgesetzt. Wenn die Zustandsänderung dieses Pins während der Datenübertragung auftritt, werden sowohl der Empfang als auch die Übertragung sofort gestoppt, und die gesendeten und empfangenen Bytes gehen verloren.

Wenn sich der Mikrocontroller im Master-Modus befindet, ist die Richtung der Datenübertragung durch den SS-Pin benutzerdefiniert. Wenn ein Pin als Ausgang konfiguriert ist, fungiert er als Allzweck-Pin und hat keinen Einfluss auf den Betrieb des SPI-Moduls. In der Regel wird es in diesem Fall verwendet, um den SS-Pin des im Slave-Modus arbeitenden Mikrocontrollers zu steuern.

Wenn der Pin als Eingang konfiguriert ist, muss er mit Strom versorgt werden, damit das SPI-Modul ordnungsgemäß funktioniert. hohes Level. Das Anlegen einer niedrigen Spannung an diesen Eingang von einem beliebigen externen Schaltkreis wird vom SPI-Modul als Wahl des Mikrocontrollers als Slave wahrgenommen (in diesem Fall werden Daten dorthin übertragen).

Ein Beispiel für die Verwendung der SPI-Schnittstelle für STM32-Mikrocontroller ist gut beschrieben in

Mit Nennwerten von 10 Ohm bis 1 MΩ);

  • Verbindungsdrähte (zum Beispiel hier ist so ein gutes Set);
  • Personal Computer mit der Entwicklungsumgebung Arduino IDE.
  • 1 Beschreibung der Serie SPI-Schnittstelle

    SPI - Serial Peripheral Interface oder "Serial Peripheral Interface" ist ein synchrones Kommunikationsprotokoll für die Kopplung Master-Gerät Mit Peripheriegeräte(Sklave). Das Master-Gerät ist oft ein Mikrocontroller. Geräte kommunizieren über vier Drähte, weshalb SPI manchmal auch als „Vier-Draht-Schnittstelle“ bezeichnet wird. Hier die Reifen:

    Es gibt vier Übertragungsmodi ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), aufgrund der Kombination der Polarität der Taktimpulse (wir arbeiten auf HIGH- oder LOW-Pegel), Taktpolarität, CPOL, und die Phase der Taktimpulse (Synchronisation auf die Vorder- oder Rückflanke des Taktimpulses), Taktphase, CPHA.

    Die Abbildung erläutert diese Tabelle.

    Die SPI-Schnittstelle bietet mehrere Möglichkeiten zum Anschluss von Slave-Geräten: unabhängig Und Kaskadierung. Bei einer unabhängigen Verbindung zum SPI-Bus greift das Master-Gerät einzeln auf jedes Slave-Gerät zu. Bei einer Kaskadenschaltung arbeiten die Slave-Geräte der Reihe nach wie in einer Kaskade.


    Arten von Verbindungsgeräten, die über die SPI-Schnittstelle arbeiten: unabhängig und kaskadiert

    2 Implementierung der SPI-Schnittstelle auf Platinen der Arduino-Familie

    Im Arduino befinden sich die SPI-Schnittstellenbusse an bestimmten Ports. Jedes Board hat seine eigene Pinbelegung. Der Einfachheit halber werden die Schlussfolgerungen dupliziert und auch auf einer separaten Seite platziert. ICSP-Anschluss(Bei der seriellen Schaltungsprogrammierung Programmieren eines in einer Schaltung enthaltenen Geräts unter Verwendung eines seriellen Protokolls). Bitte beachten Sie, dass es am ICSP-Anschluss keinen Slave-Select-Pin - SS gibt. Es wird davon ausgegangen, dass der Arduino als Master-Gerät im Netzwerk verwendet wird. Bei Bedarf können Sie jedoch jeden digitalen Arduino-Pin als SS zuweisen.

    Die Abbildung zeigt die Standardentsprechung von Pins zu SPI-Bussen für Arduino UNO und Nano.


    3 Bibliothek für die Arbeit mit SPI-Schnittstelle

    Für Arduino wurde eine spezielle Bibliothek geschrieben, die das SPI-Protokoll implementiert. Es verbindet sich wie folgt: Fügen Sie am Anfang des Programms hinzu #include SPI.h.

    Um mit der Arbeit am SPI-Protokoll zu beginnen, müssen Sie die Einstellungen festlegen und dann das Protokoll mithilfe des Verfahrens initialisieren SPI.beginTransaction(). Sie können dies mit einer einzigen Anweisung tun: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0))

    Das bedeutet, dass wir das SPI-Protokoll mit einer Frequenz von 14 MHz initialisieren, die Datenübertragung beginnt beim MSB (höchstwertiges Bit) im SPI_MODE0-Modus.

    Wählen Sie nach der Initialisierung das Slave-Gerät aus, indem Sie den entsprechenden SS-Pin auf den Status setzen NIEDRIG.

    Dann übertragen wir die Daten mit dem Befehl an das Slave-Gerät SPI.transfer().

    Nach der Übergabe geben wir die SS an den Staat zurück HOCH.


    Die Arbeit mit dem Protokoll wird mit dem Befehl abgeschlossen SPI.endTransaction().

    Es ist wünschenswert, die Übertragungsausführungszeit zwischen den Anweisungen SPI.beginTransaction() und SPI.endTransaction() zu minimieren, damit es nicht zu Überschneidungen kommt, wenn ein anderes Gerät versucht, die Datenübertragung mit unterschiedlichen Einstellungen zu initialisieren.

    4 Anschließen eines Schieberegisters zu Arduino

    In Betracht ziehen praktischer Nutzen SPI-Schnittstelle. Wir werden die LEDs beleuchten, indem wir ein 8-Bit-Schieberegister über den SPI-Bus ansteuern. Verbinden Sie sich mit Arduino Schieberegister 74HC595. An jeden der 8 Ausgänge des Registers schließen wir über einen Begrenzungswiderstand eine LED mit einem Nennwert von 220 Ohm an. Das Schema ist in der Abbildung dargestellt.


    5 Skizze der Schieberegistersteuerungüber SPI-Schnittstelle

    Lassen Sie uns eine Skizze schreiben.

    #enthalten const int pinSelect = 8; // Auswahlstift registrieren ungültige Einrichtung () ( SPI.begin(); // Initialisierung der SPI-Schnittstelle pinMode(pinSelect, OUTPUT); // DigitalWrite (PinSelect, LOW); // Slave auswählen (Register) SPI.transfer (0); // lösche den Inhalt des Registers digitalWrite (pinSelect, HIGH); // Ende der Übertragung Serial.begin (9600); } Leere Schleife () ( für (int i=0; i )

    Zuerst verbinden wir die SPI-Bibliothek und initialisieren die SPI-Schnittstelle. Lassen Sie uns Pin 8 als SS-Slave-Select-Pin definieren. Löschen Sie das Schieberegister, indem Sie ihm den Wert "0" senden. Initialisieren Sie die serielle Schnittstelle.

    Zum Aufleuchten einer bestimmten LED mit Schieberegister, müssen Sie eine 8-Bit-Zahl auf seinen Eingang anwenden. Um beispielsweise die erste LED zum Leuchten zu bringen, liefern wir die Binärzahl 00000001, für die zweite - 00000010, für die dritte - 00000100 usw. Diese Binärzahlen bilden in das dezimale Zahlensystem übersetzt folgende Folge: 1, 2, 4, 8, 16, 32, 64, 128 und sind Zweierpotenzen von 0 bis 7.

    Dementsprechend im Kreislauf Schleife() durch die Anzahl der LEDs berechnen wir von 0 bis 7 neu. Funktion pow(Basis, Exponent) erhöht 2 mit dem Schleifenzähler. Mikrocontroller arbeiten nicht sehr genau mit Zahlen vom Typ "double", daher verwenden wir die Rundungsfunktion, um das Ergebnis in eine Ganzzahl umzuwandeln. runden(). Und wir übertragen die resultierende Zahl in das Schieberegister. Der Übersichtlichkeit halber zeigt der Monitor der seriellen Schnittstelle die Werte an, die während dieses Vorgangs erhalten werden: unity "läuft" durch die Entladungen - die LEDs leuchten wellenförmig auf.

    6 "Laufende Welle" von LEDs

    Die LEDs leuchten der Reihe nach auf und wir beobachten eine laufende "Welle" von Lichtern. Die LEDs werden über ein Schieberegister angesteuert, an das wir über die SPI-Schnittstelle angeschlossen sind. Infolgedessen werden nur 3 Arduino-Pins verwendet, um 8 LEDs zu steuern. Wenn wir die LEDs direkt an die digitalen Arduino-Anschlüsse anschließen würden, müssten wir für jede LED einen separaten Anschluss verwenden.

    Wir haben das einfachste Beispiel für die Arbeit von Arduino mit dem SPI-Bus untersucht. Schauen wir uns die Funktionsweise mehrerer Schieberegister mit unabhängigen und Kaskadenschaltungen in einem separaten Artikel genauer an.

    SPI - Serial Peripheral Interface - seriell

    periphere Schnittstelle

    SPI ist ein serieller synchroner Datenübertragungsstandard zwischen Mikroschaltungen im Vollduplexmodus.

    Diese Schnittstelle wurde ursprünglich von Motorola entwickelt, um eine einfache und kostengünstige Anbindung von Mikrocontrollern und Peripheriegeräten zu ermöglichen, und wird derzeit in Produkten vieler Hersteller verwendet.

    Die SPI-Schnittstelle ist neben I2C eine der am weitesten verbreiteten Schnittstellen zum Verbinden von Chips. Sein Name ist eine Abkürzung für „Serial Peripheral Interface“ (englisch, SPI-Bus -

    SPI-Bus), der seinen Zweck widerspiegelt - ein Bus zum Anschließen externer Geräte. Der SPI-Bus ist auf Master-Slave-Basis organisiert. Der Busmaster ist normalerweise ein Mikrocontroller, kann aber auch eine programmierbare Logik, ein DSP-Controller oder ein ASIC sein. Bus mit dem Master verbunden Externe Geräte einen Slave-Bus bilden. Ihre Rolle spielen verschiedene Arten von Mikroschaltkreisen, inkl. Speichergeräte (EEPROM, Flash-Speicher, SRAM), Echtzeituhr (RTC), ADC/DAC, digitale Potentiometer, spezialisierte Steuerungen usw.

    Hauptbestandteil der SPI-Schnittstelle ist ein herkömmliches Schieberegister, dessen Synchronisations- und Bitstrom-Ein-/Ausgangssignale die Schnittstellensignale bilden. Daher wird das SPI-Protokoll korrekterweise nicht als Datenübertragungsprotokoll bezeichnet, sondern als Datenaustauschprotokoll zwischen zwei Schieberegistern, von denen jedes gleichzeitig sowohl die Funktion eines Empfängers als auch die Funktion eines Senders ausführt.

    1. Elektrische Verbindung

    IN anders als die standardmäßige serielle Schnittstelle (engl. Standard Serial Port ), SPI ist eine synchrone Schnittstelle, bei der jede Übertragung mit einem gemeinsamen Taktsignal synchronisiert wird, das vom Master (Prozessor) generiert wird. Das empfangende Peripheriegerät (Slave) synchronisiert den Empfang der Bitfolge mit dem Taktsignal. Mehrere ICs können mit einer einzelnen seriellen Peripherieschnittstelle eines Master-IC verbunden werden. Der Master wählt den Slave zur Übertragung aus, indem er das Chip-Select-Signal auf dem Slave-Chip aktiviert. Nicht vom Prozessor ausgewählte Peripheriegeräte nehmen nicht teil

    bei SPI-Übertragung.

    SPI verwendet vier digitale Signale:

    MOSI (Eng. Master Out Slave In) - Master-Ausgang (alternative Bezeichnung DO, SDO, DOUT), Eingang eines Slave-Geräts zum seriellen Datenempfang (alternative Bezeichnung DI, SDI, DIN). Wird verwendet, um Daten vom Master zum Slave zu übertragen.

    MISO (Eng. Master In Slave Out) - Eingang des Master-Gerätes zum seriellen Datenempfang (alternative Bezeichnung DI, SDI, DIN), Ausgang des Slave-Gerätes zur seriellen Datenübertragung (alternative Bezeichnung DO, SDO, DOUT). Dient zur Datenübertragung vom Slave zum Master.

    SCLK (engl. Serial clock) - serielles Taktsignal (alternative Bezeichnung DCLOCK, CLK, SCK). Dient zur Übertragung eines Taktsignals für Slave-Geräte.

    CS oder SS - Chipauswahl, Slave-Auswahl

    (Englisch Chip Select, Slave Select).

    Es gibt drei Arten der Verbindung zum SPI-Bus, die jeweils vier Signale umfassen. Die einfachste Verbindung, an der nur zwei Mikroschaltkreise beteiligt sind, ist in Abbildung 1 dargestellt.

    Reis. 1. Die einfachste Verbindung zum SPI-Bus

    Hier überträgt der Busmaster Daten auf der MOSI-Leitung synchron mit seinem eigenen erzeugten SCLK-Signal, und der Slave erfasst die übertragenen Datenbits an bestimmten Flanken des empfangenen Taktsignals. Gleichzeitig sendet der Slave sein Datenpaket. Das dargestellte Schema kann vereinfacht werden, indem die MISO-Leitung weggelassen wird, wenn der verwendete Slave-IC keine Rücksendung von Daten vorsieht oder nicht erforderlich ist. Einseitige Datenübertragung findet sich in solchen Mikroschaltungen wie DACs, digitalen Potentiometern, programmierbaren Verstärkern und Treibern. Somit erfordert die betrachtete Möglichkeit, einen Slave-IC anzuschließen, 3 oder 4 Kommunikationsleitungen. Damit der Slave-IC Daten empfangen und senden kann, ist es zusätzlich zum Vorhandensein eines Taktsignals auch erforderlich, dass die SS-Leitung niedrig angesteuert wird. Andernfalls ist der Slave-IC inaktiv. Wenn nur ein externer IC verwendet wird, kann es verlockend sein, auch die SS-Leitung auszuschließen, indem der Auswahleingang des Slave-IC hart auf Low gesetzt wird. Eine solche Lösung ist höchst unerwünscht und kann zu Ausfällen oder sogar zur Unmöglichkeit der Datenübertragung führen, weil. Der Chip-Select-Eingang dient dazu, den IC in seinen Anfangszustand zurückzusetzen, und initiiert manchmal die Ausgabe des ersten Datenbits.

    Wenn mehrere Mikroschaltungen an den SPI-Bus angeschlossen werden müssen, wird entweder eine unabhängige (parallele) Verbindung (Abb. 2) oder eine Kaskadenverbindung (seriell) (Abb. 3) verwendet.

    Reis. 2. Unabhängige Verbindung zum SPI-Bus

    Reis. 3. Kaskadierung zum SPI-Bus

    Eine unabhängige Verbindung ist häufiger, weil. mit beliebigen SPI-kompatiblen Chips erreicht werden. Hier werden alle Signale bis auf die Chipwahl parallel geschaltet und der Busmaster legt durch Überführen des einen oder anderen SS-Signals in einen Low-Zustand fest, mit welchem ​​Slave-IC er Daten austauscht. Der Hauptnachteil einer solchen Verbindung ist die Notwendigkeit zusätzlicher Leitungen zum Adressieren von Slave-Mikroschaltungen (die Gesamtzahl der Kommunikationsleitungen beträgt 3 + n, wobei n die Anzahl der Slave-Mikroschaltungen ist). Kaskadierung ist frei von diesem Mangel, weil hier ab

    mehrere Mikroschaltungen bilden ein großes Schieberegister. Dazu wird der Sendedatenausgang des einen ICs mit dem Empfangsdateneingang des anderen verbunden, wie in Bild 3 dargestellt. Die Chip-Select-Eingänge sind hier parallel geschaltet, sodass die Gesamtzahl der Kommunikationsleitungen bei 4 gehalten wird Eine Kaskadierung ist jedoch nur möglich, wenn deren Unterstützung in der Dokumentation der verwendeten Chips angegeben ist. Um das herauszufinden, ist es wichtig zu wissen, dass eine solche Verbindung im Englischen „Daisy-Chaining“ heißt.

    2. Übertragungsprotokoll

    Das SPI-Übertragungsprotokoll ist äußerst einfach und in der Tat identisch mit der Logik des Schieberegisters, das darin besteht, eine Schiebeoperation und dementsprechend eine bitweise Eingabe und Ausgabe von Daten an bestimmten Flanken des Synchronisationssignals durchzuführen . Das Setzen von Daten beim Senden und das Abrufen beim Empfang werden immer an entgegengesetzten Taktflanken durchgeführt. Dies ist notwendig, um sicherzustellen, dass Daten abgerufen werden, nachdem sie zuverlässig ermittelt wurden. Berücksichtigt man, dass die steigende oder fallende Flanke als erste Flanke im Sendezyklus fungieren kann, dann gibt es vier mögliche Optionen für die Logik der SPI-Schnittstelle. Diese Optionen werden als SPI-Modi bezeichnet und durch zwei Parameter beschrieben:

    CPOL - der Anfangspegel des Synchronisationssignals (wenn CPOL=0, dann hat die Synchronisationsleitung vor Beginn des Übertragungszyklus und nach seinem Ende einen niedrigen Pegel (d. h. die erste Flanke steigt und die letzte Flanke fällt), andernfalls, wenn CPOL=1, - hoch (d. h. die erste Front fällt und die letzte steigt));

    CPHA - Synchronisationsphase; Dieser Parameter bestimmt die Reihenfolge, in der Daten gesetzt und abgetastet werden (wenn CPHA=0, dann werden die Daten auf der steigenden Flanke im Synchronisationszyklus abgetastet und dann auf der fallenden Flanke werden die Daten gesetzt

    Daten; wenn CPHA = 1, dann werden Daten an der steigenden Flanke des Taktzyklus gesetzt und an der fallenden Flanke abgerufen).

    Die Master- und Slave-Chips, die in unterschiedlichen SPI-Modi arbeiten, sind nicht kompatibel, daher ist es wichtig zu klären, welche Modi vom Busmaster unterstützt werden, bevor Slave-Chips ausgewählt werden. In Mikrocontroller integrierte SPI-Hardwaremodule unterstützen in den meisten Fällen die Möglichkeit, einen beliebigen SPI-Modus auszuwählen, und daher können beliebige SPI-Slave-Mikroschaltungen an sie angeschlossen werden (gilt nur für eine unabhängige Verbindungsoption). Darüber hinaus lässt sich das SPI-Protokoll in jedem der Modi einfach in Software implementieren.

    Tab. 1. SPI-Modi

    Vorübergehend

    Diagramm

    Synchronisation

    3. Vergleich mit I2C-Bus

    Wie bereits erwähnt, ist 2-Draht zum Andocken von Mikroschaltkreisen nicht weniger beliebt. Serien Bus I2 C. Nachfolgend finden Sie die Vorteile, die dieser oder jener serielle Bus bietet.

    Vorteile des SPI-Busses

    Vorteile des I2C-Busses

    Extreme Einfachheit des Protokolls

    Übertragung auf der physikalischen Schicht

    sorgt für hohe Zuverlässigkeit u

    Übertragungsgeschwindigkeit. begrenzen

    Die SPI-Busgeschwindigkeit wird gemessen

    Der I2C-Bus bleibt zweiadrig,

    zehn Megahertz und damit es

    unabhängig von der Nummer

    ideal zum streamen

    Mikroschaltung daran angeschlossen.

    große Datenmengen und weit

    in hoher Geschwindigkeit verwendet

    DAC/ADC, LED-Treiber

    Displays und Speicherchips

    Alle SPI-Buslinien sind

    unidirektional, was wichtig ist

    Multi-Master-Fähigkeit

    vereinfacht die Problemlösung

    Betrieb bei Anschluss an den Bus

    Level-Konvertierungen und

    mehrere führende Mikroschaltungen.

    galvanische Trennung von Mikrokreisen

    Das I2C-Protokoll ist mehr

    standardisiert, also

    Einfache Softwareimplementierung

    I2C-Chip-Benutzer mehr

    SPI-Protokoll.

    vor Problemen geschützt

    Inkompatibilität der ausgewählten

    Komponenten.

    4. Abgeleitete und kompatible Protokolle

    MIKROWELLEN.

    Das MICROWIRE-Protokoll von National Semiconductor ist identisch mit dem SPI-Protokoll im Modus 0 (CPOL = 0, CPHA = 0).

    Maxim 3-Draht-Schnittstelle

    Der Unterschied zu dieser Schnittstelle besteht darin, dass statt einer Vollduplex-Übertragung über zwei unidirektionale Leitungen eine Halbduplex-Übertragung über eine bidirektionale DQ-Leitung erfolgt.

    QSPI

    Ein höheres Protokoll als SPI, das eine automatisierte Datenübertragung ohne CPU-Beteiligung ermöglicht.

    Darüber hinaus ist die SPI-Schnittstelle die Grundlage für den Aufbau einer Reihe von spezialisierten Schnittstellen, einschließlich. JTAG-Debugging-Schnittstelle und Flash-Speicherkarten-Schnittstellen, inkl. SD und MMC.

    Anweisung

    SPI- Serielle Peripherieschnittstelle oder "Serielle Peripherieschnittstelle" ist ein synchrones Übertragungsprotokoll zur Kopplung eines Mastergeräts (Master) mit Peripheriegeräten (Slave). Das Master-Gerät ist oft . Geräte kommunizieren über vier Drähte, weshalb SPI manchmal auch als „Vier-Draht-Schnittstelle“ bezeichnet wird. Hier die Reifen:
    MOSI (Master-Out-Slave-In)- Datenübertragungsleitung von Master- zu Slave-Geräten;
    MISO (Master-In-Slave-Out)- Übertragungsleitung vom Slave zum Master;
    SCLK (serielle Uhr)- vom Master generierter Synchronisationstakt;
    SS (Slave-Auswahl)- Auswahllinie für Slave-Geräte; wenn die Leitung "0" ist, "versteht" das Slave-Gerät, dass jetzt auf es zugegriffen wird.
    Es gibt vier Datenübertragungsmodi (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3) aufgrund der Kombination der Taktpolarität (wir arbeiten auf dem HIGH- oder LOW-Pegel), Taktpolarität, CPOL, und die Phase der Taktimpulse (Synchronisation auf die Vorder- oder Rückflanke des Taktimpulses), Taktphase, CPHA.
    Die Abbildung zeigt zwei Optionen zum Verbinden von Geräten mit dem SPI-Protokoll: unabhängig und kaskadiert. Bei einer unabhängigen Verbindung zum SPI-Bus greift das Master-Gerät einzeln auf jedes Slave-Gerät zu. Mit Kaskade - Die Geräte arbeiten der Reihe nach in einer Kaskade.

    Im Arduino befinden sich die SPI-Schnittstellenbusse an bestimmten Ports. Jedes Board hat seine eigene Pinbelegung. Der Einfachheit halber werden die Schlussfolgerungen dupliziert und auch auf einem separaten ICSP-Anschluss platziert (In Circuit Serial Programming, ein in der Schaltung enthaltenes Gerät, das ein serielles Protokoll verwendet). Bitte beachten Sie, dass es am ICSP-Anschluss keinen Slave-Select-Pin - SS gibt. Es wird davon ausgegangen, dass der Arduino als Master-Gerät im Netzwerk verwendet wird. Aber bei Bedarf können Sie jeden Arduino-Pin als SS zuweisen.
    Die Abbildung zeigt die Standardentsprechung von Pins zu SPI-Bussen für Arduino UNO und Nano.

    Für Arduino wurde ein spezielles geschrieben, das das SPI-Protokoll implementiert. Es verbindet sich wie folgt: Fügen Sie am Anfang des Programms hinzu #include SPI.h
    Um mit dem SPI-Protokoll zu arbeiten, müssen Sie die Einstellungen festlegen und dann das Protokoll mit der Prozedur SPI.beginTransaction() initialisieren. Sie können dies mit einer einzigen Anweisung tun: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0)).
    Das heißt, wir initialisieren das SPI-Protokoll bei 14 MHz, die Daten werden ab dem MSB (höchstwertiges Bit) im „0“-Modus übertragen.
    Nach der Initialisierung wählen wir das Slave-Gerät aus, indem wir den entsprechenden SS-Pin in den LOW-Zustand überführen.
    Anschließend übertragen wir die Daten mit dem Befehl SPI.transfer() an das Slave-Gerät.
    Nach der Übertragung bringen wir SS in den HIGH-Zustand zurück.
    Die Arbeit mit dem Protokoll wird mit dem Befehl SPI.endTransaction() abgeschlossen. Es ist wünschenswert, die Übertragungsausführungszeit zwischen den Anweisungen SPI.beginTransaction() und SPI.endTransaction() zu minimieren, damit es nicht zu Überschneidungen kommt, wenn ein anderes Gerät versucht, die Datenübertragung mit unterschiedlichen Einstellungen zu initialisieren.

    Betrachten Sie die praktische Anwendung der SPI-Schnittstelle. Wir werden die LEDs beleuchten, indem wir ein 8-Bit-Schieberegister über den SPI-Bus ansteuern. Verbinden Sie das Register 74HC595 mit Arduino. Wir werden eine LED an jeden der 8 Ausgänge anschließen (über einen Begrenzungswiderstand). Das Schema ist in der Abbildung dargestellt.

    Lassen Sie uns eine Skizze schreiben.
    Zuerst verbinden wir die SPI-Bibliothek und initialisieren die SPI-Schnittstelle. Lassen Sie uns Pin 8 als Slave-Select-Pin definieren. Löschen Sie das Schieberegister, indem Sie ihm den Wert "0" senden. Initialisieren Sie die serielle Schnittstelle.
    Um eine bestimmte LED mit einem Schieberegister zum Leuchten zu bringen, müssen Sie eine 8-Bit-Zahl an ihren Eingang anlegen. Um beispielsweise die erste LED zum Leuchten zu bringen, liefern wir die Binärzahl 00000001, für die zweite - 00000010, für die dritte - 00000100 usw. Diese in das dezimale Zahlensystem übersetzten Binärzahlen bilden folgende Folge: 1, 2, 4, 8, 16, 32, 64, 128 und sind Potenzen von 0 bis 7.
    Dementsprechend berechnen wir in der Schleife loop() anhand der Anzahl der LEDs von 0 bis 7. Funktion pow(Basis, Exponent) erhöht 2 mit dem Schleifenzähler. Mikrocontroller arbeiten nicht sehr genau mit Zahlen vom Typ "double", daher verwenden wir die Funktion round(), um das Ergebnis in eine ganze Zahl umzuwandeln. Und wir übertragen die resultierende Zahl in das Schieberegister. Zur Verdeutlichung zeigt der Monitor der seriellen Schnittstelle die Werte an, die bei diesem Vorgang erhalten werden: Die Eins zieht sich durch die Ziffern – die LEDs leuchten in einer Welle auf.

    Einführung

    SPI (3-Draht) ist eine beliebte Schnittstelle für den seriellen Datenaustausch zwischen Mikroschaltungen. Die SPI-Schnittstelle ist zusammen mit I 2 C eine der am häufigsten verwendeten Schnittstellen zum Verbinden von Mikroschaltungen. Es wurde ursprünglich von Motorola erfunden und wird derzeit in den Produkten vieler Hersteller verwendet. Sein Name ist eine Abkürzung für „Serial Peripheral Bus“, was seinen Zweck widerspiegelt – ein Bus zum Anschluss externer Geräte. Der SPI-Bus ist auf Master-Slave-Basis organisiert. Der Busmaster ist normalerweise ein Mikrocontroller, kann aber auch eine programmierbare Logik, ein DSP-Controller oder ein ASIC sein. Die an den Master-Bus angeschlossenen externen Geräte bilden den Slave-Bus. Ihre Rolle spielen verschiedene Arten von Mikroschaltkreisen, inkl. Speichergeräte (EEPROM, Flash-Speicher, SRAM), Echtzeituhr (RTC), ADC/DAC, digitale Potentiometer, spezialisierte Steuerungen usw.

    Hauptbestandteil der SPI-Schnittstelle ist ein herkömmliches Schieberegister, dessen Synchronisations- und Bitstrom-Ein-/Ausgangssignale die Schnittstellensignale bilden. Daher wird das SPI-Protokoll korrekterweise nicht als Datenübertragungsprotokoll bezeichnet, sondern als Datenaustauschprotokoll zwischen zwei Schieberegistern, von denen jedes gleichzeitig sowohl die Funktion eines Empfängers als auch die Funktion eines Senders ausführt. Unabdingbare Voraussetzung für die Datenübertragung auf dem SPI-Bus ist die Generierung eines Bustaktsignals. Dieses Signal hat das Recht, nur den Master-Bus zu erzeugen, und der Betrieb des Slave-Bus hängt vollständig von diesem Signal ab.

    Elektrische Verbindung

    Es gibt drei Arten der Verbindung zum SPI-Bus, die jeweils vier Signale beinhalten (siehe Tabelle 1 für ihre Haupt- und alternativen Bezeichnungen). Die einfachste Verbindung, an der nur zwei Chips beteiligt sind, ist in Bild 1 dargestellt. Hier überträgt der Busmaster Daten auf der MOSI-Leitung synchron zu dem von ihm erzeugten SCLK-Signal, und der Slave fängt die übertragenen Datenbits an bestimmten Flanken des ein empfangenes Taktsignal. Gleichzeitig sendet der Slave sein Datenpaket. Das dargestellte Schema kann vereinfacht werden, indem die MISO-Leitung weggelassen wird, wenn der verwendete Slave-IC keine Rücksendung von Daten vorsieht oder nicht erforderlich ist. Einseitige Datenübertragung findet sich in solchen Mikroschaltungen wie DACs, digitalen Potentiometern, programmierbaren Verstärkern und Treibern. Somit erfordert die betrachtete Möglichkeit, einen Slave-IC anzuschließen, 3 oder 4 Kommunikationsleitungen. Damit der Slave-IC Daten empfangen und senden kann, ist es zusätzlich zum Vorhandensein eines Taktsignals auch erforderlich, dass die SS-Leitung niedrig angesteuert wird. Andernfalls ist der Slave-IC inaktiv. Wenn nur ein externer IC verwendet wird, kann es verlockend sein, auch die SS-Leitung auszuschließen, indem der Auswahleingang des Slave-IC hart auf Low gesetzt wird. Eine solche Lösung ist höchst unerwünscht und kann zu Ausfällen oder sogar zur Unmöglichkeit der Datenübertragung führen, weil. Der Chip-Select-Eingang dient dazu, den IC in seinen Anfangszustand zurückzusetzen, und initiiert manchmal die Ausgabe des ersten Datenbits.


    Reis. 1. Die einfachste Verbindung zum SPI-Bus

    Wenn mehrere Mikroschaltungen an den SPI-Bus angeschlossen werden müssen, wird entweder eine unabhängige (parallele) Verbindung (Abb. 2) oder eine Kaskadenverbindung (seriell) (Abb. 3) verwendet. Eine unabhängige Verbindung ist häufiger, weil. mit beliebigen SPI-kompatiblen Chips erreicht werden. Hier werden alle Signale bis auf die Chipwahl parallel geschaltet und der Busmaster legt durch Überführen des einen oder anderen SS-Signals in einen Low-Zustand fest, mit welchem ​​Slave-IC er Daten austauscht. Der Hauptnachteil einer solchen Verbindung ist die Notwendigkeit zusätzlicher Leitungen zum Adressieren von Slave-Mikroschaltungen (die Gesamtzahl der Kommunikationsleitungen beträgt 3 + n, wobei n die Anzahl der Slave-Mikroschaltungen ist). Kaskadierung ist frei von diesem Mangel, weil hier wird ein großes Schieberegister aus mehreren Mikroschaltungen gebildet. Dazu wird der Sendedatenausgang des einen ICs mit dem Empfangsdateneingang des anderen verbunden, wie in Bild 3 dargestellt. Die Chip-Select-Eingänge sind hier parallel geschaltet, sodass die Gesamtzahl der Kommunikationsleitungen bei 4 gehalten wird Eine Kaskadierung ist jedoch nur möglich, wenn deren Unterstützung in der Dokumentation der verwendeten Chips angegeben ist. Um das herauszufinden, ist es wichtig zu wissen, dass eine solche Verbindung im Englischen „Daisy-Chaining“ heißt.


    Reis. 2. Unabhängige Verbindung zum SPI-Bus


    Reis. 3. Kaskadierung zum SPI-Bus

    Übertragungsprotokoll

    Das SPI-Übertragungsprotokoll ist äußerst einfach und in der Tat identisch mit der Logik des Schieberegisters, das darin besteht, eine Schiebeoperation und dementsprechend eine bitweise Eingabe und Ausgabe von Daten an bestimmten Flanken des Synchronisationssignals durchzuführen . Das Setzen von Daten beim Senden und das Abrufen beim Empfang werden immer an entgegengesetzten Taktflanken durchgeführt. Dies ist notwendig, um sicherzustellen, dass Daten abgerufen werden, nachdem sie zuverlässig ermittelt wurden. Berücksichtigt man, dass die steigende oder fallende Flanke als erste Flanke im Sendezyklus fungieren kann, dann gibt es vier mögliche Optionen für die Logik der SPI-Schnittstelle. Diese Optionen werden als SPI-Modi bezeichnet und durch zwei Parameter beschrieben:

    • CPOL - der Anfangspegel des Synchronisationssignals (wenn CPOL=0, dann hat die Synchronisationsleitung vor Beginn des Übertragungszyklus und nach seinem Ende einen niedrigen Pegel (d. h. die erste Flanke steigt und die letzte Flanke fällt), andernfalls, wenn CPOL=1, - hoch (d. h. die erste Front fällt und die letzte steigt));
    • CPHA - Synchronisationsphase; dieser Parameter bestimmt die Reihenfolge, in der Daten gesetzt und abgerufen werden (wenn CPHA=0, dann werden die Daten auf der steigenden Flanke im Synchronisationszyklus abgetastet und dann auf der fallenden Flanke werden die Daten gesetzt; wenn CPHA= 1, dann werden die Einstelldaten auf der steigenden Flanke im Taktzyklus übernommen und auf der fallenden Flanke abgetastet). Informationen zu den SPI-Modi sind in Tabelle 2 zusammengefasst.

    Die Master- und Slave-Chips, die in unterschiedlichen SPI-Modi arbeiten, sind nicht kompatibel, daher ist es wichtig zu klären, welche Modi vom Busmaster unterstützt werden, bevor Slave-Chips ausgewählt werden. In Mikrocontroller integrierte SPI-Hardwaremodule unterstützen in den meisten Fällen die Möglichkeit, einen beliebigen SPI-Modus auszuwählen, und daher können beliebige SPI-Slave-Mikroschaltungen an sie angeschlossen werden (gilt nur für eine unabhängige Verbindungsoption). Darüber hinaus lässt sich das SPI-Protokoll in jedem der Modi einfach in Software implementieren.

    Vergleich mit Stromschiene I 2 C

    Wie bereits erwähnt, ist der serielle 2-Draht-Bus I 2 C nicht weniger beliebt zum Andocken von Mikroschaltungen. Unten sehen Sie die Vorteile, die dieser oder jener serielle Bus bietet.

    Vorteile des SPI-Busses Vorteile des I2C-Busses
    Die extreme Einfachheit des Übertragungsprotokolls auf der physikalischen Schicht bestimmt die hohe Zuverlässigkeit und Geschwindigkeit der Übertragung. Die SPI-Bus-Geschwindigkeitsbegrenzung wird in mehreren zehn Megahertz gemessen und ist daher ideal für große Datenströme und wird häufig in Hochgeschwindigkeits-DAC/ADC, LED-Anzeigetreibern und Speicherchips verwendet Der I 2 C-Bus bleibt zweidrahtig, unabhängig von der Anzahl der daran angeschlossenen Chips.
    Alle SPI-Busleitungen sind unidirektional, was die Aufgabe der Pegelwandlung und galvanischen Trennung von Mikroschaltkreisen erheblich vereinfacht Möglichkeit des Multi-Master-Betriebs, wenn mehrere Master-Mikroschaltkreise an den Bus angeschlossen sind.
    Einfache Softwareimplementierung des SPI-Protokolls. Das I2C-Protokoll ist standardisierter, daher ist der Benutzer von I2C-Chips besser vor Inkompatibilitätsproblemen ausgewählter Komponenten geschützt.

    Abgeleitete und kompatible Protokolle

    • MIKROWELLEN.

      Das MICROWIRE-Protokoll von National Semiconductor ist identisch mit dem SPI-Protokoll im Modus 0 (CPOL = 0, CPHA = 0).

    • Maxim 3-Draht-Schnittstelle

      Der Unterschied zu dieser Schnittstelle besteht darin, dass statt einer Vollduplex-Übertragung über zwei unidirektionale Leitungen eine Halbduplex-Übertragung über eine bidirektionale DQ-Leitung erfolgt.

    • QSPI

      Ein höheres Protokoll als SPI, das eine automatisierte Datenübertragung ohne CPU-Beteiligung ermöglicht.

    Darüber hinaus ist die SPI-Schnittstelle die Grundlage für den Aufbau einer Reihe von spezialisierten Schnittstellen, einschließlich. JTAG-Debugging-Schnittstelle und Flash-Speicherkarten-Schnittstellen, inkl. SD und MMC.

    Tab. 1. Elektrische Signale des SPI-Busses

    Führende Reifen Sklavenbus
    Grundlegende Bezeichnung Alternative Notation Beschreibung Grundlegende Bezeichnung Alternative Notation Beschreibung
    MOSI TUN, SDO, DOUT MOSI DI, SDI, DIN
    MISO DI, SDI, DIN Serieller Empfangseingang MISO TUN, SDO, DOUT Serielle Ausgabe
    SCLK DCLOCK, CLK, SCK Synchronisationsausgang für die Datenübertragung SCLK DCLOCK, CLK, SCK Synchronisationseingang empfangen
    SS CS Slave-Select-Ausgang (Chip-Select) SS CS Slave-Select-Eingang (Chip-Select)


    Wird geladen...
    Spitze