Was ist eine 4-Draht-SPI-Schnittstelle? Wie man mit SPI arbeitet – Theorie. Signal-Timing-Diagramm

Heute beginnen wir unsere Bekanntschaft mit dem Reifen SPI (Serielle Peripherieschnittstelle).

Dieser Bus wird sehr häufig in der Elektronik verwendet. Da es synchron und vollduplex arbeitet, ist es sehr praktisch und wird daher in vielen Schaltkreisen für die Kommunikation zwischen verschiedenen digitalen Geräten verwendet – Sensoren, Controllern, Treibern und anderen Geräten.

Ein weiterer wichtiger Faktor für die Notwendigkeit, uns damit vertraut zu machen, ist, dass dieser Bus in Hardware in Controllern organisiert ist AVR.

Darüber hinaus kommunizieren wir, ob wir es wollen oder nicht, schon lange mit der SPI-Schnittstelle, sobald wir zum ersten Mal mit dem Flashen unseres Controllers begonnen haben, da er über diese Schnittstelle geflasht wird.

Deshalb möchte ich diesen Reifen näher kennenlernen.

Öffnen wir die technische Dokumentation für den Atmega8-Controller, öffnen wir die Seite, auf der die Pinbelegung dieses Controllers angezeigt wird, und sehen wir, dass von den Pins 16 bis 19 SPI-Bus-Pins vorhanden sind

Nun etwas mehr zu diesen Erkenntnissen

SS (Chipauswahl)– Dies ist die Geräteauswahlstrecke. Wenn das Slave-Gerät an diesem Pin auf Low geht, dann Dieses Gerät antwortet und tauscht Informationen über den SPI-Bus aus; wenn er hoch ist, wird er nicht reagieren.

MOSI (Master-Ausgang, Slave-Eingang)- Dies ist der Ausgangspin des Master-Geräts und der Eingang des Slave-Geräts.

MISO (Master-Eingang, Slave-Ausgang)- im Gegenteil, der Ausgang des Slaves, der Eingang des Masters.

SCK— Synchronisationsbein. Alle am Informationsaustausch auf diesem Bus beteiligten Geräte werden mit Taktimpulsen einer bestimmten Frequenz versorgt.

Hier ist ein Diagramm der Implementierung des SPI-Busses im Atmega8-Controller

Wie bei jedem Bus gibt es eine Reihe von Registern, die bestimmte Informationen speichern.

Uns interessiert das SHIFT REGISTER, darüber werden Informationen ausgetauscht. Sobald es eine bestimmte Flanke am Synchronisationspin gibt, entweder absteigend oder aufsteigend, je nach Einstellung, tauschen diese Register der Slave- und Master-Geräte Informationen aus, und zwar nicht alle Informationen, sondern nur ein Bit. Diese Register werden nach links verschoben und die höchstwertigen Bits jedes Registers werden zu den niedrigstwertigen Bits desselben Registers des zugehörigen Geräts verschoben. Das heißt, der Slave überträgt sein höchstwertiges Bit über den MOSI-Pin an den Leader, der es aufgrund der Linksverschiebung in das frei gewordene niederwertige Bit schreibt, und der Slave überträgt sein verschobenes höherwertiges Bit über den MISO Pin mit dem niederwertigen Bit des Leaders verbinden. So läuft der Austausch ab, das heißt, in 8 vollen Taktzyklen werden die Bytes vollständig ausgetauscht

Sobald alle 8 Bits eines Informationsbytes übertragen sind, wird uns dies ein bestimmtes Register signalisieren dieser Prozess fertig. Oder besser gesagt, ein bestimmtes Stück eines bestimmten Registers.

Außerdem sehen wir im Blockdiagramm einen Teiler, dessen Eingang Taktimpulse empfängt und diese dann durch einen bestimmten Wert dividiert, über eine Kette an den SCK-Zweig gesendet und von dort an das Slave-Gerät auf demselben Zweig geliefert werden. Dadurch wird ein synchronisierter Betrieb der Geräte gewährleistet. Als Taktfrequenz wird die niedrigste ausgewählt, die von allen am Austausch teilnehmenden Geräten unterstützt wird.

Ich sage Plural, weil es in einem bestimmten Stromkreis mehr als nur zwei Geräte geben kann. Wie das sichergestellt wird, sofern die Geräte keine Adressen haben, verrate ich euch jetzt.

Es gibt mehrere Möglichkeiten, Informationen zwischen mehreren Geräten auszutauschen, d. h. wenn es mehrere Slaves pro Master-Gerät gibt. Wir werden uns die beiden häufigsten davon ansehen.

Die erste Methode ist radial (klicken Sie auf das Bild, um das Bild zu vergrößern)

Hier leitet der Master Daten an ein bestimmtes Gerät und schaltet den SS-Pin auf logisch 0. Bei dieser Methode ist es möglich, nur ein Gerät auszuwählen. Sie benötigen außerdem mehrere freie Pins der Controller-Ports.

Es gibt noch eine weitere interessante Methode – Ring oder Kaskade (klicken Sie auf das Bild, um das Bild zu vergrößern)

Hier sehen wir, dass die Auswahlabschnitte alle parallel sind und der Austausch im Kreis verläuft. Somit verringert sich die Geschwindigkeit aufgrund der Tatsache, dass der Übertragungskreis zunimmt, aber die Backbordstrecken werden eingespart.

All dies werden wir in den nächsten Lektionen genauer untersuchen, wenn wir bestimmte Geräte in unseren Projekten verwenden.

Nun, es scheint mit der Schaltung der Datenübertragung über den Bus zu sein SPI Wir haben es herausgefunden.

Lassen Sie uns nun herausfinden, wie dieser Prozess auf der Ebene der Hardwareregister des AVR-Controllers gesteuert wird.

Wir sehen diese Register im Blockdiagramm oben auf der Seite.

Atmega8 verfügt über die folgenden Register zur Bedienung des SPI-Busses.

SPDR (SPI-Datenregister)- Datenregister, im Blockdiagramm ist es DATA BUFFER. In dieses Register geben wir ein Byte für die anschließende Übertragung an das Slave-Gerät ein und lesen daraus das Informationsbyte, das vom Slave-Gerät kam. Es ist auch nicht notwendig, dass unser Controller das Master-Gerät ist. Anschließend bauen wir eine Schaltung aus zwei Controllern zusammen, von denen einer ein Slave sein wird. In diesem Register befindet sich also das Byte für das Senden und Empfangen.

SPCR (SPI-Steuerregister)- Kontrollregister

Dieses Register enthält die folgenden Bits:

SPIE (SPI Interrupt Enable)- ein Bit, das Interrupts ermöglicht.

SPE (SPI-Aktivierung)– ein Bit, das den SPI-Bus aktiviert.

DORD (Datenauftrag)– ein Bit, das die Reihenfolge festlegt, in der Bits gesendet werden. Wenn es auf 1 gesetzt ist, wird das niedrigstwertige Bit zuerst gesendet, wenn es auf 0 gesetzt ist, wird das höchstwertige Bit gesendet.

MSTR (Master/Slave-Auswahl)– ein Bit, das ein Gerät als Master oder Slave kennzeichnet. Wenn dieses Bit auf 1 gesetzt ist, ist das Gerät der Master.

CPOL (Taktpolarität)— Synchronisationspolarität, bestimmt, bei welcher Flanke des Synchronisationsimpulses der Standby-Modus eingeleitet wird

Wenn dieses Bit 1 ist, haben wir einen Standby-Modus mit einer aufsteigenden Flanke, und wenn es 0 ist, dann mit einer absteigenden Flanke.

CPHA (Taktphase)– ein Bit, das für die Taktphase verantwortlich ist, d. h., an welcher Flanke das Bit übertragen wird.

Schauen wir uns die Datenübertragungsdiagramme je nach Installation von CPOL und CPHA an

Das ist so eine interessante Abhängigkeit. Manchmal sehen wir manchmal rein technische Spezifikationen Bei jedem Gerät, das beispielsweise im SPI 0:0- und SPI 1:1-Modus betrieben werden kann, geht es genau darum, diese Bits zu setzen.

SPR1, SPR0 (Auswahl der SPI-Taktrate)- Dies sind die Bits, die für den Wert des Synchronisationsfrequenzteilers verantwortlich sind. Sie arbeiten mit dem Bit zusammen SPI2X befindet sich im Statusregister. Es ist auch ein Kontrollbit, da acht Bits im Kontrollregister nicht für alle Einstellungen ausreichten und es im Statusregister viele freie Bits gibt.

SPSR (SPI-Statusregister)- Statusregister

SPI2X (Double SPI Speed ​​​​Bit)- ein Bit, das die Geschwindigkeit verdoppelt und in Verbindung mit den SPR1- und SPR0-Bits des Steuerregisters arbeitet.

Sehen wir uns die Abhängigkeit der Frequenz von diesen drei Bits an

SPIF (SPI-Interrupt-Flag)— Interrupt-Flag. Wir warten darauf, dass dieses Bit auf eins gesetzt wird. wenn wir ein Byte empfangen. Sobald das Byte von einem anderen Gerät vollständig in unserem Puffer erscheint, wird dieses Flag gesetzt. Dieses Flag funktioniert nur, wenn das Bit, das Interrupts aktiviert, gesetzt ist und globale Interrupts aktiviert sind.

WCOL (COLlision-Flag schreiben)— Das Konflikt- oder Kollisionsflag wird gesetzt, wenn während der Datenübertragung ein Bitkonflikt auftritt, wenn während der Datenübertragung versucht wird, in das Datenregister zu schreiben.

Nun können wir sagen, dass wir mit der SPI-Schnittstelle ein wenig vertraut sind.

Sehen Sie sich das VIDEO-TUTORIAL an(klicken Sie auf das Bild)

