Soweit ich weiß, funktioniert die SPI-Übertragung für einen SPI-Slave wie folgt:
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.
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.
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.
Peter Schmidt
Chris Stratton