Funktionen für die Datenübertragung mit spi. Serielle Schnittstelle SPI. Topologie von Kommunikationssystemen basierend auf SPI

In diesem Artikel möchte ich Kurze Review SPI-Bus (eine in der Embedded-Technologie weit verbreitete Schnittstelle zum Verbinden verschiedene Geräte) und ich werde versuchen, den Prozess der Erstellung eines Treibers auf SPI-Geräteprotokollebene für Linux zu beschreiben. Dieses Dokument bewirbt sich nicht um die Rolle komplette Anleitung, sondern zielt vielmehr darauf ab, in die richtige Richtung zu weisen. Da der Artikel nicht in der Größe eines Themas enthalten war, musste ich ihn in zwei Teile aufteilen.

0. Statt einzuführen

Was ist dieser Artikel?
Dieser Artikel ist eine Zusammenstellung von Informationen aus verschiedenen Quellen, eine freie Übersetzung einiger Teile der Dokumentation sowie meine eigenen Kommentare, Ergänzungen und Beschreibungen der aufgetretenen Probleme.

Für wen ist dieser Artikel?
Zunächst einmal für Anfänger, was ich bin. In Embedded-Linux-Foren begegnet man oft der Frage: „Wie kann ich auf diesem Board mit SPI arbeiten?“. Das will ich versuchen zu beantworten. Als Beispiel werde ich den Code geben, der geschrieben wurde, um mit meinem Test-SPI-Gerät zu arbeiten.

Artikelstruktur
Da es viele Informationen gab, ist der Artikel in mehrere Unterabschnitte unterteilt:

  1. Was ist SPI?
  2. Überblick über das SPI-Subsystem in Linux
  3. Entwickeln eines Userspace-Protokoll-SPI-Treibers mit Spidev
  4. Entwicklung des Protokoll-SPI-Kernel-Level-Treibers
  5. Dokumentation
Die ersten beiden Punkte werden im ersten Teil des Artikels enthalten sein, der Rest im zweiten.

Der erste Unterabschnitt beschreibt den Betrieb des SPI-Busses, dieser Teil des Artikels ist nicht speziell an Linux gebunden, daher kann er von denen gelesen werden, die sich nicht für Linux interessieren, aber Sie müssen sich nur über diese Schnittstelle informieren.

Der zweite Unterabschnitt beschreibt die Strukturen und Mechanismen, die der Arbeit mit SPI in Linux zugrunde liegen, er sollte gelesen werden, um zu verstehen, was im dritten und vierten Teil besprochen wird.

Wenn Sie sich nicht für meine Übersetzungen und Ergänzungen interessieren, können Sie getrost direkt zum fünften Teil gehen, wo Sie Informationen darüber finden, wo Sie alle notwendigen Informationen zu diesem Thema erhalten.

Fehler
Ich bin kein Zauberer, ich lerne nur. Wenn Sie Fehler oder Ungenauigkeiten finden, lassen Sie es mich bitte wissen.

1. Was ist SPI?

Die Abkürzung SPI bedeutet „Serial Peripheral Interface“ oder in der russischen Version „Serial periphere Schnittstelle". Der Name spricht für sich gegebene Schnittstelle früher mit verschiedenen gearbeitet Peripheriegeräte. Dies können beispielsweise verschiedene DACs/ADCs, Potentiometer, Sensoren, Input/Output (GPIO)-Expander, verschiedene Speicher und noch komplexere Peripheriegeräte wie Audio-Codecs und Ethernet-Controller sein.