Beitragsaufrufe: 6.294

SPI(Serieller Peripheriebus) – serielles Peripherie-Austauschprotokoll. Dieses Piercing wurde von entwickelt Motorola, wird aber derzeit von vielen Herstellern verwendet. Es wurde entwickelt, um Mikrocontroller untereinander sowie mit allen Arten von Peripheriegeräten zu verbinden: Sensoren, ADCs, Speicherchips, Uhren. Aber immer noch die häufigste Verwendung SPI- Dabei wird ein Programm in den Speicher des Mikrocontrollers geschrieben. In Mikrocontrollern AVR mit Hilfe SPI Sie können den Mikrocontroller flashen, ohne ihn von der Platine abzulöten. Diese Flash-Methode wird aufgerufen ISP (In Systemprogrammierung). Obwohl die Namen SPI Und ISP sehr konsonant, sie sind nicht dasselbe AVR-SPI als physikalische Schicht verwendet ISP, das heißt, es werden Linien verwendet SPI für die Datenübertragung, aber das Protokoll selbst (Softwareebene) ist anders.

Zur Datenübertragung an SPI werden drei Leitungen verwendet:

MISO (Master-Eingang, Slave-Ausgang)– über diese Leitung empfängt der Master (Master) Daten vom Slave (Slave).

MOSI (Master-Ausgang, Slave-Eingang)– Über diese Leitung sendet der Master Daten an den Slave.

SCK (Serielle Uhr)– dient der Übertragung eines Taktsignals an das Slave-Gerät.

Linie wird ebenfalls verwendet SS (Slave-Auswahl), die das Gerät definiert, mit dem Meister wird Daten austauschen.

Da viele Hersteller SPI in ihren Geräten verwenden, können die Pin-Namen leicht abweichen. Unten finden Sie eine Tabelle mit alternativen Namen.


Es gibt zwei Arten von SPI: Hardware und Software. Bei der Implementierung von Software SPI, müssen wir das Signal manuell an den entsprechenden Beinen einstellen MISO, MOSI, SS beim Ziehen SCK. Mit Hardware-Implementierung SPI Wir übertragen die Daten in ein spezielles Register und der Mikrocontroller selbst führt die oben beschriebenen Manipulationen entsprechend den Voreinstellungen durch.

Physische Umsetzung SPI, stellt zwei miteinander verbundene Schieberegister dar.


Abhängig vom logischen Signalpegel SCK, erfolgt die Synchronisierung Meister Und Sklave und auf welcher Front die Daten erfasst und verschoben werden, sind 4 Modi möglich SPI.

  • CPOL = 0 – das Synchronisationssignal beginnt auf einem niedrigen Pegel;
  • CPOL = 1 – das Synchronisationssignal beginnt auf einem hohen Pegel;
  • CPHA = 0 – Daten werden an der ansteigenden Flanke des Synchronisationssignals abgetastet;
  • CPHA = 1 – Daten werden an der fallenden Flanke des Synchronisationssignals abgetastet.
Die folgenden Oszillogramme zeigen, wie das Paket 0x17 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 empfangen Sklave, Meister sollte etwas schicken. Alles scheint klar, aber was wäre, wenn Meister sendet ein Byte und Sklave Soll ich ihm zwei zurückgeben? In diesem Fall sollte ihm der Master zweimal etwas senden, zum Beispiel 0x00.
//den Befehl senden, die Antwort sollte zwei Bytes lang sein 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, das obige Codebeispiel stammt aus einem Arbeitsprojekt.

Serielle Peripherieschnittstelle oder SPI- serielle Peripherieschnittstelle, die für die Kommunikation zwischen Peripheriegeräten und Mikrocontroller verwendet wird. Das Peripheriegerät könnte zum Beispiel sein: Display, verschiedene Sensoren, FLASH-Speicher, SD-Karte (ja, ja, die SD-Karte oder das „Flash-Laufwerk“, mit dem Sie in Telefonen und Kameras verwenden, kommuniziert Außenweltüber die SPI-Schnittstelle) usw.

Leider gibt es für die SPI-Schnittstelle keine offizielle Dokumentation, daher basiert dieser Beitrag auf verschiedenen Artikeln im Internet, meinen eigenen Erfahrungen und Dokumentationen zu Mikrocontrollern.

Lesen Sie in den Wikipedia-Artikeln, was SPI ist

IN SPI Es gibt immer einen Master und einen/mehrere Slaves.

Der Datentransfer wird immer vom Master initiiert.

SPI verwendet vier Kommunikationsleitungen:

  • MOSI oder S.I.- Master-Ausgang, Slave-Eingang (Englisch) MeisterAusSklaveIn). Dient der Datenübertragung vom Mastergerät zum Slave.
  • MISO oder ALSO- Master-Eingang, Slave-Ausgang (Englisch) MeisterInSklaveAus). Dient der Datenübertragung von einem Slave-Gerät zu einem Master-Gerät.
  • SCLK oder SCK- serielles Taktsignal SeriellUhr). Dient zur Übertragung eines Taktsignals für Slave-Geräte.
  • C.S. oder SS- Wahl der Mikroschaltung, Wahl des Slaves (dt. Chip-Auswahl, Slave-Auswahl).

P.S. Um eine unidirektionale Kommunikation mit einem Gerät sicherzustellen, reicht die Verwendung aus SCLK, MOSI(falls das Slave-Gerät nur empfängt) oder SCLK, MISO(für den Fall, dass das Slave-Gerät nichts empfängt, sondern nur Informationen sendet). Am Eingang C.S. Das Slave-Gerät muss auf logisch eingestellt sein null, sonst funktioniert der Slave nicht.

P.S. Wenn das Slave-Gerät sowohl sendet als auch empfängt, können Sie sich auf drei Drähte beschränken – MISO, MOSI, SCLK, am Eingang C.S. Das Slave-Gerät muss auch die Logik festlegen null.

SPI kann in einem Mikrocontroller implementiert werden Hardware, dann wird die Aufgabe der Schnittstellenverwaltung für jeden Mikrocontroller separat gelöst, weil Implementierungen können variieren. Zum Beispiel, z ATmega328Р(Mikrocontroller von Atmel) beim Arbeiten mit SPI Wir müssen es programmgesteuert installieren SS logisch null bei Beginn des Empfangs/der Übertragung und logisch einstellen Einheit zurück am Ende der Übertragung.

