Forum: Mikrocontroller und Digitale Elektronik STM32F0 - SPI DMA per Timer compare match triggern - nur ein Byte?


von Ssss S. (sssssss)


Lesenswert?

Hi!

Ich versuche verzweifelt einen SPI DMA transfer per timer auszulösen.
Ich programmiere mit der libopencm3 und einen STM32F72.

Was ich will ist eigentlich ganz einfach, alle 100ms einen 8 Byte 
transfer starten.
DMA setup funktioniert, wenn ich den SPI transfer manuell trigger sehe 
ich die 8 bytes.

Lasse ich aber nun den Timer1 compare match cc2 den DMA triggern sehe 
ich nur ein byte?!

Grüße,
Simon

von Ssss S. (sssssss)


Lesenswert?

Bin inzwischen etwas weitergekommen.
Ich setze beim DMA setup die transferlänge auf 8 Bytes.
Es scheint so als ob jeder compare match genau ein Byte überträgt. Das 
ganze dann 8 mal.
Ich hätte jetzt erwartet dass ein compare match den DMA transfer 
initieiert und der dann erst stoppt wenn <len> bytes übertragen wurden.

Grüße,
Simon

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


Lesenswert?

Ssss S. schrieb:
> Bin inzwischen etwas weitergekommen.
> Ich setze beim DMA setup die transferlänge auf 8 Bytes.
> Es scheint so als ob jeder compare match genau ein Byte überträgt. Das
> ganze dann 8 mal.
> Ich hätte jetzt erwartet dass ein compare match den DMA transfer
> initieiert und der dann erst stoppt wenn <len> bytes übertragen wurden.
>
> Grüße,
> Simon

Jeder compare Match schickt einen Request an die DMA. Die DMA selbst hat 
verschiedene einstellbare Datenbreiten und einen eigenen 16Bit Zähler.
damit kannst du mit einem Compare event 65536 DMA transfers machen.

von Ssss S. (sssssss)


Lesenswert?

Das dachte ich auch. Scheint aber aus irgendeinem Grund nicht zu gehen. 
Es wird immer nur ein Byte pro compare match gesendet.
Ist der buffer 0x01 0x02 0x03 ..
sehe ich pro match auch 0x01 0x02 0x03...
Transfer länge steht aber auf 8 byte. Triggere ich per spi tx request 
sendet er auch alle.

von Ssss S. (sssssss)


Lesenswert?

Ok, war ein missverständnis meinerseits. Die DMA engine verschickt in 
der tat nur ein byte pro trigger event.
Beim SPI ist es halt nur so dass das TXE flag als trigger dient -> alle 
bytes werden gesendet.

Siehe: https://community.st.com/message/153747

von Jonas F. (wuschelkuchen)


Lesenswert?

Verwende Bursts. Dafür gibt es die Felder PBURST und MBURST in den SxCR. 
Dann kann ein DMA-Request auch mehrere SPI-Übertragungen starten.

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.