Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Sync SPI DMA Verhalten


von Johannes (zuberjo)


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

von Hans-Georg L. (h-g-l)


Lesenswert?

Kannst du mal deine *.ioc von Cube MX anhängen, dann sieht man gleich 
viel mehr ?

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.