Technisch gesehen ist SPI ein synchroner Vierdrahtbus. Es ist eine Verbindung von zwei synchronen Schieberegistern, die das zentrale Element eines jeden SPI-Geräts ist. Die Verbindung verwendet eine Master/Slave-Konfiguration. Nur der Master kann Takte erzeugen. Es gibt immer nur einen Master in der Schaltung (im Gegensatz zum gleichen I2C-Bus, wo eine Option mit mehr als einem Master möglich ist), die Anzahl der Slaves kann unterschiedlich sein. BEI Allgemeiner Fall Der Ausgang des Masters ist mit dem Eingang des Slaves verbunden und umgekehrt ist der Ausgang des Slaves mit dem Eingang des Masters verbunden. Wenn Taktimpulse an den SCK-Ausgang angelegt werden, werden Daten vom Master vom MOSI-Ausgang geschoben und vom Slave über den MISO-Eingang erfasst. Wenn Sie also die der Bitbreite des Schieberegisters entsprechende Anzahl von Synchronisationsimpulsen anlegen, werden die Daten in den Registern vertauscht. Daraus folgt, dass SPI immer im Vollduplexmodus arbeitet. Aber ob wir die vom Gerät empfangenen Daten bei der Aufzeichnung eines Parameters brauchen, das ist eine andere Frage. Es kommt oft vor, dass die vom Gerät empfangenen Daten beim Schreiben von Daten Müll sind. In diesem Fall werden sie einfach ignoriert, aber wir erhalten sie unabhängig von unserem Wunsch.

Der SPI-Controller wird typischerweise durch ein Peripheriegerät in einer MCU oder eMPU implementiert. In den meisten Chips kann es sowohl im Master- als auch im Slave-Modus arbeiten. Aber weiter dieser Moment Linux unterstützt nur den Master-Modus.

Es gibt mehrere Möglichkeiten, SPI-Geräte zu aktivieren.

Sie können die einfachsten in der obigen Abbildung sehen (Dank an Wikipedia für die Zeichnungen unter der freien GFDL-Lizenz). In diesem Fall werden alle Slaves bis auf das Slave-Select-Signal (~CS) parallel zum Master geschaltet. Jeder Slave benötigt ein separates Slave-Select-Signal (in der Abbildung mit SSx bezeichnet). Für Slave-Select-Signale können sowohl dedizierte SPI-Controller-Ausgänge als auch I/O-Ports verwendet werden. allgemeiner Zweck(GPIO) Mikrocontroller.

Für die Datenübertragung werden zwei Drähte verwendet, einer für die Uhr und ein Slave-Auswahlsignal für jeden der Slaves.
Beschreibung der verwendeten Signale:

  • MOSI - Master Output, Slave Input (Master-Ausgang, Slave-Eingang). Dieses Signal ist für die serielle Datenübertragung vom Master zum Slave vorgesehen. Kann auch als SDO, DO usw. bezeichnet werden.
  • MISO - Master Input, Slave Output (Master-Eingang, Slave-Ausgang). Dieses Signal ist für die serielle Datenübertragung vom Slave zum Master vorgesehen. Kann als SDI, DI usw. bezeichnet werden.
  • SCK - Serial Clock (Synchronisationssignal). Wird zur Synchronisierung beim Übertragen von Daten verwendet. Es kann auch als SCLK, CLK usw. bezeichnet werden.
  • ~CS - Chip Select (Chipauswahl). Dieses Signal aktiviert das Slave-Gerät. Es ist normalerweise invertiert, das heißt niedriges Niveau als aktiv angesehen. Es wird manchmal als ~SS (Slave Select) bezeichnet.

Ein Sonderfall der unabhängigen Verbindung ist die Option mit einem einzigen Slave. In diesem Fall möchten Sie möglicherweise das ~CS-Signal auf Masse ziehen, damit sich das Gerät immer in einem aktiven Zustand befindet. Davon wird jedoch dringend abgeraten, da das Slave-Gerät das CS-Signal zur Initialisierung oder für andere Servicezwecke verwenden kann.

Der Hauptnachteil beim unabhängigen Verbinden von Slaves besteht darin, dass für jeden der Slaves ein separates ~CS-Signal benötigt wird. Das Kaskadenverbindungsschema, in der ausländischen Literatur "Daisy-Chain" (kann als "Girlande" übersetzt werden) genannt wird, weist keinen solchen Nachteil auf.