Um Daten an ein Slave-Gerät zu übertragen, müssen Sie Folgendes tun Schieberegister MASTER (im Bild ist das Schieberegister des Masters „ 8-Bit-Schieberegister") aufschreiben Byte der übertragenen Informationen. Gleichzeitig automatisch SCK wird anfangen zu generieren Taktsignal. Dies ist die Hardware-Implementierung.

Wenn im Mikrocontroller keine Hardware-Unterstützung für SPI vorhanden ist, dann die Schnittstelle SPI kann immer in Software implementiert werden, d.h. erstellen ein Programm, das die Controller-Beine gemäß dem SP-Austauschprotokoll steuert.

Unterschiede in der SPI-Schnittstellenimplementierung

Slave-Mikroschaltungen können das über SPI empfangene Signal unterschiedlich „interpretieren“, der Unterschied kann in folgenden Punkten liegen:

  • in der Menge der zu übertragenden Daten oder Packungsgrösse, normalerweise das 8 Bit, aber es gibt noch mehr
  • in Bitreihenfolge, anfangs höchstwertiges Bit oder zuerst niedrigstwertige Bit
  • Von Auf welchem ​​Taktsignalpegel werden die Daten übertragen?(nach logischer Einheit (HIGH) oder logischer Null (LOW))
  • Von Auf welche Impulsflanke erfolgt die Synchronisation?(Aufstieg oder Abstieg), kurz „Synchronisationsphase“ genannt

Kombination " Taktsignalpegel" Und " Synchronisationsphasen» ist in den Spezifikationen definiert als SPI-Betriebsarten. Es sind nur 4:

Modus Signalpegel (CPOL) Phase (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

In der Spalte „ Signalpegel» 1, bedeutet, dass Datenbit, akzeptiert Sklave wann Null wird entlang der Synchronisationsleitung übertragen, mit anderen Worten - ein Slave-Gerät erwartet und akzeptiert im eingeschalteten Zustand keine Daten SCK auf logisch 1 gesetzt.

In der Spalte „ Phase» 1, bedeutet, dass das Synchronisationssignal bestimmt wird durch fallende Flanke des Taktimpulses, und logisch 0-l Von steigende Flanke des Taktimpulses.

P.S. Wenn außerdem in der Spalte „ Signalpegel" Eingerichtet 1, dann ist die fallende und steigende Front, wenn sie im Diagramm dargestellt ist, „ Beine hoch».

Auf Diagrammen, Daten 4 Modi lässt sich wie folgt darstellen:

Weitere Informationen zu den Funktionsprinzipien von SPI finden Sie im Artikel

http://www.kit-e.ru/articles/interface/2009_03_53.php

Implementierung von SPI auf ATmega-Mikrocontrollern der AVR-Serie (ATmega328P) und „frühen“ Motorola-Mikrocontrollern

In einem Mikrocontroller ATmega328P(Mikrocontroller der Atmel AVR-Serie) können Sie Folgendes steuern Parameter SPI:

Zur Konfiguration und Steuerung der SPI-Schnittstelle werden drei Register verwendet:

  • Kontrollregister - SPCR
  • Statusregister - SPSR
  • Datenregister - SPDR

Lesen Sie mehr über jeden von ihnen...

Kontrollregister – « SPCR» 0x2C, Adresse für die Aufnahme 0x4C

— Logische Einheit in 7. Bit(Bitname SPIE) – SPI-Interrupts aktivieren(Ein Interrupt tritt auf, wenn das Interrupt-Aktivierungsbit des globalen Registers gesetzt ist SREG(7. Bit)). Nachdem die Byteübertragung abgeschlossen ist, wird ein Interrupt generiert.

— Logische Einheit in 6. Bit(Bitname - SPE) - einstecken SS, MOSI, MISO Und SCK zu den Ports des ATmega328P Mikrocontrollers - PB2, PB3, PB4, PB5.

— Logische Einheit in 5. Bit(Bitname DORD) – wird das entsprechend bestimmen SPI zuerst übermittelt Junior-Rang, A dann der Älteste– „LSB“-Modus. Eine logische Null hingegen bedeutet, dass zuerst das höchstwertige Bit und dann das niedrigstwertige Bit übertragen wird – „MSB“-Modus.

— Logische Einheit in 4. Bit(Bitname - MSTR) — Aktivieren Sie den Moderatormodus, Null – Slave-Modus aktivieren

— Logische Einheit in 3. Bit(Bitname CPOL) (Sync-Signalpolarität oder Sync-Pegel) – Synchronisation erfolgt gem Mangel an Impuls(logische Null) oder das Taktsignal im Standby-Zustand ist gleich 1. Logische Null – die Synchronisation erfolgt durch das Vorhandensein eines Impulses (durch eine logische Eins) oder das Taktsignal im Standby-Zustand ist gleich 0. Entlang welcher Front (Abstieg oder Anstieg) die Synchronisation durchgeführt wird, wird bestimmt 2 bisschen ( CPHA).

— Logische Einheit in 2. Bit(Bitname CPHA) (Synchronisationsphase) – bestimmt das Synchronisationssignal bestimmt durch die fallende Flanke von SCK und logische Null bei steigender Flanke SCK. Wenn CPOL außerdem auf 1 gesetzt ist, können die fallenden und steigenden Fronten im Diagramm „verkehrt herum“ dargestellt werden.

1 Und 0 bisschen mit bisschen SPI2x im Register SPSR bestimmen SPI-Datenrate(oder Taktrate über SCK). Diese Bits haben nur für den Master eine Bedeutung; für den Slave sind sie bedeutungslos, weil Die Empfangsgeschwindigkeit hängt von der SCK-Frequenz des Masters ab.

Wo fosc die Taktfrequenz des SPI-Masteroszillators (normalerweise entspricht sie der Prozessortaktfrequenz).

Statusregister – „SPSR“(Adresse im ATmega328P zum Lesen 0x2D, Adresse für die Aufnahme 0x4D, wenn Sie einen anderen MK haben, dann finden Sie die Adressen in der Dokumentation)

7 Registerbit " SPIF": SPI-Interrupt-Flag

Das Bit ist gesetzt Einheit, Wann Byte-Übertragung Daten über MOSI ist fertig. Wenn das SPI-Interrupt-Aktivierungsbit (SPIE-Bit) im SPCR-Register gesetzt ist, führt das Setzen des SPIF-Flags dazu, dass eine Interrupt-Anfrage generiert wird.

6 Registerbit " WCOL": COLLision Flag schreiben

Bisschen Konflikt schreiben zum Register SPDR. Das Bit ist gesetzt Einheit, wenn in Übertragungszeit Daten laufen Schreibversuch V Datenregister SPDR.

- Mit 5 Von 1 Bit – reservierte Bits, ihr Wert ist immer gleich 0

0 bisschen " SPI2X": Doppeltes SPI-Geschwindigkeitsbit

Bisschen " doppelte Geschwindigkeit Datenübertragung" Wenn das Bit geschrieben ist Einheit, Das GeschwindigkeitÜberweisungen Daten verdoppelt. Mit einer Kombination aus diesem Bit und 1 Und 0 bisschen ( SPR1, SPR0) registrieren SPCR, bestimmen Übertragungsgeschwindigkeit SPI-Daten. .

Datenregister – „SPDR“(Adresse im ATmega328P zum Lesen 0x2E, Adresse für die Aufnahme 0x4E, wenn Sie einen anderen MK haben, dann finden Sie die Adressen in der Dokumentation)

Die Registergröße ist die gleiche wie oben - 8 Bit. Dieses Register wird zum Übertragen und Lesen von Daten verwendet SPI. Durch die Eingabe der Daten starten Sie den Übertragungsvorgang.

Schauen wir uns 3 Beispiele für die Arbeit mit der SPI-Schnittstelle auf dem ATmega328P in Umgebungen an:

– Arduino

#enthalten Byte x=B11000000; //übertragenes Bit Byte y= B00000000; //das empfangende Bit wird in die Variable y geschrieben void setup() ( SPI.begin(); /* SPI-Initialisierung */ /* Initialisierung in Arduino das bedeutet - eins in SS setzen - auf SS-Ausgang setzen (Slave Select oder Slave-Auswahl) - 10 Pins - 1 in den folgenden Bits des SPCR-Steuerregisters setzen: im 4. Bit (Bitname - MSTR) - Mastermodus aktivieren im 6. Bit (Bitname - SPE) - SS, MOSI, MISO anschließen und SCK an die Ports PB4, PB5, PB6, PB7 (10, 11, 12, 13 Pins in Arduino) – konfigurieren Sie die folgenden Ausgangspins: SCK (serielle Uhr oder Taktsignal) – 13-poliges MOSI (Master Out Slave In oder Daten von der Master) - 11 Pin Durch die Initialisierung über SPI.begin() ist die Konfiguration der SPI-Schnittstelle wie folgt: - die Reihenfolge der „MSB“-Bits, d. h. das höchstwertige Bit wird zuerst übertragen, dann das am wenigsten signifikant – die Synchronisation erfolgt durch das Vorhandensein eines Impulses oder eines Taktsignals im Wartezustand 0 – das Synchronisationssignal wird durch die steigende Flanke von SCK bestimmt (zwei Punkte oben zeigen an, dass der SPI-Modus in diesem Fall 0 ist). ) - Baudrate fosc/4 */ // WIR KÖNNEN EINIGE SPI-KOMMUNIKATIONSPARAMETER selbst REINITIALISIEREN // Bitsequenzen bestellen //SPI.setBitOrder(MSBFIRST); /* LSBFIRST – zuerst Junior, dann Senior MSBFIRST – zuerst Senior, dann Junior (Standardwert aus SPI.begin) */ // Häufigkeit des Datenaustauschs //SPI.setClockDivider(SPI_CLOCK_DIV4); /* ist definiert als das Verhältnis von fosc zum Koeffizienten, dessen mögliche Werte sind: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //SPI-Betriebsmodus //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 – Nullmodus SPI_MODE1 – erster Modus SPI_MODE2 – zweiter Modus SPI_MODE3 – dritter Modus */ ) void loop() ( /* IMPLEMENTIERUNG DER DATENÜBERTRAGUNG ÜBER SPI */ digitalWrite(10, HIGH); /* wir müssen festlegen es selbst in SS 1-tsu */ y=SPI.transfer(x); /* Übertragen eines bitweisen Arguments (Byte) und Empfangen einer Antwort vom Slave-Gerät, die Übertragung erfolgt durch Zuweisen des Bytewerts an das SPDR-Register und zu diesem Zeitpunkt wird automatisch ein Taktsignal an SCK (13 Pin) generiert */ digitalWrite(10, LOW); */ SPI.end(); der SPI-Bus von den Pins 10,11,12,13 */ /* Das heißt, das 6. Bit (SPE) des SPCR-Registers wird auf 0 gesetzt */ )

#enthalten

Byte x = B11000000 ; //übertragenes Bit

Byte y = B00000000 ; //Das Empfangsbit wird in die Variable y geschrieben

void setup() (

SPI. beginnen(); /* SPI-Initialisierung */

/* Initialisierung in Arduino bedeutet das

Stellen Sie das Gerät auf SS ein

Auf SS-Ausgang (Slave Select oder Slave-Auswahl) eingestellt – 10-polig

Setzen Sie die folgenden Bits des SPCR-Steuerregisters auf 1:

Im 4. Bit (Bitname – MSTR) – Master-Modus aktivieren

B 6. Bit (Bitname – SPE) – verbinden

SS, MOSI, MISO und SCK

Zu den Ports PB4, PB5, PB6, PB7

(10,11,12,13 Pins im Arduino)

Konfigurieren Sie die folgenden Ausgangspins:

SCK (serielle Uhr oder Taktsignal) – 13-polig

MOSI (Master Out Slave In oder Daten vom Master) – 11-polig

Als Ergebnis der Initialisierung über SPI.begin()

Unsere SPI-Schnittstellenkonfiguration ist wie folgt:

Die Reihenfolge der Bits ist „MSB“, d.h. Zuerst wird die höchstwertige Ziffer übertragen, dann die niederwertigste

Die Synchronisation basiert auf dem Vorhandensein eines Impulses

Oder das Taktsignal im Ruhezustand ist 0

Das Taktsignal wird durch die steigende Flanke von SCK bestimmt

(Die beiden obigen Punkte zeigen an, dass der SPI-Modus in diesem Fall 0 ist)

Baudrate fosc/4

// WIR KÖNNEN EINIGE SPI-KOMMUNIKATIONSPARAMETER selbst neu initialisieren

// Bitreihenfolge

//SPI.setBitOrder(MSBFIRST);

// Häufigkeit des Datenaustauschs

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* als Relation definiert

Fosc zu einem Koeffizienten, dessen mögliche Werte sind:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//SPI-Betriebsmodus

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 – Nullmodus

SPI_MODE1 – erster Modus

SPI_MODE2 – zweiter Modus

SPI_MODE3 – dritter Modus

Leere Schleife()

/* UMSETZUNG DER DATENÜBERTRAGUNG ÜBER SPI */

digitalWrite(10, HIGH); /* wir müssen 1-tsu selbst in SS installieren */

y = SPI. transfer(x); /* Übertragen eines bitweisen Arguments (Byte) und Empfangen einer Antwort vom Slave-Gerät

Die Übertragung erfolgt durch Zuweisung des Bytewerts an das SPDR-Register

Und zu diesem Zeitpunkt automatisch auf SCK (13 Pin)

Es wird ein Taktsignal erzeugt */

digitalWrite(10, LOW); /* Wir müssen SS auf 0 setzen */

SPI. Ende(); /* deaktiviert den SPI-Bus von den Pins 10,11,12,13 */

/* Das ist setzt 0 auf Bit 6 (SPE) des SPCR-Registers */

- Atmel Studio (AVR GCC)

#enthalten #enthalten void init_spi() ( DDRB=(1<

#enthalten

#enthalten

void init_spi() (

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//Pins für SPI konfigurieren (SS, SCK, MOSI - Ausgang, MOSI-Eingang)

// SPI-Initialisierung

// SPI-Typ: Master

// SPI-Taktrate: 2000.000 kHz

// SPI-Taktphase: Zyklusstart

// SPI-Taktpolarität: Niedrig

// SPI-Datenreihenfolge: MSB zuerst

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;

Übertragungsschnittstellen.

Es wurden viele Datenübertragungsschnittstellen entwickelt, um Daten von einem Gerät zu einem anderen oder von einem Chip zu einem anderen zu übertragen. Jede Schnittstelle hat sowohl positive als auch negative Seiten. Daher müssen Sie wissen, welche Schnittstellen es gibt, welche Vor- und Nachteile sie haben und in einer bestimmten Situation die richtige Schnittstelle zum Übertragen von Daten verwenden.

Schnittstellen gibt es mit asynchroner und synchroner Datenübertragung. Bei der synchronen Datenübertragung wird gleichzeitig mit den Daten ein Taktsignal übertragen, wodurch sich Empfänger und Sender synchronisieren können. Ein Beispiel für ein solches Protokoll ist die SPI-Schnittstelle.

Bei der asynchronen Datenübertragung gibt es kein Taktsignal. Bei solchen Leitungen besteht die Gefahr einer Fehlanpassung zwischen Empfänger und Sender, wodurch weitere Daten nicht korrekt empfangen werden. Um dies zu verhindern, führen asynchrone Schnittstellen eine periodische Synchronisierung entlang der Datenleitungen durch. Der Vorteil solcher Schnittstellen liegt in der geringeren Anzahl an Leitern, die zur Übertragung benötigt werden.

Schauen wir uns einige der beliebtesten Schnittstellen genauer an.

USART-Schnittstelle.

Die USART-Schnittstelle ist ein serieller universeller synchron-asynchroner Transceiver. In regelmäßigen Abständen werden Daten an den USART übertragen. Dieser Zeitraum wird durch die angegebene USART-Geschwindigkeit bestimmt und in Baud angegeben (Bei Zeichen, die nur Werte gleich Null oder Eins annehmen können, entspricht Baud Bits pro Sekunde). Es gibt einen allgemein akzeptierten Bereich von Standardgeschwindigkeiten: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 Baud.

Zusätzlich zu den Datenbits fügt der USART automatisch Synchronisationsmarken in den Stream ein, die sogenannten Start- und Stoppbits. Beim Empfang werden diese zusätzlichen Bits entfernt. Normalerweise trennen die Start- und Stoppbits ein Informationsbyte (8 Bits), aber es gibt USART-Implementierungen, die die Übertragung von 5, 6, 7, 8 oder 9 Bits ermöglichen. Die durch die Start- und Stoppsignale getrennten Bits stellen die minimale Sendemenge dar. Mit USART können Sie während der Übertragung zwei Stoppbits einfügen, um die Wahrscheinlichkeit einer Desynchronisierung von Empfänger und Sender bei starkem Verkehr zu verringern. Der Empfänger ignoriert das zweite Stoppbit und behandelt es als kurze Pause auf der Leitung.

Die Konvention besagt, dass der passive Zustand (bei fehlenden Daten) des USART-Ein- und -Ausgangs eine logische „1“ ist. Das Startbit ist immer eine logische „0“, daher wartet der USART-Empfänger auf einen Übergang von „1“ zu „0“ und zählt von diesem an ein Zeitintervall von der halben Dauer des Bits (die Mitte der Startbitübertragung). . Wenn in diesem Moment die Eingabe immer noch „0“ ist, beginnt der Prozess des Empfangs des Mindestpakets. Dazu zählt der Empfänger 9 Bit-Dauern hintereinander (für 8-Bit-Daten) und zeichnet den Eingangszustand zu jedem Zeitpunkt auf. Die ersten 8 Werte sind Empfangsdaten, der letzte Wert ist ein Testwert (Stoppbit). Der Stoppbitwert ist immer „1“; wenn der tatsächlich empfangene Wert abweicht, zeichnet der USART einen Fehler auf.

Um Zeitintervalle zu bilden, verfügen die sendenden und empfangenden USARTs über eine Quelle präziser Zeit (Taktung). Die Genauigkeit dieser Quelle muss so sein, dass die Summe der Fehler (Empfänger und Sender) bei der Einstellung des Zeitintervalls vom Beginn des Startimpulses bis zur Mitte des Stoppimpulses die Hälfte (oder besser noch mindestens a) nicht überschreitet Viertel) des Bitintervalls. Für eine 8-Bit-Nachricht 0,5/9,5 = 5 % (in Wirklichkeit nicht mehr als 3 %). Da es sich dabei um die Summe der Empfänger- und Senderfehler zuzüglich möglicher Signalverzerrungen auf der Leitung handelt, beträgt die empfohlene Toleranz für die USART-Taktgenauigkeit nicht mehr als 1,5 %.

Da die Taktbits einen Teil des Bitstroms belegen, ist der resultierende UART-Durchsatz nicht gleich der Verbindungsgeschwindigkeit. Bei Übertragungen im 8-Bit-8-N-1-Format belegen beispielsweise die Taktbits 20 % des Streams, was bei einer physikalischen Geschwindigkeit von 115.200 Baud eine Datenbitrate von 92.160 Bps oder 11.520 Bytes/s ergibt.

Paritätsprüfung

Das USART-Protokoll verfügt über die Fähigkeit, die Datenintegrität mithilfe der Bitparitätsmethode automatisch zu überwachen. Wenn diese Funktion aktiviert ist, ist das letzte Datenbit (das „Paritätsbit“) immer 1 oder 0, sodass die Anzahl der Einsen in einem Byte immer gerade ist.

Ablaufsteuerung

Früher konnten USART-Geräte so langsam sein, dass sie mit dem eingehenden Datenstrom nicht mithalten konnten. Um dieses Problem zu lösen, wurden USART-Module mit separaten Flusskontrollausgängen und -eingängen ausgestattet. Wenn der Eingangspuffer voll war, stellte die Logik des empfangenden USART den Sperrpegel am entsprechenden Ausgang ein und der sendende USART unterbrach die Übertragung. Später wurde die Flusskontrolle auf Kommunikationsprotokolle übertragen und die Notwendigkeit separater Flusskontrollleitungen verschwand nach und nach.

Physische Umsetzung.

USART ist ein Austauschprotokoll, d.h. Es bestimmt die Methode der Bitbildung, Byte-Übertragungsparameter, Übertragungsgeschwindigkeit usw.

Die physische Implementierung von USART kann jedoch unterschiedlich sein. Um beispielsweise Daten innerhalb einer Platine zu übertragen, werden Signale mit +5V- und 0V-Pegeln übertragen. Um Daten über große Entfernungen und zwischen Geräten zu übertragen, werden andere physikalische Spannungsniveaus und Standards verwendet, wie zum Beispiel: Stromschleife (4-20 mA), RS-232 (COM-Port), RS-485 und dergleichen.

Um „Controller“-Pegel von 0–5 V in „Standard“-Pegel umzuwandeln, gibt es eine Vielzahl spezialisierter Mikroschaltungen, beispielsweise ADM202 für RS-232.

Serielle Schnittstelle SPI

Der Name SPI ist eine Abkürzung für „Serial Peripheral Bus“, was seinen Zweck widerspiegelt – einen Bus zum Anschluss externer Geräte. Der SPI-Bus ist nach dem Master-Slave-Prinzip organisiert. Der Busmaster ist in der Regel ein Mikrocontroller, kann aber auch eine programmierbare Logik, ein DSP-Controller oder ein ASIC sein. An den Master angeschlossene Geräte sind Slaves. Ihre Rolle spielen verschiedene Arten von Mikroschaltungen, darunter. Speichergeräte (EEPROM, Flash-Speicher, SRAM), Echtzeituhr (RTC), ADC/DAC, digitale Potentiometer, spezielle Controller usw.

Der Hauptbaustein der SPI-Schnittstelle ist ein herkömmliches Schieberegister, dessen Synchronisations- und Bitstrom-Ein-/Ausgangssignale die Schnittstellensignale bilden. Daher ist es richtiger, das SPI-Protokoll nicht als Datenübertragungsprotokoll, sondern als Datenaustauschprotokoll zwischen zwei Schieberegistern zu bezeichnen, von denen jedes gleichzeitig sowohl die Funktion eines Empfängers als auch eines Senders übernimmt. Voraussetzung für die Datenübertragung auf dem SPI-Bus ist die Generierung eines Bussynchronisationssignals. Nur der Anführer hat das Recht, dieses Signal zu erzeugen, und die Arbeit des Sklaven hängt vollständig davon ab.

Verbindung.

Es gibt drei Arten der Verbindung zum SPI-Bus, bei denen es jeweils um vier Signale geht. Der Zweck von SPI-Signalen ist in Tabelle 7.1 beschrieben.

Die einfachste Verbindung, die nur zwei Mikroschaltungen umfasst, ist in Abbildung 7.2 dargestellt. Dabei überträgt der Bus-Master Daten entlang der MOSI-Leitung synchron zum von ihm erzeugten SCLK-Signal und der Slave erfasst die übertragenen Datenbits an bestimmten Flanken des empfangenen Synchronisationssignals. Gleichzeitig sendet der Slave sein Datenpaket. Die vorgestellte Schaltung lässt sich durch den Wegfall der MISO-Leitung vereinfachen, wenn der verwendete Slave-IC keine Antwortdatenübertragung vorsieht oder kein Bedarf dafür besteht. Eine unidirektionale Datenübertragung findet sich in Chips wie DACs, digitalen Potentiometern, programmierbaren Verstärkern und Treibern. Somit erfordert die betrachtete Möglichkeit zum Anschluss eines Slave-ICs 3 oder 4 Kommunikationsleitungen.

Damit der Slave-IC Daten empfangen und senden kann, muss zusätzlich zum Taktsignal auch die SS-Leitung auf Low gesetzt werden. Andernfalls ist der Slave-IC inaktiv. Wenn nur ein externer IC verwendet wird, könnte es verlockend sein, die SS-Leitung zu eliminieren, indem man den Auswahleingang des Slave-ICs hart auf Low setzt. Diese Lösung ist äußerst 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 Ausgangszustand 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. 7.3) oder eine Kaskadenverbindung (seriell) (Abb. 7.4) verwendet. Eine unabhängige Verbindung ist häufiger, weil erreicht, wenn alle SPI-kompatiblen Chips verwendet werden. Hier sind alle Signale bis auf die Auswahl der Mikroschaltungen parallel geschaltet und der Busmaster gibt durch die Überführung des einen oder anderen SS-Signals in einen Low-Zustand an, mit welchem ​​Slave-IC er Daten austauschen wird. Der Hauptnachteil dieser Verbindung ist die Notwendigkeit zusätzlicher Leitungen zur Adressierung der Slave-Chips (die Gesamtzahl der Kommunikationsleitungen beträgt 3+n, wobei n die Anzahl der Slave-Chips ist).

Wenn nicht genügend Mikrocontroller-Beine vorhanden sind, können Sie einen Demultiplexer-Chip verwenden. Der Demultiplexer verbindet je nach Code an den Steuerpins ein einzelnes Eingangssignal mit einem der Ausgangssignale. Abbildung 7.4 zeigt den Anschlussplan für den Demultiplexer. An seinen Eingang wird das SS-Signal angelegt, das einen Wert gleich 0 annimmt, wenn eine der Mikroschaltungen ausgewählt werden muss. Den AM-A0-Beinen wird die Nummer der erforderlichen Mikroschaltung im Binärcode zugeführt. Dadurch können Sie die Anzahl der im Mikrocontroller verwendeten Beine auf m=log 2 n reduzieren. Wobei n die Anzahl der Slave-Chips ist. Diese. Um 128 Geräte anzuschließen, sind 8 Mikrocontroller-Pins erforderlich. Eine zum Setzen des Freigabesignals und 7 zum Einstellen der Nummer des einzuschaltenden Chips. Es ist zu beachten, dass auf den nicht verbundenen Zweigen des Demultiplexers eine logische Eins vorhanden sein muss. Ansonsten kommt ein Signalinverter zum Einsatz, der eine logische Null in eine logische Eins umwandelt.

Die Kaskadenschaltung weist diesen Nachteil nicht auf, weil hier bilden mehrere Chips ein großes Schieberegister. Dazu wird der Sendedatenausgang eines ICs mit dem Datenempfangseingang des anderen ICs verbunden, wie in Abbildung 3 dargestellt. Die Chipauswahleingänge sind hier parallel geschaltet und somit bleibt die Gesamtzahl der Kommunikationsleitungen gleich zu 4. Die Verwendung einer Kaskadenschaltung 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“ genannt wird.

Übertragungsprotokoll

Das Übertragungsprotokoll über die SPI-Schnittstelle ist im Wesentlichen identisch mit der Logik des Schieberegisters (Abbildung 7.6), die aus der Durchführung einer Schiebeoperation und dementsprechend der Biteingabe und -ausgabe von Daten an bestimmten Flanken des Synchronisationssignals besteht. Die Dateneinstellung beim Senden und das Abtasten beim Empfang erfolgen immer an entgegengesetzten Taktflanken. Dies ist notwendig, um sicherzustellen, dass die Daten erfasst werden, sobald sie zuverlässig ermittelt wurden. Wenn wir berücksichtigen, dass die erste Flanke im Übertragungszyklus eine steigende oder fallende Flanke sein kann, dann gibt es vier mögliche Logikoptionen für den Betrieb der SPI-Schnittstelle. Diese Optionen werden als SPI-Modi bezeichnet und durch zwei Parameter beschrieben:

· CPOL – 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 ist steigend und die letzte 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 installiert und abgerufen werden. Wenn CPHA=0, werden die Daten bei der steigenden Flanke des Taktzyklus abgetastet und bei der fallenden Flanke werden die Daten gesetzt. Wenn CPHA=1, dann wird die Dateninstallation an der steigenden Flanke im Synchronisationszyklus durchgeführt und die Abtastung wird an der fallenden Flanke durchgeführt.

Informationen zu den SPI-Modi sind in den Abbildungen 7.7 und 7.8 dargestellt.

Master- und Slave-Chips, die in unterschiedlichen SPI-Modi arbeiten, sind inkompatibel. Daher ist es wichtig, vor der Auswahl der Slave-Chips zu klären, welche Modi vom Bus-Master unterstützt werden. In Mikrocontroller integrierte Hardware-SPI-Module unterstützen in den meisten Fällen die Möglichkeit, einen beliebigen Modus auszuwählen, und daher können beliebige Slave-SPI-Chips an sie angeschlossen werden (gilt nur für eine unabhängige Verbindungsoption). Darüber hinaus lässt sich das SPI-Protokoll in allen Modi problemlos in Software implementieren.

RS-485-Schnittstelle

Die RS-485-Schnittstelle (ein anderer Name ist EIA/TIA-485) ist einer der gebräuchlichsten Standards der physikalischen Kommunikationsschicht. Die physikalische Schicht ist ein Kommunikationskanal und eine Signalübertragungsmethode (Schicht 1 des OSI-Open-Systems-Verbindungsmodells).

Ein auf der RS-485-Schnittstelle aufgebautes Netzwerk besteht aus Transceivern, die über ein verdrilltes Paar – zwei verdrillte Drähte – verbunden sind. Die RS-485-Schnittstelle basiert auf dem Prinzip der differenziellen (symmetrischen) Datenübertragung. Sein Wesen besteht darin, ein Signal über zwei Drähte zu übertragen. Darüber hinaus überträgt ein Draht (bedingt A) das Originalsignal und der andere (bedingt B) seine inverse Kopie. Mit anderen Worten: Liegt auf einem Draht eine „1“, dann auf dem anderen eine „0“ und umgekehrt. Somit besteht immer eine Potenzialdifferenz zwischen den beiden Adern eines verdrillten Paares: Bei „1“ ist sie positiv, bei „0“ negativ (Abbildung 7.9).

Es ist diese Potentialdifferenz, die das Signal überträgt. Dieses Übertragungsverfahren bietet eine hohe Immunität gegenüber Gleichtaktstörungen. Unter Gleichtaktstörungen versteht man Störungen, die beide Adern der Leitung gleichermaßen betreffen. Beispielsweise induziert eine elektromagnetische Welle, die durch einen Abschnitt einer Kommunikationsleitung läuft, in beiden Drähten Potenzial. Wenn das Signal wie bei RS-232 über Potential in einem Draht relativ zur Masse übertragen wird, können Störungen auf diesem Draht das Signal relativ zur Masse (Masse) verzerren, die Störungen gut absorbiert. Darüber hinaus sinkt die Erdpotentialdifferenz über dem Widerstand eines langen gemeinsamen Kabels – eine zusätzliche Quelle von Verzerrungen. Und bei der Differentialübertragung treten keine Verzerrungen auf. Wenn zwei Drähte nahe beieinander liegen und sogar miteinander verflochten sind, ist der Tonwert an beiden Drähten gleich. Das Potenzial in beiden gleich belasteten Drähten ändert sich gleichermaßen, während die informative Potenzialdifferenz unverändert bleibt.

Hardware-Implementierung der RS485-Schnittstelle.

Hardware-Implementierung der Schnittstelle – Transceiver-Chips mit differenziellen Ein-/Ausgängen (zur Leitung) und digitalen Ports (zu den UART-Ports des Controllers). Für diese Schnittstelle gibt es zwei Optionen: RS-422 und RS-485.

RS-422 ist eine Vollduplex-Schnittstelle. Empfang und Übertragung erfolgen über zwei separate Adernpaare. An jedem Adernpaar darf sich nur ein Sender befinden.

RS-485 ist eine Halbduplex-Schnittstelle. Empfang und Übertragung erfolgen zeitlich getrennt über ein Adernpaar. In einem Netzwerk können viele Sender vorhanden sein, da diese im Empfangsmodus ausgeschaltet werden können (Abbildung 7.10).

Symbolerklärung in Abb. 7.10

D (Fahrer) – Sender;
R (Empfänger) – Empfänger;
DI (Treibereingang) – digitaler Eingang des Senders;
RO (Empfängerausgang) – digitaler Ausgang des Empfängers;
DE (Fahrerfreigabe) – Erlaubnis zum Betrieb des Senders;
RE (Receiver Enable) – Erlaubnis zum Betrieb des Receivers;
A – direkter Differenzeingang/-ausgang;
B – inverser Differenzeingang/-ausgang;
Y – direkter Differenzausgang (RS-422);
Z – inverser Differenzausgang (RS-422).

Schauen wir uns den RS-485-Transceiver genauer an. Der digitale Ausgang des Empfängers (RO) ist mit dem UART-Port (RX) des Empfängers verbunden. Sender-Digitaleingang (DI) zum UART-Sender-Port (TX). Da Empfänger und Sender differenziell verbunden sind, muss der Sender beim Empfang und der Empfänger beim Senden ausgeschaltet sein. Zu diesem Zweck werden Steuereingänge verwendet – Empfängererlaubnis (RE) und Sendererlaubnis (DE). Da der RE-Eingang invers ist, kann er mit DE verbunden werden und Empfänger und Sender mit einem Signal von jedem Port des Controllers schalten. Bei Stufe „0“ – Arbeit für Empfang, bei „1“ – für Übertragung (Abb. 7.11).

Der Empfänger empfängt die Potentialdifferenz (UAB) an den Differenzeingängen (AB) und wandelt diese am Ausgang RO in ein digitales Signal um. Die Empfindlichkeit des Empfängers kann unterschiedlich sein, aber die Hersteller von Transceiver-Chips geben in der Dokumentation den garantierten Schwellenwertbereich für die Signalerkennung an. Typischerweise liegen diese Schwellenwerte bei ±200 mV. Das heißt, wenn UAB > +200 mV – der Empfänger erkennt „1“, wenn UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Alle Geräte werden auf die gleiche Weise an ein Twisted-Pair-Kabel angeschlossen: direkte Ausgänge (A) an einen Draht, inverse Ausgänge (B) an den anderen.

Die Eingangsimpedanz des leitungsseitigen (RAB) Empfängers beträgt typischerweise 12 kΩ. Da die Sendeleistung nicht unbegrenzt ist, ist die Anzahl der an die Leitung angeschlossenen Empfänger begrenzt. Laut RS-485-Spezifikation kann der Sender unter Berücksichtigung der Abschlusswiderstände bis zu 32 Empfänger ansteuern. Allerdings gibt es eine Reihe von Mikroschaltungen mit erhöhter Eingangsimpedanz, die den Anschluss von deutlich mehr als 32 Geräten an die Leitung ermöglichen.

Die maximale Kommunikationsgeschwindigkeit gemäß RS-485-Spezifikation kann 10 MBaud/Sek. erreichen. Die maximale Distanz beträgt 1200 Meter. Wenn es notwendig ist, die Kommunikation über eine Entfernung von mehr als 1200 Metern zu organisieren oder mehr Geräte anzuschließen, als die Belastbarkeit des Senders zulässt, kommen spezielle Repeater zum Einsatz.

I2C-Schnittstelle.

Diese Schnittstelle wurde von Philips vorgeschlagen, das damit die Kommunikation zwischen Chips in seinen Fernsehern organisierte. I 2 C (eine Abkürzung für Inter-Integrated Circuit) ist ein bidirektionaler asynchroner serieller Bus. Physikalisch besteht der I 2 C-Bus aus zwei Signalleitungen, von denen eine (SCL) für die Übertragung eines Taktsignals und die zweite (SDA) für den Datenaustausch vorgesehen ist. Zur Ansteuerung der Leitungen werden Endstufen mit offenem Kollektor verwendet, daher müssen die Busleitungen je nach physikalischer Länge der Leitungen über Widerstände mit einem Widerstandswert von 1...10 kOhm an eine +5-V-Stromquelle angeschlossen werden die Datenübertragungsrate. Die Länge der Verbindungsleitungen kann im Standardmodus bis zu 2 Meter betragen, die Datenübertragungsrate beträgt 100 kbit/s.

Alle Busteilnehmer werden in zwei Klassen eingeteilt – „Leader“ und „Slave“. Das Master-Gerät erzeugt ein Taktsignal (SCL). Es kann selbstständig auf den Bus zugreifen und jedes Slave-Gerät ansprechen, um Informationen zu senden oder zu empfangen. Alle Slave-Geräte „horchen“ auf den Bus, um ihre eigene Adresse zu erkennen und führen, nachdem sie diese erkannt haben, den vorgeschriebenen Vorgang aus. Darüber hinaus ist der sogenannte „MultiMaster“-Modus möglich, wenn mehrere Master-Geräte am Bus installiert sind, die sich entweder gemeinsam gemeinsame Slave-Geräte teilen oder abwechselnd als Master fungieren, wenn sie selbst den Informationsaustausch initiieren, oder als Slaves, wenn Sie warten auf den Zugriff von einem anderen Master-Gerät. Der Modus „MultiMaster“ erfordert eine ständige Überwachung und Erkennung von Konflikten. In dieser Hinsicht ist dieser Modus schwieriger zu implementieren (d. h. Software-Implementierung) und wird daher in realen Produkten seltener verwendet.

Im ersten Moment – ​​im Standby-Modus – befinden sich beide Leitungen SCL und SDA im logischen Eins-Zustand (der Transistor der Open-Collector-Ausgangsstufe ist geschlossen). Im Sendemodus (Abbildung 7.12) wird das SDA-Datenbit durch die steigende Flanke von SCL getaktet. Die Informationen auf der SDA-Leitung werden geändert, wenn die SCL-Leitung im Nullzustand ist. Das Slave-Gerät kann die SCL-Leitung beispielsweise im Nullzustand „halten“, während es das nächste empfangene Byte verarbeitet, während das Master-Gerät warten muss, bis die SCL-Leitung freigegeben ist, bevor es mit der Übertragung von Informationen fortfährt.

Um I 2 C-Buspakete zu synchronisieren, werden zwei Bedingungen unterschieden – „START“ und „STOP“, die den Anfang und das Ende des Informationspakets begrenzen (Abbildung 7.13). Um diese Bedingungen zu kodieren, wird eine Zustandsänderung der SDA-Leitung mit einem einzigen Zustand der SCL-Leitung verwendet, was bei der Datenübertragung nicht akzeptabel ist. Die „START“-Bedingung wird gebildet, wenn eine absteigende Flanke auf der SDA-Leitung erscheint, wenn die SCL-Leitung in einem einzelnen Zustand ist, und umgekehrt wird die „STOP“-Bedingung gebildet, wenn eine steigende Flanke auf der SDA-Leitung erscheint, wenn die SCL Die Leitung befindet sich in einem einzigen Zustand.

Die Datenübertragung beginnt mit der ersten steigenden Flanke auf der SCL-Leitung, die das höchstwertige Bit des ersten Informationsbytes taktet. Jedes Informationsbyte (8 Bit) enthält 9 Taktperioden der SCL-Leitung. Im neunten Zyklus gibt das empfangende Gerät eine Bestätigung (ACK) aus – eine fallende Flanke, die den Empfang von Daten anzeigt. Es ist zu beachten, dass jeder Busteilnehmer, sowohl Master als auch Slave, zu unterschiedlichen Zeiten sowohl Sender als auch Empfänger sein kann und je nach Modus entweder ein ACK-Signal empfangen oder ausgeben muss, dessen Fehlen interpretiert wird als Fehler.

Um einen Datenaustauschvorgang zu starten, gibt das Master-Gerät eine „START“-Bedingung auf dem Bus aus. Auf die „START“-Bedingung folgt ein Byte mit der Adresse des Slave-Geräts (Abbildung 7.14), bestehend aus einer sieben Bit langen Geräteadresse (Bits 1...7) und einem ein Bit langen Lese-/Schreibvorgangsflag – „ R/W“ (Bit 0). Das R/W-Bit bestimmt die Richtung des Austauschs, wobei 0 für die Datenübertragung vom Master zum Slave steht (Abbildung 7.14a) und 1 für das Lesen vom Slave (Abbildung 7.14b). Alle Bits auf dem I 2 C-Bus werden in der Reihenfolge von hoch nach niedrig übertragen, d. h. das 7. Bit wird zuerst übertragen, das 0. zuletzt. Auf die Adresse können ein oder mehrere Informationsbytes folgen (in der durch das R/W-Flag angegebenen Richtung), deren Bits vom Master auf dem SCL-Bus getaktet werden.

Beim Durchführen eines Lesevorgangs muss der Host das gelesene Byte bestätigen, wenn er das nächste Byte lesen möchte, und darf kein ACK ausgeben, wenn er kurz vor dem Ende des Lesens des Pakets steht (siehe Abbildung 7.14b).

Es ist zulässig, die Adresse des Slave-Geräts mehrmals in einem Übertragungszyklus fortzusetzen, d. h. eine wiederholte „START“-Bedingung ohne vorherige „STOP“-Bedingung zu übertragen (Abbildung 7.14c).

Es ist notwendig, einige Merkmale von Speicherchips zu beachten, die über die I 2 C-Schnittstelle arbeiten, und die Verfahren zum Datenaustausch mit ihnen. Erstens ist der nichtflüchtige Datenspeicher dieser Mikroschaltungen in Speicherseiten unterteilt, sodass beim Schreiben eines Bytes zunächst die gesamte Seite in den internen RAM der Mikroschaltung kopiert wird, wo die gewünschte Zelle geändert wird. Danach wird die alte Seite gelöscht und an ihrer Stelle eine neue geschrieben. Ein weiteres Merkmal ist, dass die höchstwertigen vier Bits der Slave-Adresse immer gleich 1010 sein müssen. Diese Anforderung wird von Philips selbst geregelt.

Der 1-Wire-Bus verwendet nur einen Leiter für Kommunikation und Stromversorgung. Der Kommunikationsmodus ist asynchron und halbduplex, was strikt dem Master-Slave-Muster folgt. Ein oder mehrere Slave-Geräte können gleichzeitig an denselben Bus angeschlossen sein. An einen Bus kann nur ein Master-Gerät angeschlossen werden.

Der Ruhezustand des Busses entspricht einem High-Pegel, der durch einen Pull-up-Widerstand erzeugt wird. Der Wert des Pull-up-Widerstands ist in der Dokumentation zum Slave-IC angegeben. Alle am Bus angeschlossenen Chips müssen in der Lage sein, einen Low-Pegel zu erzeugen. Wenn der Mikrocontroller-Ausgang keine drei Zustände unterstützt, muss ein Treiber bereitgestellt werden, der über einen Open-Collector- oder Open-Drain-Ausgang verfügt

Die Signalübertragung über den 1-Wire-Bus ist in Zeitschlitze von 60 µs Dauer unterteilt. Pro Zeitschlitz wird nur ein Datenbit übertragen. Slave-Geräte dürfen erhebliche Abweichungen von den Nennzeitverzögerungen aufweisen. Dies erfordert jedoch eine genauere Zeiteinteilung durch den Vorgesetzten, um eine korrekte Kommunikation mit Untergebenen mit unterschiedlichen Zeitbasen sicherzustellen.

Grundlegende Bussignale.

Der Master initiiert jede Kommunikation auf Bitebene. Dies bedeutet, dass die Übertragung jedes Bits, unabhängig von der Richtung, vom Master initiiert werden muss. Dies wird erreicht, indem der Bus auf Low gesetzt wird, wodurch die Logik aller anderen Geräte synchronisiert wird. Für die Kommunikation über den 1-Wire-Bus gibt es 5 Hauptbefehle: „Protokoll schreiben. 1“, „Protokoll schreiben. 0“, „Lesen“, „Zurücksetzen“ und „Anwesenheit“.

Signal „Protokoll schreiben. 1"

Signal „Protokoll schreiben. 1“ ist in Abb. dargestellt. 7.15. Der Master setzt den Low-Pegel für 1...15 µs. Danach gibt es den Bus für den Rest des Zeitfensters frei.

Reis. 7.15 – Signal „Protokoll schreiben. 1"

Signal „Protokoll schreiben. 0"

Signal „Protokoll schreiben. 0“ ist in Abbildung 7.16 dargestellt. Der Master erzeugt einen Low-Pegel für mindestens 60 μs, jedoch nicht länger als 120 μs.

Abb. 7.16 – Signal „Protokoll schreiben. 0"

Lesesignal

Das „Read“-Signal ist in Abb. dargestellt. 7.17. Der Master setzt den Low-Pegel für 1...15 µs. Der Slave hält dann den Bus auf Low, wenn er ein Protokoll übertragen möchte. 0. Wenn es notwendig ist, das Protokoll zu übertragen. 1, dann gibt es einfach die Leitung frei. Der Bus-Scan muss innerhalb von 15 µs nach dem Low-Zustand des Busses durchgeführt werden. Von der Seite des Masters aus gesehen ist das „Lesen“-Signal im Wesentlichen ein „Protokoll schreiben“-Signal. 1". Der tatsächliche interne Zustand des Slaves wird durch das Signal „Record Log“ bestimmt. 1“ oder „Lesen“.

Abbildung 7.17 – „Lesen“-Signal

Reset/Anwesenheitssignal

Die Signale „Reset“ und „Presence“ sind in Abbildung 7.18 dargestellt. Bitte beachten Sie, dass die Pulszeitintervalle unterschiedlich sind. Der Master zieht für 8 Zeitschlitze (480 µs) den Low-Zustand und gibt dann den Bus frei. Dieser lange Zeitraum des niedrigen Zustands wird als „Reset“-Signal bezeichnet.

Wenn ein Slave am Bus vorhanden ist, muss dieser innerhalb von 60 µs, nachdem der Master den Bus freigegeben hat, für mindestens 60 µs einen Low-Pegel setzen. Diese Reaktion wird „Präsenz“ genannt. Wird ein solches Signal nicht erkannt, muss der Master davon ausgehen, dass keine Geräte am Bus angeschlossen sind und keine weitere Kommunikation möglich ist.

USB (Universal Serial Bus) wurde entwickelt, um externe Geräte schnell an einen PC anzuschließen und dann die erforderliche Software zu finden und zu installieren. Geräte mit geringem Stromverbrauch werden direkt über die Schnittstelle mit Strom versorgt.

Der USB-Standard setzt voraus, dass nur ein Master-Gerät (Host) im Netzwerk vorhanden ist. Darüber hinaus unterstützt der Standard bis zu 127 Slave-Geräte im Netzwerk. Um zwischen Master- und Slave-Geräten zu unterscheiden, wurden verschiedene Arten von Anschlüssen entwickelt (Abbildung 7.19): Typ A für den Master und Typ B für den Slave. Es wird davon ausgegangen, dass die 5-V-Spannung nur am Typ-A-Anschluss, dem Master-Anschluss, anliegt. Der Rest der Geräte wird direkt von dort mit Strom versorgt.

Der USB-Standard verwendet vier abgeschirmte Drähte, von denen zwei Strom übertragen (+5 V und GND) (Abbildung 7.19 und Tabelle 7.2). Die anderen beiden repräsentieren Twisted-Pair-Differenzdatensignale. Verwendetes Kodierungsschema NRZI(Non Return to Zero Invert) zur Datenübertragung mit einem Synchronisationsfeld zur Synchronisierung der Master- und Slave-Uhren.

Mit dem USB 2.0-Standard wurde der On-The-Go (OTG)-Standard eingeführt, der das Host Negotiation Protocol einführte, das es zwei USB-Geräten ermöglicht, sich darauf zu einigen, wer als Master fungiert. Dies ist vorgesehen und beschränkt auf einzelne Punkt-zu-Punkt-Verbindungen, beispielsweise von einem Mobiltelefon zu einem PC.

USB unterstützt „Hot“-Verbindungen (Plug’n’Play) mit dynamisch geladenen und entladenen Treibern. Der Anwender steckt das Gerät einfach ein und verbindet es so mit dem Bus. Der Host erkennt die Verbindung, fragt das neu angeschlossene Gerät ab und lädt den entsprechenden Treiber. Der Zeitpunkt des Ladevorgangs wird mit einer Sanduhr auf dem Bildschirm angezeigt (sofern der Treiber für das USB-Gerät bereits auf dem System installiert ist). Der Endbenutzer kümmert sich nicht um die Kündigung oder IRQ(Interrupts) und Portadressen, noch über den Neustart des Computers (kein Neustart erforderlich). Wenn der Benutzer mit dem USB-Gerät fertig ist, entfernt er es einfach (oder zieht das Kabel ab). Der Host erkennt das Fehlen des Geräts und entlädt den Treiber automatisch.

SB Version 1.1 unterstützt zwei Geschwindigkeiten – den Full-Speed-Modus mit einer Geschwindigkeit von 12 Mbit/s und den Low-Speed-Modus mit einer Geschwindigkeit von 1,5 Mbit/s. Der 1,5-Mbit/s-Modus ist langsamer und weniger empfindlich gegenüber EMI (Interferenzen), was die Kosten für Ferritperlen senkt und die Anforderungen an die Komponentenqualität senkt.

Das Full-Speed-Buskabel ist ein durch eine Abschirmung geschütztes Twisted-Pair-Kabel und kann auch für den Low-Speed-Betrieb verwendet werden. Ein Kabel für den Betrieb nur bei minimaler Geschwindigkeit (z. B. zum Anschließen einer Maus) kann beliebig und ungeschirmt sein.

Der USB 2.0-Standard führt einen High-Speed-Modus mit einer Datenübertragungsrate von 480 Mbit/s ein.

Datentransfer.

Alle Datenübertragungen über die Schnittstelle werden vom Host initiiert. Daten werden in Form von Paketen übertragen. Die USB-Schnittstelle verwendet mehrere Arten von Paketen:

A) Paket unterschreiben (Token-Paket) beschreibt die Art und Richtung der Datenübertragung, die Geräteadresse und die Seriennummer des Endpunkts (CT ist der adressierbare Teil des USB-Geräts); Es gibt verschiedene Arten von Funktionspaketen: IN, AUS, SOF, AUFSTELLEN;

B) Datenpaket (Datenpaket) enthält die übermittelten Daten;

