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...
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.
> bei fallender Flanke von CS von GPIO auf SPI umzustellen Genau diese Frage hatte ich mir gestellt, denn > halt nur SCK,MOSI,MISO
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.
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.
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.
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.