Wie Sie der obigen Abbildung entnehmen können, verwenden wir hier gemeinsames Zeichen Sklavenauswahl für alle Sklaven. Der Ausgang jedes Slaves ist mit dem Eingang des nächsten verbunden. Der Ausgang des letzten Slaves ist mit dem Eingang des Masters verbunden und bildet so einen geschlossenen Stromkreis. Bei dieser Verbindung können wir davon ausgehen, dass die in Reihe geschalteten Geräte ein großes Schieberegister bilden. Dementsprechend können Daten "in einer Sitzung" auf alle Geräte geschrieben werden, nachdem zuvor das notwendige Paket zusammengestellt wurde, das die Daten für jedes der Geräte in der Reihenfolge kombiniert, die der physikalischen Reihenfolge der Verbindung entspricht. Aber es gibt einen subtilen Punkt. Erstens müssen alle Mikroschaltkreise diese Art der Verbindung unterstützen; Zweitens unterstützt der Linux-Kernel diese Art der Verbindung nicht. Wenn Sie ihn also trotzdem verwenden möchten, müssen Sie vorhandene Treiber ändern oder Ihre eigenen schreiben.

Es gibt vier Betriebsmodi für SPI-Geräte. Sie sorgen in der Regel bei Anfängern für die meiste Verwirrung. Diese vier Modi sind eine Kombination aus zwei Bits:

  • CPOL (Clock Polarity) - definiert Erste Ebene(Polarität) des Synchronisationssignals.
    CPOL=0 zeigt an, dass das Taktsignal niedrig beginnt, sodass die ansteigende Flanke ansteigt und die abfallende Flanke abfällt.
    CPOL = 1, das Taktsignal beginnt hoch, sodass die ansteigende Flanke fällt und die abfallende Flanke ansteigt.
  • CPHA (Clock Phase) – Synchronisationsphase, bestimmt, an welcher der Flanken des Taktsignals Daten abgetastet werden.
    CPHA=0 gibt an, dass es notwendig ist, an der steigenden Flanke abzutasten, und
    CPHA=1 gibt an, dass die Daten an der fallenden Flanke abgetastet werden müssen.
Diese beiden Bits bilden die Modusnummer. CPOL ist das High-Bit und CPHA ist das Low-Bit. Manchmal gibt die Gerätedokumentation die Modusnummer nicht explizit an, aber sie kann immer leicht aus den Timing-Diagrammen ermittelt werden. Es ist auch wichtig zu verstehen, dass die Abruf- und Setzdaten immer an entgegengesetzten Flanken des Taktsignals auftreten. Lassen Sie unser Gerät beispielsweise im Modus 0 arbeiten (der häufigste Fall), in diesem Fall liest das Slave-Gerät das Datenbit vom MOSI-Eingang bei der steigenden Flanke des Taktsignals und Master-Gerät liest auch bei steigender Flanke Daten vom Slave am MISO-Eingang. Zur besseren Übersicht gebe ich Wellenformen für alle vier Betriebsarten an:

Diese Abbildung zeigt die Signale MOSI (blaue Linie) und SCK (gelbe Linie). In allen Fällen wird die Zahl 0x64 übertragen. Licht Vertikale Linien zeigen den Moment der Datenerfassung. Betrachten wir Modus 2, für den, wie wir uns erinnern, CPOL=1 und CPHA=0 ist. Somit sehen wir, dass das Synchronisationssignal anfänglich hat hohes Niveau, und die Abtastung wird an der Vorderflanke (in diesem Fall fallend) durchgeführt. Da mein Oszilloskop nur zwei Kanäle hat, werden die Signale ~CS und MISO nicht angezeigt. Aber in diesem Fall sind sie nicht so interessant, zum Beispiel ist das ~CS-Signal nur ein "Ausfall" während der gesamten Datenübertragung.

2. Überblick über das SPI-Subsystem in Linux