B) Genehmigungspaket (Handshake-Paket) soll die Ergebnisse der Datenübertragung melden; Es gibt verschiedene Arten von Koordinationspaketen: ACK, N.A.K., STALL.

Die Datenübertragung über USB erfolgt wie folgt:

Das erste Paket, der sogenannte Token, wird vom Master-Gerät generiert und beschreibt die Art der übertragenen Daten, den Übertragungsvorgang (Lesen oder Schreiben), die Geräteadresse und den Endpunkt. Als nächstes wird normalerweise ein Datenpaket mit nützlichen Informationen übertragen, gefolgt von einem Handshaking-Paket, das angibt, dass die Daten oder das Token erfolgreich empfangen wurden oder dass der Endpunkt blockiert ist oder nicht für die Datenannahme verfügbar ist.

Die Endpunkte im USB-Standard sind die Quellen und Senken von Daten. Alle Geräte müssen Endpunkt 0 unterstützen. Dies ist der Endpunkt, der alle Steuer- und Statusanfragen während der Enumeration (eine Handle-Anfrage zur Bestimmung des Typs des angeschlossenen Geräts) und so lange akzeptiert, wie das Gerät am Bus betriebsbereit bleibt.

Von 1 an nummerierte Endpunkte werden zur Übertragung von Benutzerinformationen verwendet. Schauen wir uns ein paar Beispiele an.

