Kann ein SPI-Slave eine Übertragung im Vollduplex-Modus starten?

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

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

Gibt es eine SPI-Slave-Konfiguration, die es dem Slave ermöglicht, Daten ohne Erlaubnis des Masters zu übertragen?

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

Selbst wenn die angenommene Aussage wahr ist, verlieren Master und Slave nicht die Byte-Synchronisation (dh 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 veranschaulicht die Verwendung des USART im synchronen Modus. USART1 ist als Slave konfiguriert, während USART2 Master ist. Es finden folgende Transaktionen statt:

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

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

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

Der Slave kann definitionsgemäß keine Transaktion initiieren (er kann jedoch möglicherweise den Master unterbrechen, um eine Transaktion zu starten).
Die unidirektionale Datenübertragung im traditionellen SPI ist nur jemand, der den Zustand der Leitung ignoriert , die in die andere Richtung geht. Schreib-, Lese- und bidirektionale Übertragungen unterscheiden sich nicht wirklich. Tatsächlich takten beispielsweise viele SPI-Peripheriegeräte ein Statuswort während des ersten Wortes aus, bevor sie überhaupt wissen, was angefordert wird, da dies so gut wie nichts kostet und eine schnelle Statusabfrage ermöglicht.

Antworten (2)

Nein, bei SPI wird die gesamte Kommunikation vom Master-Gerät gesteuert. Sie haben Recht, dass der Master nicht einfach eine kontinuierliche Uhr liefern kann; es gäbe keine Möglichkeit, die Byte-Grenzen zu erkennen.

Ein Slave-Gerät hat oft einen separaten Ausgangspin, um dem Master zu signalisieren, dass es Daten zur Verfügung hat. Dieser Pin ist mit einem Eingang eines Mikrocontrollers verbunden und wird oft 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 es einen Takt vom Master erhält. Dies erschwert das Lesen vom Slave, da Sie den Master veranlassen müssen, genügend Taktzyklen bereitzustellen, damit der Slave antwortet.

Wenn Sie einen SPI-Befehl vom Master senden, finden tatsächlich zwei Übertragungen während derselben acht Taktimpulse statt. Das erste ist, dass Ihr Byte aus der MOSI-Leitung getaktet wird. Aber 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, präsentiert er dem Bus keine Daten. Dies führt zu einem empfangenen Wert von 0x00 oder 0xFF.

Dann müssen Sie weitere acht Takte bereitstellen, damit der Slave den tatsächlichen Wert zurücksenden 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 ankommt. Bei der zweiten Übertragung ignoriert der Slave alles, was der Master sendet.

Das beschreibt den allgemeinen Fall. Es kann zusätzliche Komplexitäten geben. Beispielsweise geben einige Slave-ICs gleichzeitig eine Art Statusbyte aus, wenn sie einen Befehl vom Master erhalten. In diesem Fall sollte der Master also das erste empfangene Byte nicht verwerfen.

"Der Master kann nicht einfach eine kontinuierliche Uhr liefern" Tatsächlich habe ich vor nicht allzu langer Zeit ein Gerät gesehen, das genau das tut. Es war ein seltsames kleines Biest. An die P/N kann ich mich leider nicht mehr erinnern.
@Aaron Gut zu wissen! Die Leute werden immer klüger :-)

Nein, der Master ist derjenige, der die Chipauswahl entscheidet und die Uhr steuert. Ein Slave wird immer nur auf Clock und Chipselect hören. Die Datenübertragung kann immer noch Vollduplex sein. Es gibt einige Implementierungen, bei denen der Takt kontinuierlich sein kann, aber es spielt keine große Rolle, da der Chipselect sowieso zum Synchronisieren der Byte-Grenzen verwendet wird. Aber dann gibt es Multimaster-Systeme, also können Sie im Grunde einen Mechanismus für die Geräte haben, um zu entscheiden, wer Slave und Master ist. Oder schließen Sie einfach eine separate "Interrupt"-Leitung für den Slave ein, um dem Master zu signalisieren, dass er ein Datenpaket für den Master hat.

Können Sie ein Beispiel für ein Multimaster-System hinzufügen?