Forum: Mikrocontroller und Digitale Elektronik SPI: wie am besten auf Slave-Ready warten?


von Jim Beam (Gast)


Lesenswert?

Ladies, Gentlemen,

Ich bräuchte mal etwas auf die "Sprünge geholfen kriegen" zu SPI.

Eine kleine Steuerung mit Motörchen, etc. wird über einen AVR bedient.
Bisher über RS232.

Da die Steuerung nach jedem Kommando immer schwer kalkulierbare Zeit 
benötigt, um "fertig" zu melden ist RS232 für mich ganz praktisch: Ich 
sende halt ein Kommando und warte bis der Slave "von sich aus" etwas per 
RS232 zurücksendet. (mit bischen Timeout-Drumherum)

Opional möchte ich SPI ergänzen, da dies aber Master-gesteuert ist muss 
ich ja jede Antwort aus dem Slave heraus-clocken. Ich habe KEINE 
BUSY-Leitung oder sowas, halt nur SCK,MOSI,MISO.

Wie würde man dies üblicherweise lösen?
Den Slave permanent per SPI abfragen, bis er statt "z.B. 0"  ein 
Ergebnisbyte sendet?
Oder gibt es irgendwelche Slave-seitigen Tricksereien mit den 
SCK/MOSi/MISO-Pegeln, um sowas wie "busy" zu signalisieren?

Dank schonmal für ein paar Denkanstösse...

von Jim M. (turboj)


Lesenswert?

Ich habe hier einen ADC, der sein "Ready" auch auf MISO ausgeben kann.

Hat aber Nebenwirkungen:
 - Keine weiteren Teilnehmer auf dem SPI Bus möglich
 - Der Master muss MISO auswerten können, obwohl kein Takt und auch kein 
CS=LOW ist
 - Wenn der Slave Software ist, braucht er eventuell zusätzliche Zeit um 
bei fallender Flanke von CS von GPIO auf SPI umzustellen, bevor der 
erste Taktzylus auf SCK beginnt

Eventuell ist simples Polling einfacher.

von S. Landolt (Gast)


Lesenswert?

> bei fallender Flanke von CS von GPIO auf SPI umzustellen

Genau diese Frage hatte ich mir gestellt, denn

> halt nur SCK,MOSI,MISO

von Stefan F. (Gast)


Lesenswert?

Jim Beam schrieb:
> Wie würde man dies üblicherweise lösen?
> Den Slave permanent per SPI abfragen, bis er statt "z.B. 0"  ein
> Ergebnisbyte sendet?

Bei SD Karten macht man es genau so.

von M. K. (sylaina)


Lesenswert?

Jim Beam schrieb:
> Eine kleine Steuerung mit Motörchen, etc. wird über einen AVR bedient.
> Bisher über RS232.
>
> Da die Steuerung nach jedem Kommando immer schwer kalkulierbare Zeit
> benötigt, um "fertig" zu melden ist RS232 für mich ganz praktisch: Ich
> sende halt ein Kommando und warte bis der Slave "von sich aus" etwas per
> RS232 zurücksendet. (mit bischen Timeout-Drumherum)

RTS/CTS hast du warum genau dafür nicht benutzt? Immerhin ist es genau 
dafür da: Damit der Sender den Empfänger fragen kann, ob dieser zum 
Datenempfang bereit ist und der Empfänger dem Sender auch sagen kann, 
dass er zum Datenempfang bereit ist.

von c-hater (Gast)


Lesenswert?

Jim Beam schrieb:

> Opional möchte ich SPI ergänzen, da dies aber Master-gesteuert ist muss
> ich ja jede Antwort aus dem Slave heraus-clocken. Ich habe KEINE
> BUSY-Leitung oder sowas, halt nur SCK,MOSI,MISO.
>
> Wie würde man dies üblicherweise lösen?

Mit einer IRQ-Leitung natürlich. So wird das normalerweise gemacht. Wenn 
der Slave von sich aus was zu melden hat, tut er das per interrupt 
request kund.

Wenn du die Strippe nicht investieren willst, bleibt nur Polling. Eine 
Busy-Leitung braucht man dann nicht, nur ein geeignetes Protokoll auf 
dem normalen SPI-Kanal.

Man kann auch beides kombinieren. Idealerweise so, daß einerseits 
Polling möglich ist, andererseits auch Interruptsteuerung. Typisches 
Beispiel für so einen Slave sind z.B. die RFM12.

von A. S. (Gast)


Lesenswert?

Jim Beam schrieb:
> Opional möchte ich SPI ergänzen

Wo? Auf beiden Seiten? Dann kannst Du die 3 Leitungen doch beliebig 
missbrauchen. Eine aussuchen, Portpin parallel, ggf. Widerstand oder 
Gatter beim slave, und im master auswerten. Du kannst z.b. slave-out 
invertieren.

Pollen ist aber sauber und gut, wenn's geht, machen.

von Peter D. (peda)


Lesenswert?

Du kannst neben den 4 nötigen SPI-Leitungen noch eine 5. Leitung als 
Interrupt benutzen. Sobald der Slave ein Byte in das Senderegister 
gestellt hat, zieht er sie auf low und der Master kann es raustakten.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jim Beam schrieb:
> Wie würde man dies üblicherweise lösen?
Man würde entweder
A) das erste Bit, das vom Slave zurückkommt, als Ready-Bit nehmen. Dann 
kann man bei geeignetem SPI Mode und aktivem SS# das Busyflag schon ganz 
ohne Takt lesen. Oder man könnte es per Polling eintakten.

Oder man könnte
B) eine zusätzliche Busy-Leitung auf einen Portpin/Interrupteingang 
legen.

Beide Ansätze haben Vor- und Nachteile. Einfacher handzuhaben ist der 
Ansatz B.

von Jim M. (turboj)


Lesenswert?

Jim Beam schrieb:
> Ich habe KEINE
> BUSY-Leitung oder sowas, halt nur SCK,MOSI,MISO.

Das ist eine Leitung zuwenig. Man braucht praktisch immer auch noch CS.

Hier gab es in der Vergangenheit regelmäßig Beiträge wo Leute das 
Problem hatten das beim Einschalten zusätzliche SCK Pulse erkannt wurden 
und so die SPI Daten um ein oder mehrere Bits verschoben sind.

CS löst das Problem weil dort der Bitzähler bei der fallenden Flanke auf 
Null gesetzt wird.

von Peter D. (peda)


Lesenswert?

Jim M. schrieb:
> CS löst das Problem weil dort der Bitzähler bei der fallenden Flanke auf
> Null gesetzt wird.

Es gibt einige ICs, die auf ein Startbit synchronisieren, z.B. der 
MM5450. Wenn man dort 35 mal 0 einschiebt, ist das Register garantiert 
synchron und übernimmt ab dem nächsten 1-Bit korrekt die Daten.
Nur bei solchen ICs darf man /CS dauerhaft auf GND legen.

von Peter D. (peda)


Lesenswert?

Lothar M. schrieb:
> A) das erste Bit, das vom Slave zurückkommt, als Ready-Bit nehmen. Dann
> kann man bei geeignetem SPI Mode und aktivem SS# das Busyflag schon ganz
> ohne Takt lesen.

Das kann in der Tat klappen, in den Modis mit CPHA = 0 wird das erste 
Bit ja schon ohne Taktflanke angelegt. Der Master muß dann beim Lesen 
immer das letzte Bit = 1 senden und für MISO den PCINT enablen oder MISO 
pollen.
Das Protokoll wird dann etwas komplexer, da ja immer nur 7 Bit Daten 
möglich sind.
Dann kommt man mit nur 4 Leitungen aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.