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