Forum: Mikrocontroller und Digitale Elektronik SPI 16 Bit senden 8 Bit Register


von Stephan (Gast)


Lesenswert?

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

von Volle (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Mike R. (thesealion)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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."

von Stephan (Gast)


Lesenswert?

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

von Doctor Snuggles (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Stephan (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.