Der Gerätetreiber sendet an den Master-Geräteendpunkt EP1. Weil Dieses Gerät ist der Master, dann gehen die Daten in den OUT-Puffer EP1. In diesem Fall wird ein OUT-Token gesendet, der anzeigt, dass die Daten zum Senden bereit sind. Nach Erhalt dieses Tokens kann das Slave-Gerät Daten aus dem OUT-Puffer lesen.

Wenn das Slave-Gerät Daten an den Master übertragen muss, legt es diese im IN-Puffer ab. Dieser Puffer speichert Daten, bis der Master einen IN-Token sendet, der Daten vom Endpunkt anfordert. Alle Endpunktpuffer werden relativ zum Master benannt, d. h. Der Ausgabepuffer des Slave-Geräts heißt IN, weil Es ist der Eingangspuffer für das Master-Gerät.

Die Datenübertragung von einem Endpunkt zum anderen erfolgt über Streams. Flow – Eine logische Verbindung zwischen einem Host und einem oder mehreren Endpunkten.

Streams verfügen außerdem über eine Reihe von Parametern wie Übertragungstyp (Control, Bulk, Iso oder Interrupt), Datenflussrichtung und maximale Paket-/Puffergrößen.

Der Standardstream ist beispielsweise ein bidirektionaler Stream, der aus IN-Endpunkt 0 und OUT-Endpunkt 0 mit Übertragungstypsteuerung besteht.

