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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.