STM32 Timer Sync SPI DMA Verhalten

OP #7754484
Lesenswert?
• ▲
▼

Hallo zusammen. Ich habe eine Frage bezüglich eines Projektes, bei dem ich auf ein seltsames Verhalten gestoßen bin. Ich will ein Signal über einen ADC sampeln und über einen DAC wieder ausgeben. Der ADC ist ein MCP3561, der wahlweise über einen externen Crystal oder einem Takt durch einen Timer erzeugt versorgt wird. Sobald ein Sample bereit steht, wird ein Interrupt auf Tim12 ausgelöst, welcher die DMA von ADC und DAC synchronisieren soll.

Es wird ein STM32H7 mit zwei SPI Periphals konfiguriert: SPI1 als Full Duplex Master, 32 bit und RX/TX Circular DMA, ebenfalls 32 bit (Word). SPI2 als Transmit Only Master, 16 bit und TX Circular DMA, 16 bit (Half word). Die Synchronisierung ist jeweil auf dem TX DMA Stream und auf dem Rising Edge von Tim12.

Das alles funktioniert auch. Timer löst aus, DMA Streams starten, Werte werden über einen Ping Pong Buffer eingelesen und synchron auch wieder ausgegeben. Nur alles doppelt. Bei jedem Triggern des Timers werden 2x32 Bit beim ADC und 2x16 Bit beim DAC ausgegeben und ich habe keine Ahnung warum. Auch die DMA inkrementiert bei jedem Trigger zwei mal. DMA und SPI decken sich zumindest mal.

Ich habe testweise mal versucht SPI1 als Receive Only Master zu konfigurieren und anstatt HAL_SPI_TransmitReceive_DMA() die HAL_SPI_Receive_DMA() Methode zu verwenden, allerdings ohne Erfolg. Anscheinend ist der Receive Only Master bei STM nicht zu gebrauchen (Forensuche). Auch das Verwenden von unterschiedlichen DMA Periphals (DMA1 für SPI1 und DMA2 für SPI2) hat nichts gebracht. Ich konnte bei SPI2 den DMA Stream auf 8 bit reduzieren, wodurch dann "korrekt" 16 bit ausgegeben wurden, mit etwas Bitshiften hatten auch die Werte am DAC gepasst. Nur wirklich befriedigend ist die Lösung nicht.

Was ich nicht weiß, bzw bisher nicht rausgefunden habe, wie verhält sich der Timer? Der Interrupt vom ADC ist ein kurzes runterreißen, somit periodisch eine fallende und eine steigende Flanke. Löst der Timer bei beiden Flanken aus? Ich habe zumindest in den Konfigurationsfeldern in CubeMX keine Option diesbezüglich gefunden, oder vllt etwas übersehen.

Hat jemand schon mal was diesbezüglich gemacht und vllt eine Lösung dafür?

Viele Grüße, Johannes

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.