Hallo zusammen, ich möchte mit zwei Controllern untereinander über SPI kommunizieren. Dabei sollen jeweils 16 Bit übertragen werden. SPI läuft soweit. Aktuell erst einmal mit 8 Bit getestet. Der Master sendet dann 16 Bit und der Slave soll entsprechend Antworten. Der Controller hat ein 8 Bit Senderegister. Ich überlege nun, wie ich die Übertragung am Besten aufbaue. Eine grobe Idee. Ich habe einen 16 Bit Wert, den ich erst einmal in zweimal 8 Bit aufteile und in einem Array speichere wert[0] / wert[1]. Die Kommunikation läuft über Interrupts. Receive Interrrupt, wenn der Receive Buffer voll ist und Transmit Interrupt, wenn der Transmit Buffer leer ist. Ich schiebe nun den ersten Wert in den Transmit Buffer. Wenn der Master die Kommunikation startet, sendet der Slave die ersten 8 Bit. Wenn der Transmit Buffer Empty Interrupt kommt, werden die zweiten 8 Bit in den Buffer geschoben. Es gibt nur einen Interrupt Vector. In diesem werden dann auch bei entsprechend gesetztem Bit die vom Master empfangenen Daten ausgelesen. Bei der Detailumsetzung frage ich mich, ob die Wahl, ob das erste oder zweite Element des Array gesendet wird, in der ISR vorgenommen wird oder im allgemeinen Programmablauf? Nach dem Senden der 16 Bit, würde ich den Transmit Interrupt deaktivieren, weil sonst immer wieder dort rein gesprungen würde, obwohl nichts gesendet werden soll!? Wäre das der grobe Weg oder sollte man es anders umsetzen? Gruß Stephan
Das hängt sehr stark vom µC ab. bei meinem habe ich den SPI mit einem DMA gekoppelt der dann das nächste Byte in den SPI Speicher schreibt sobald dieser frei geworden ist. Bei Slave entspechend nach einem Byte wird der DMA vom SPI getriggert der die Daten dann abholt. CPU wird so nicht belastet und es gibt keine Latenzprobleme
Das Problem beim SPI ist die fehlende Pufferung und das fehlende Handshake. Der Master muß daher nach jedem Byte eine große Pause machen, damit der Slave in den Interrupt springen kann und das nächte Byte in das Datenregister packen kann. Man könnte auch eine 5. Leitung als Handshake benutzen. Der Slave setzt diese Leitung am Ende des Interrupts auf Low und der Master macht nach dem 1->0 Flankeninterrupt weiter.
Peter D. schrieb: > Das Problem beim SPI ist die fehlende Pufferung und das fehlende > Handshake. Das ist eine mutige Aussage, wenn man nicht einmal weiß, welcher µC verwendet wird.
Mike R. schrieb: > Das ist eine mutige Aussage, wenn man nicht einmal weiß, welcher µC > verwendet wird. Als alter Forumhase hat man das im Blut, daß es um den AVR geht. Ein modernerer Single-Clock 8051 (z.B. AT89LP51RD2) mit gepuffertem SPI hat das Problem nicht: "The user may load the buffer while the shift register is busy, i.e. before the current transfer completes. When the current transfer completes, the queued byte in the transmit buffer is moved to the shift register and waits for the master to initiate another transfer."
Hallo zusammen, vielen Dank schonmal für die Antworten. Den Controller habe ich ganz vergessen. Wäre wohl hilfreich gewesen ;) Aktuell arbeite ich mit einem NXP KEA128. Hatte hier noch ein älteres Evalboard rumfliegen. Der Master wird wohl ein STM sein. Gruß Stephan
Peter D. schrieb: > Mike R. schrieb: >> Das ist eine mutige Aussage, wenn man nicht einmal weiß, welcher µC >> verwendet wird. > > Als alter Forumhase hat man das im Blut, daß es um den AVR geht. > Ein modernerer Single-Clock 8051 (z.B. AT89LP51RD2) mit gepuffertem SPI > hat das Problem nicht: > "The user may load the buffer while the shift register is busy, i.e. > before the current transfer completes. When the current transfer > completes, the queued byte in the transmit buffer is moved to the shift > register and waits for the master to initiate another transfer." Beim AVR gibt es auch etliche (alle?) Modelle, die USARTSPI beherrschen. Dann kann man auch den Puffer nutzen.
Doctor Snuggles schrieb: > Beim AVR gibt es auch etliche (alle?) Modelle, die USARTSPI beherrschen. > Dann kann man auch den Puffer nutzen. Leider aber nicht als Slave, wo er wirklich wichtig wäre.
Hallo zusammen, ich werde dann zusehen, dass der Master dem Slave nach den ersten 8 Bit genug Zeit gibt, damit dieser die nächsten 8 Bit in den Transmit Buffer schieben kann. Ich werde es dann erst einmal so testen. Gruß Stephan
Stephan schrieb: > Aktuell arbeite ich mit einem NXP KEA128. Lt. Datenblatt sollte der einen Sendepuffer haben.
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.