USB definiert zwei Arten von Pipes

A) Stromrohre haben kein vordefiniertes USB-Format, sodass Sie jede Art von Daten über die Stream-Pipe senden und die Daten am anderen Ende wiederherstellen können. Datenströme sind sequentiell und haben eine vorgegebene Richtung – IN oder OUT. Stream-Pipes unterstützen Massen-, isochrone und Interrupt-Übertragungstypen. Streampipes können entweder vom Host oder vom Gerät aus gesteuert werden.

B) Nachrichtenpipes ein vordefiniertes USB-Format haben. Sie werden vom Host gesteuert und durch eine vom Host gesendete Anfrage initiiert. Die Daten werden in die in der Anfrage angegebene gewünschte Richtung gesendet. Daher ermöglichen Nachrichtenpipes die Übertragung von Daten in beide Richtungen, unterstützen jedoch nur Kontrollübertragungen.

Der USB-Standard beschreibt vier Arten der Datenübertragung:

A) Kontrollieren Sie die Weiterleitung (Kontrollübertragung) wird zur Gerätekonfiguration sowie für andere gerätespezifische Zwecke verwendet.

B) Streaming (Massentransfer) wird zur Übertragung einer relativ großen Menge an Informationen verwendet.

B) Weiterleitung unterbrechen (iterrupt-Übertragung) dient der Übermittlung relativ kleiner Informationsmengen, für die die rechtzeitige Übermittlung wichtig ist. Die Dauer ist begrenzt und die Priorität höher als bei anderen Überweisungsarten.