Linux-SPI-Treiber sind in zwei Teile unterteilt. Der erste sind die SPI-Controller-Treiber, die direkt mit der Hardware eines bestimmten Controllers arbeiten. Solche Treiber bestimmen, wie der Controller konfiguriert wird, welche Aktionen beim Umschalten in den Energiesparmodus (Suspend) und beim Beenden (Resume) zu ergreifen sind, die Auswahl der nächsten Übertragung (spi_transfer) aus der Übertragungswarteschlange in der Nachricht (spi_message, über Warteschlangen direkt darunter ) und direkt an den Port gesendet, der auch als aktivieren/deaktivieren definiert ist bestimmtes Gerätüber CS (Funktionen cs_activate/cs_deactivate). In diesem Artikel werde ich nicht beschreiben angegebenen Typ Fahrer. In der Regel sind sie bereits für die MCU / eMPU implementiert, auf der sich ein Linux-Port befindet, und Sie müssen nur dann mit den Händen hineingreifen, wenn Sie eine bestimmte Funktion wie Chip Select Decoding benötigen, um die aktivieren zu können gewünschtes Slave-Gerät über eine externe Logik. Manchmal ist das sinnvoll, zum Beispiel bei fehlendem GPIO.

Der zweite Teil sind die Protokolltreiber, die für die Arbeit mit verschiedenen Slave-Geräten verwendet werden, die an den SPI-Bus angeschlossen sind. Diese Treiber werden "Protokoll" genannt, weil sie nur verschiedene Daten von Slave-Geräten senden und empfangen, während sie nicht direkt mit irgendeiner Hardware arbeiten. Es ist diese Art von Treiber, die für uns am interessantesten ist, da sie es uns ermöglicht, dem System Unterstützung für das interessierende Slave-Gerät hinzuzufügen, und wir werden es in Betracht ziehen.

Die meisten Protokolltreiber sind Kernelmodule. Wenn das Gerät beispielsweise ein SPI-verbundener Audiocodec ist, verwendet der Treiber auch die von ALSA bereitgestellten Funktionen, und Programme (z. B. madplay) können damit über das Zeichengerät /dev/audio arbeiten. ohne die geringste Ahnung zu haben, wie es hardwaremäßig aufgebaut ist und an welchem ​​Bus es angeschlossen ist.

Der Kernel bietet auch einen Allzweck-Protokolltreiber namens Spidev mit einer Zeichengeräteschnittstelle. Es ermöglicht den Halbduplex-Zugriff auf einen SPI-Slave unter Verwendung von Standard Systemaufrufe read() und write(), stellen den Betriebsmodus ein und führen eine Vollduplex-Kommunikation über ioctl()-Aufrufe durch.

Daher können Protokolltreiber für SPI-Geräte in zwei Typen unterteilt werden:

  • Userspace-Treiber, die im Userspace arbeiten und gewöhnliche Programme in jeder Sprache sind, die mit einem SPI-Gerät arbeiten, indem sie das entsprechende Spidev-Zeichengerät lesen / schreiben.
  • Treiber, die im Kernelspace ausgeführt werden und über Gerätedateien im /dev-Verzeichnis oder über Attribute im Geräteverzeichnis in sysfs eine Schnittstelle zum Userspace bereitstellen.
Alle Aufrufe an SPI-Geräte werden von Linux in eine Warteschlange gestellt. Die SPI-Protokolltreiber arbeiten explizit oder implizit mit Nachrichten, die durch die Struktur struct spi_message dargestellt werden, die eine SPI-Transaktion mit mehreren Segmenten ist.
struct spi_message ( struct list_head transfers; struct spi_device *spi; unsigned is_dma_mapped:1; void (*complete)(void *context); void *context; unsigned actual_length; int status; struct list_head queue; void *state; );
Übertragungen - verknüpfte Liste der übertragenen Segmente in der Transaktion (Übertragungen);
spi – ein Zeiger auf das spi-Gerät, in dem die Nachricht eingereiht ist;
is_dma_maped – wenn dieses Flag wahr ist, dann werden sowohl virtuelle DMA- als auch CPU-Adressen für jeden Sendepuffer bereitgestellt;
complete – ein Rückruf, der aufgerufen wird, um das Ende der Transaktion mitzuteilen;
Kontext ist das Argument für den Rückruf von complete();
Ist-Länge ist die Gesamtzahl von Bytes, die bei allen erfolgreichen Übertragungen übertragen wurden;
status - 0 bei Erfolg oder ein negativer Wert mit errno bei Fehler;

