Kann ein SPI-Slave eine Übertragung im Vollduplexmodus starten?

8

Soweit ich weiß, funktioniert die SPI-Übertragung für einen SPI-Slave wie folgt:

  1. Der Master wählt einen Slave über den SS-Pin aus
  2. Master und Slave senden gleichzeitig Daten aneinander
  3. Der Master startet gleichzeitig die Uhr- und Datenübertragung (vor dem Schreibvorgang gibt es keine Uhr).
  4. Der Master stoppt die Übertragung jederzeit (durch Stoppen des Schreibvorgangs und der Taktgenerierung), selbst wenn der Slave mehr Daten zum Senden hat.

Gibt es eine SPI-Slave-Konfiguration, mit der der Slave Daten ohne Erlaubnis des Masters übertragen kann?

Ich denke nur laut nach. Angenommen, es gibt nur einen Slave und eine kontinuierliche Uhr wird vom Master usw. bereitgestellt.

Auch wenn die angenommene Aussage wahr ist, verlieren Master und Slave nicht die Bytesynchronisation (dh sie empfangen den Bitstrom), da es keine Start-Stopp-Bits für SPI gibt?

Ich stelle eine solche Frage, weil ich den folgenden Abschnitt aus diesem Dokument gelesen habe .

2.2 SPI-Beispiel

Das beigefügte SPI-Beispiel zeigt die Verwendung des USART im synchronen Modus. USART1 ist als Slave konfiguriert, während USART2 Master ist. Folgende Transaktionen finden statt:

  • Datenübertragung vom Master zum Slave.
  • Datenübertragung vom Slave zum Master.
  • Datenübertragung von Master zu Slave und von Slave zu Master gleichzeitig.

Das Dokument enthält ein SPI-Beispiel, realisiert das Beispiel jedoch mit USART-Geräten. Und ich verstehe, dass ein USART-Slave eine Übertragung ohne Erlaubnis des Masters starten kann.

Ich konnte den Quellcode, auf den das Dokument verweist, nicht finden.

JeJoRic
quelle
4
Der Slave kann per Definition keine Transaktion initiieren (er kann jedoch möglicherweise den Master unterbrechen, um eine Transaktion zu starten).
Peter Smith
5
Die unidirektionale Datenübertragung in herkömmlichem SPI ist nur jemand , der den Zustand der Leitung in die andere Richtung ignoriert . Schreiben, Lesen und bidirektionale Übertragungen sind nicht wirklich anders. Tatsächlich stempeln beispielsweise viele SPI-Peripheriegeräte während des ersten Wortes ein Statuswort aus, bevor sie überhaupt wissen, was angefordert wird, da dies so gut wie nichts kostet und eine schnelle Statusabfrage ermöglicht.
Chris Stratton

Antworten:

17

Nein, mit SPI wird die gesamte Kommunikation vom Master-Gerät gesteuert. Sie haben Recht, dass der Master nicht einfach eine kontinuierliche Uhr bereitstellen kann. Es gibt keine Möglichkeit, die Bytegrenzen zu erkennen.

Ein Slave-Gerät verfügt häufig über einen separaten Ausgangspin, um dem Master zu signalisieren, dass Daten verfügbar sind. Dieser Pin ist mit einem Eingang eines Mikrocontrollers verbunden und wird häufig als Interrupt verwendet.

Dann kann das Gerät den Pin aktivieren, wodurch der Mikrocontroller den SPI-Bus hochfährt.


Für detailliertere Informationen lesen Sie bitte weiter :) Dies ist eine leicht modifizierte Version einer Erklärung, die Sie hier finden :

Das Slave-Gerät kann nur kommunizieren, wenn ihm eine Uhr vom Master zur Verfügung gestellt wird. Dies erschwert das Lesen vom Slave, da der Master genügend Taktzyklen bereitstellen muss, damit der Slave reagieren kann.

Wenn Sie einen SPI-Befehl vom Master senden, erfolgen zwei Übertragungen tatsächlich während derselben acht Taktimpulse. Das erste ist, dass Ihr Byte aus der MOSI-Leitung heraus getaktet wird. Gleichzeitig werden Daten über die MISO-Leitung in den Mikrocontroller eingetaktet.

Da der Slave jedoch erst am Ende dieser Transaktionen den vollständigen Befehl erhält, werden dem Bus keine Daten angezeigt. Dies führt zu einem empfangenen Wert von 0x00 oder 0xFF.

Dann müssen Sie zusätzliche acht Takte bereitstellen, damit der Slave den tatsächlichen Wert zurückgeben kann. In vielen Code-Implementierungen erfolgt dies durch Senden eines "Dummy-Bytes" an den Slave.

Beachten Sie, dass der Master bei der ersten Übertragung alles ignoriert, was vom Slave kommt. Bei der zweiten Übertragung ignoriert der Slave alles, was vom Master gesendet wird.

Das beschreibt den allgemeinen Fall. Es kann zusätzliche Komplexität geben. Beispielsweise geben einige Slave-ICs tatsächlich eine Art Statusbyte aus, während sie einen Befehl vom Master empfangen. In diesem Fall sollte der Master das erste empfangene Byte nicht verwerfen.

Bitsmack
quelle
2
"Der Master kann nicht einfach eine kontinuierliche Uhr bereitstellen." Eigentlich habe ich vor nicht allzu langer Zeit ein Gerät gesehen, das genau das tut. Es war ein seltsames kleines Tier. Ich erinnere mich leider nicht an die P / N.
Aaron
@ Aaron Gut zu wissen! Die Leute werden immer schlauer :-)
bitsmack
7

Nein, Master ist derjenige, der die Chipauswahl vermittelt und die Uhr steuert. Ein Slave hört immer nur Clock und Chipselect. Die Datenübertragung kann immer noch Vollduplex erfolgen. Es gibt einige Implementierungen, bei denen der Takt kontinuierlich sein kann, aber es spielt keine Rolle, da die Chipauswahl ohnehin zum Synchronisieren der Bytegrenzen verwendet wird. Aber dann gibt es Multimaster-Systeme, so dass Sie im Grunde einen Mechanismus für die Geräte haben können, um zu entscheiden, wer Slave und Master ist. Oder fügen Sie einfach einen separaten "Interrupt" -Draht für den Slave hinzu, um dem Master zu signalisieren, dass er ein Datenpaket für den Master hat.

Nur ich
quelle
Können Sie ein Beispiel für ein Multimaster-System hinzufügen?
Davidcary