D) Isochrone Weiterleitung (isochrone Übertragung) wird auch Echtzeit-Streaming genannt. Die bei einer solchen Übertragung übertragenen Informationen erfordern bei ihrer Erstellung, beim Senden und beim Empfang eine Echtzeitskala.

Streaming-Übertragungen gekennzeichnet durch eine garantiert fehlerfreie Datenübertragung zwischen Host und Funktion durch Erkennung von Fehlern bei der Übertragung und erneute Anforderung von Informationen. Wenn der Host bereit ist, Daten von einer Funktion zu empfangen, sendet er ein Flag-Paket an die Funktion IN-Plastiktüte. Als Reaktion darauf übermittelt die Funktion in der Datenübertragungsphase ein Datenpaket an den Host oder ggf

Mit Nennwerten von 10 Ohm bis 1 MOhm);

  • Verbindungsdrähte (dies ist zum Beispiel ein guter Satz);
  • Personalcomputer mit Arduino IDE-Entwicklungsumgebung.
  • 1 Beschreibung der Seriennummer SPI-Schnittstelle

    SPI – Serial Peripheral Interface oder „Serial Peripheral Interface“ ist ein synchrones Datenübertragungsprotokoll für das Pairing Master-Gerät Mit Peripheriegeräte (Slave). Das Master-Gerät ist häufig ein Mikrocontroller. Die Kommunikation zwischen Geräten erfolgt über vier Drähte, weshalb SPI manchmal als „Vierdrahtschnittstelle“ bezeichnet wird. Das sind die Reifen:

    Es gibt vier Datenübertragungsmodi ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), verursacht durch die Kombination der Polarität der Taktimpulse (wir arbeiten auf HIGH- oder LOW-Pegel), Taktpolarität, CPOL, und die Phase der Taktimpulse (Synchronisation auf der steigenden oder fallenden Flanke 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 Kaskade. Bei unabhängiger Verbindung mit dem SPI-Bus greift das Master-Gerät individuell auf jedes Slave-Gerät zu. Bei einer Kaskadenschaltung arbeiten die Slave-Geräte nacheinander wie in einer Kaskade.


    Arten der Geräteanbindung für den Betrieb über die SPI-Schnittstelle: unabhängig und kaskadiert

    2 Implementierung der SPI-Schnittstelle auf Arduino-Familienplatinen

    In Arduino befinden sich SPI-Schnittstellenbusse an bestimmten Ports. Jede Platine hat ihre eigene Pinbelegung. Der Einfachheit halber werden die Schlussfolgerungen dupliziert und auch separat aufgeführt ICSP-Anschluss(Bei der seriellen Schaltungsprogrammierung die Programmierung eines in einer Schaltung enthaltenen Geräts mithilfe eines seriellen Protokolls.) Bitte beachten Sie, dass der ICSP-Anschluss keinen Slave-Auswahlpin hat – SS, weil Es wird davon ausgegangen, dass der Arduino als Master-Gerät im Netzwerk verwendet wird. Bei Bedarf können Sie jedoch einen beliebigen digitalen Pin von Arduino 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 so: Am Anfang des Programms fügen wir hinzu #include SPI.h.

    Um mit der Verwendung des SPI-Protokolls zu beginnen, müssen Sie die Einstellungen festlegen und dann das Protokoll mithilfe des Verfahrens initialisieren SPI.beginTransaction(). Sie können dies mit einer 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 erfolgt ab 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 in den Status verschieben NIEDRIG.

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

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


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

    Es empfiehlt sich, die Übertragungszeit zwischen den Anweisungen SPI.beginTransaction() und SPI.endTransaction() zu minimieren, um Probleme zu vermeiden, wenn ein anderes Gerät versucht, eine Datenübertragung mit anderen Einstellungen zu initiieren.

    4 Anschluss eines Schieberegisters zu Arduino

    Betrachten wir die praktische Anwendung der SPI-Schnittstelle. Wir werden die LEDs zum Leuchten bringen, indem wir ein 8-Bit-Schieberegister über den SPI-Bus steuern. Verbinden wir uns mit Arduino Schieberegister 74HC595. Wir werden über einen Begrenzungswiderstand eine LED mit einem Nennwert von 220 Ohm an jeden der 8 Ausgänge des Registers anschließen. Das Diagramm ist in der Abbildung dargestellt.


    5 Skizze zur Ansteuerung eines Schieberegistersüber SPI-Schnittstelle

    Schreiben wir eine Skizze wie diese.

    #enthalten const int pinSelect = 8; // Select-Pin registrieren void setup() ( SPI.begin(); // Initialisierung der SPI-Schnittstelle pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // Slave-Geräte auswählen (Register) SPI.transfer(0); // den Inhalt des Registers löschen digitalWrite(pinSelect, HIGH); // Ende der Übertragung Serial.begin(9600); } void loop() ( for (int i=0; i )

    Verbinden wir zunächst die SPI-Bibliothek und initialisieren wir die SPI-Schnittstelle. Definieren wir Pin 8 als SS-Slave-Auswahlpin. Löschen wir das Schieberegister, indem wir ihm den Wert „0“ senden. Initialisieren Sie die serielle Schnittstelle.

    Um eine bestimmte LED mithilfe eines Schieberegisters zum Leuchten zu bringen, müssen Sie eine 8-Bit-Zahl an deren Eingang anlegen. Damit beispielsweise die erste LED aufleuchtet, geben wir die Binärzahl 00000001 an, für die zweite - 00000010, für die dritte - 00000100 usw. Diese Binärzahlen bilden bei der Umrechnung in das dezimale Zahlensystem die folgende Folge: 1, 2, 4, 8, 16, 32, 64, 128 und sind Zweierpotenzen von 0 bis 7.

    Dementsprechend im Zyklus Schleife() Basierend auf der Anzahl der LEDs berechnen wir von 0 auf 7. Funktion pow(Basis, Grad) Erhöht den Schleifenzähler um 2. Mikrocontroller arbeiten mit Zahlen vom Typ „double“ nicht sehr genau, daher verwenden wir die Rundungsfunktion, um das Ergebnis in eine ganze Zahl umzuwandeln runden(). Und wir übertragen die resultierende Zahl in das Schieberegister. Der Übersichtlichkeit halber zeigt der Monitor der seriellen Schnittstelle die während dieses Vorgangs erhaltenen Werte an: Das Gerät „läuft“ durch die Entladungen – die LEDs leuchten wellenförmig auf.

    6 „Laufende Welle“ aus LEDs

    Die LEDs leuchten nacheinander auf und wir beobachten eine laufende „Welle“ von Lichtern. Die Ansteuerung der LEDs erfolgt über ein Schieberegister, das wir über die SPI-Schnittstelle angeschlossen haben. Dadurch werden nur 3 Arduino-Pins zur Ansteuerung von 8 LEDs verwendet. Wenn wir die LEDs direkt an die digitalen Ports des Arduino anschließen würden, müssten wir für jede LED einen separaten Port verwenden.

    Wir haben das einfachste Beispiel für die Arbeit von Arduino mit dem SPI-Bus untersucht. Die Funktionsweise mehrerer Schieberegister mit unabhängigen und kaskadierten Verbindungen werden wir in einem separaten Artikel genauer betrachten.