SPI-Slave: DMA an steigender Flanke von Chip Select starten

OP #7351997
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.

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren