Forum: Mikrocontroller und Digitale Elektronik SPI-Slave: DMA an steigender Flanke von Chip Select starten


von Johannes B. (groovycat)


Lesenswert?

Hallo,

ich haben einen STM32F4, der als SPI-Master jede Millisekunde mehrere 
Bytes an einen netX90 als SPI-Slave sendet. Im netX90 empfängt der 
SPI-Slave die Daten über DMA. Der DMA läuft als eine verkettete Liste in 
einer Endlosschleife. Wenn der DMA im netX90 alle Bytes empfangen hat, 
wird im netX90 ein DMA-Complete-Interrupt ausgelöst.

Beim Start einer Übertragung setzt der Master das Chip Select auf LOW 
und wenn alle Daten in das Datenregister geschoben wurden wieder auf 
HIGH. Master und Slave müssen synchron sein. Das heißt, dass zum 
Zeitpunkt des DMA-Complete-Interrupts das letzte Byte einer Übertragung 
empfangen wurde.

Die Anzahl der Bytes kann sich ändern. Dadurch muss der netX90 den DMA 
stoppen und neustarten, um wieder synchron zu sein. Erfolgt der Start 
des DMAs zum falschen Zeitpunkt, sind Master und Slave nicht synchron, 
weil der Slave den DMA während der Übertragung startet. Das führt dazu, 
dass die Daten verschoben sind.

Da es im netX90 nicht möglich ist, an Chip Select ein Interrupt zu 
generieren, habe ich zusätzlich einen GPIO des STM32F4 mit einem GPIO 
des netX90 verbunden. Diese Leitung ziehe im STM32F4 auf LOW und HIGH 
wenn auch das Chip Select auf LOW und HIGH geht. Über diese Leitung 
versucht sich der netX90 neu zu synchroniseren. Hier gibt es jetzt 2 
Möglichkeiten:

1. Start des DMAs an der fallenden Flanke

Das wird nicht funktionieren, weil kurz das nach der fallenden Flanke 
der STM32F4 die Übertragung startet und der netX90 so den DMA zu spät 
startet, während die Übertragung schon aktiv ist.

2. Start des DMAs an der steigenden Flanke

Hier bin ich davon ausgegangen, dass Master und Slave synchron sein 
müssten, weil zu diesem Zeitpunkt die Übertragung schon beendet ist und 
die nächste Übertragung erst nach einer Millisekunde erneut stattfindet. 
Die Daten sind aber verschoben. Wenn ich allerdings im Interrupt der 
steigenden Flanke länger als 10 Mikrosekunden warte, sind die Daten 
wieder synchron.

Ich habe bereits eine bessere Lösung gefunden: STM32F4 und netX90 sind 
noch über USART verbunden, so dass der netX90 dem STM32F4 mitteilen 
kann, die Übertragung zu unterbrechen. So kann der netX90 sich sicher 
synchronisieren, wenn wirklich nichts auf der Leitung ist. Dennoch würde 
ich gerne verstehen, warum die Daten beim Start des DMAs an der 
steigenden Flanke verschoben sind und nach 10 Mikrosekunden dann 
plötzlich nicht mehr. Hat jemand dafür vielleicht eine Erklärung?

Gruß

GroovyCat

von Johannes B. (groovycat)


Lesenswert?

Es kann auch nicht daran liegen, dass im SPI-Slave noch Daten im FIFO 
liegen, weil ich den FIFO des SPI-Slaves vor dem Start des DMA komplett 
leer mache.

von Max G. (l0wside) Benutzerseite


Lesenswert?

Das scheint ja eher eine Frage zum netx90 als zum STM32 zu sein. 
Vielleicht schreibst du das in den Titel, dann könntest du Glück haben 
und jemanden finden, der den Baustein kennt.

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.