Stichworte:

  • Linux
  • Spi
  • spidev
  • eingebettet
  • Kernel-Modul
Tags hinzufügen

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. 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. 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 umfassen (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 ab 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 wird verwendet, um den IC an seinen zu übertragen der Anfangszustand 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. Unabhängige Verbindung 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ätzliche Zeilen zum Adressieren von Slave-Mikroschaltungen (die Gesamtzahl von Kommunikationsleitungen ist 3+n, wobei n die Anzahl von 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)

SPI(Serieller Peripheriebus) - Serial Peripheral Exchange Protocol. Diese Punktion wurde von der Firma entwickelt Motorola, wird aber derzeit von vielen Herstellern verwendet. Es wurde entwickelt, um Mikrocontroller untereinander sowie mit allen Arten von Peripheriegeräten zu kommunizieren: Sensoren, ADCs, Speicherchips, Uhren. Allerdings ist die häufigste Verwendung SPI ist ein Programm, das in den Speicher des Mikrocontrollers geschrieben wird. Bei Mikrocontrollern AVR mit Hilfe SPI Sie können den Mikrocontroller flashen, ohne ihn von der Platine zu löten, diese Firmware-Methode wird aufgerufen ISP (In Systemprogrammierung). Obwohl die Namen SPI und ISP sehr konsonant, es ist nicht dasselbe, in AVR-SPI als physikalische Schicht verwendet ISP, das heißt, die Zeilen werden verwendet SPI für die Datenübertragung, aber das Protokoll selbst (Softwareschicht) ist anders.

Drei Leitungen werden verwendet, um Daten an SPI zu übertragen:

MISO (Master-Eingangs-Slave-Ausgang)- Auf dieser Leitung empfängt der Master (Master) Daten vom Slave (Slave).

MOSI (Master-Ausgang, Slave-Eingang)– Auf dieser Leitung sendet der Master Daten an den Slave.

SCK (serielle Uhr)- dient zur Übertragung eines Taktsignals an das Slave-Gerät.

Die Linie wird auch verwendet SS (Slave-Auswahl), die das Gerät mit dem angibt Meister werden Daten austauschen.

Da viele Hersteller SPI in ihren Geräten verwenden, können die Bezeichnungen der Pins leicht abweichen. Nachfolgend finden Sie eine Tabelle mit alternativen Namen.


SPI gibt es in zwei Formen, Hardware und Software. Bei der Implementierung von Software SPI, müssen wir das Signal manuell auf die Beine des entsprechenden setzen MISO, MOSI, SS beim Anziehen SCK. Mit Hardware-Implementierung SPI Wir übertragen Daten in ein spezielles Register, und der Mikrocontroller selbst führt die oben genannten Manipulationen gemäß den vorläufigen Einstellungen durch.

Physikalische Umsetzung SPI, besteht aus zwei miteinander verbundenen Schieberegistern.


Je nachdem welcher logische Pegel des Signals SCK, findet eine Synchronisierung statt Meister und Sklave und auf welcher Front die Daten erfasst und verschoben werden, sind 4 Modi möglich SPI.

  • CPOL = 0 – das Synchronisationssignal beginnt mit einem niedrigen Pegel;
  • CPOL = 1 – das Synchronisationssignal beginnt mit einem hohen Pegel;
  • CPHA = 0 – Daten werden an der ansteigenden Flanke des Synchronisationssignals abgetastet;
  • CPHA = 1 – Daten werden auf der fallenden Flanke des Synchronisationssignals abgetastet.
Die folgenden Oszillogramme zeigen, wie das 0x17-Paket in verschiedenen Modi aussieht.
CPOL=0 CPHA=0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL=1 CPHA=1

SPI- synchrone Schnittstelle, das heißt, um einige Daten zu erhalten Sklave, Meister sollte was schicken. Alles scheint klar zu sein, aber was wäre wenn Meister sendet ein Byte, und Sklave sollte ihm zwei zurückgeben? In diesem Fall muss ihm der Master 2 mal etwas schicken, zB 0x00.
// Befehl senden, zwei Bytes sollten als Antwort kommen Spi_Master_Transmit (chx); // etwas senden, um das erste Byte zu empfangen Spi_Master_Transmit (0X00); touch_x = SPDR; touch_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
Das ist alles, oben ist ein Codebeispiel aus einem Arbeitsentwurf.

Die synchrone serielle SPI-Schnittstelle ist für die Dateneingabe und -ausgabe in Punkt-zu-Punkt-Schnittstellen mit einem Master- (SPI-Master) und einem Slave-Gerät (SPI-Slave) ausgelegt (Abb. 1.24). Die SPI-Master-Steuerschaltung erzeugt den SCK-Takt, der gleichzeitig Signale am MOSI-Ausgang sendet und Signale am MISO-Eingang empfängt. Dieselben Taktimpulse SCK, die in den SPI-Slave eintreten, steuern den Empfang von Signalen an seinem MOSI-Eingang und die Bildung von Signalen an seinem MISO-Ausgang. Separate MOSI- und MISO-Signalkreise erleichtern die Implementierung von Vollduplex-Kommunikation.

Datenformate, Signalparameter, Timing etc. werden nicht in der Schnittstelle geregelt, die Datenaustauschrate wird beispielsweise nur durch die Frequenz der vom SPI-Master erzeugten SCK-Takte bestimmt. Die maximale Entfernung hängt von der Stärke der Signalverzerrung in den Kommunikationsleitungen ab, es wird davon ausgegangen, dass ein zuverlässiger Datenaustausch bei Entfernungen bis zu mehreren Metern möglich ist.

Im Wesentlichen ist es selbst für die physikalische Schicht keine vollwertige Schnittstelle. Tatsächlich implementiert SPI eine standardmäßige Daten-Eingabe-Ausgabe-Prozedur in Schieberegistern, keine Betriebssteuerungsalgorithmen, eine Steuerung der übertragenen Daten wird bereitgestellt. Alle notwendigen Kontrollvorgänge müssen vom SPI-Master durchgeführt werden. Dies erfordert einerseits Zusätzliche Mittel Steuerung, und andererseits vereinfacht es die Implementierung der SPI-Schnittstelle selbst. Der SPI-Slave ist ein Standard-Schieberegister mit der erforderlichen Anzahl von Datenbits.

Beispielsweise unterstützen Mikrocontroller der AVR-Familie von ATMEL I/O-Daten sowohl im SPI-Master- als auch im SPI-Slave-Modus. Der Standard-Austauschzyklus beinhaltet die gleichzeitige Übertragung eines Datenbytes in beide Richtungen (Abb. 1.24). Bei der Übertragung von Multibyte-Nachrichten muss der SPI-Slave ein Schieberegister mit der entsprechenden Bittiefe enthalten, und der SPI-Master muss den Austausch der erforderlichen Sequenz von Datenbytes steuern, jedes Byte nach dem nächsten Standard-Schnittstellenbetriebszyklus verarbeiten und sicherstellen Beginn des nächsten Standardaustauschzyklus.

wird nicht nur für den Datenaustausch zwischen Mikrocontrollern verwendet, sondern auch für die Verbindung von Mikrocontrollern mit externen ADCs (ADC) und DACs (DAC), Speicherchips - SRAM, FRAM, SEERAM und vielen anderen Geräten. Aufgrund des seriellen Datenformats und der einfachen logischen Organisation der SPI-Schnittstelle werden diese Mikroschaltungen in kompakten 8- bis 16-poligen Gehäusen hergestellt. Im Tisch. 1.6 zeigt Beispiele von Mikroschaltungen für verschiedene Funktionszwecke und von verschiedenen Herstellern mit einer SPI-Schnittstelle. Diese Beispiele zeigen, dass das serielle Schnittstellenformat die Anzahl der benötigten E/A-Leitungen erheblich reduzieren kann.

Tabelle 1.6

Chip-Typ

Hauptparameter

Art der Schale

Hersteller

24 Bit, Delta-Sigma, 15 Hz

24 Bit, Delta-Sigma, 41 kHz

16 Bit, SAR, 100 kHz

16 Bit, PulsAR, 500 kHz

12 Bit, U-Ausgang, 2,5 µs

16-Bit, U-out, 10 µs

14 Bit, I-out, 0,04 µs

12 Bit, I-out, 0,6 µs

16-Bit, U-out, 1 µs

www.maximic.com

Chip-Typ

Hauptparameter

Art der Schale

Hersteller

16 kbps, 1 Billion

4 kBit, unbegrenzt

64 kbps, unbegrenzt

256K, 32768×8, 0,1 Mio. Zyklen

8K, 1024×8, 0,1 Mio. Zyklen

16K, 8192×8, 0,1 Mio. Zyklen

128 K, 16384 × 8, 0,1 Mio. Zyklen

256K, 32768×8, 0,1 Mio. Zyklen

Thermosensor

13 Bit, -40 bis +150 °C (±0,5 °C)

Eines der häufig zu lösenden Probleme in Automatisierungstools hängt mit der begrenzten Anzahl von I/O-Leitungen von Mikrocontrollern zusammen. Typischerweise übersteigt die Anzahl der übertragenen Signale die Möglichkeiten von Parallelanschlüssen bei weitem, aber die Verarbeitungsalgorithmen für die meisten übertragenen Signale lassen zusätzliche Zeitverzögerungen zu, die mit ihrer Übertragung in einem seriellen Format verbunden sind. In diesen Fällen ist die Verwendung von Standard-Reihen-Parallel-Registern effektiv.

Beispielsweise kann die SPI-Schnittstelle zum Lesen der Statusinformationen einer großen Anzahl von Ein/Aus-Sensoren oder zum Eingeben von Mehrbitdaten in einem parallelen Format nützlich sein. Für diese Zwecke bietet es sich an, getrennte Register mit parallelem Schreiben und seriellem Lesen (8-Bit Parallel-In / Serial-Out Shift Register) zu verwenden, zB CD74HCT166 (Abb. 1.25).

Das Schema zum Anschluss von sechzehn Ein-Aus-Sensoren (S1 - S16) über die SPI-Schnittstelle des Mikrocontrollers ist in Abb. 1.26. Es ist zu beachten, dass vor dem Start des Betriebs der SPI-Schnittstelle ein Signal zum Schreiben von Informationen in Register von den parallelen Eingängen D0-D7 generiert werden muss. Dazu können Sie einen der Ausgänge des Mikrocontrollers verwenden, in dieses Beispiel PC0.

Reis. 1.25. Funktionsdiagramm Registrieren Sie CD74HCT166

Reis. 1.26. An/Aus-Sensoren an die SPI-Schnittstelle anschließen

Reis. 1.27. Anschließen einer sechsstelligen Anzeige an die SPI-Schnittstelle

Unter Verwendung von Registern mit serieller Aufzeichnung und paralleler Ausgabe von Informationen (8-Bit Serial-In, Parallel-Out Shift Register) - SN74HC595, kann die SPI-Schnittstelle auch für die parallele Multibyte-Ausgabe von Informationen verwendet werden. Als Beispiel in Abb. 1.27 zeigt das Anschlussschema einer sechsstelligen Siebensegmentanzeige an den Mikrocontroller. Im Gegensatz zum vorherigen Schema muss das parallele Ausgangssignal (PB1) nach dem Ende der Datenübertragung durch die SPI-Schnittstelle über die Schnittstelle hinaus erzeugt werden. Beispielsweise sollte der Algorithmus zur Interaktion mit der Schnittstelle eine Steuerung der Anzahl der übertragenen Datenbytes vorsehen, und nachdem die Übertragung des letzten Bytes abgeschlossen ist, muss zusätzlich ein paralleles Ausgangssignal übertragen werden.