Forum: Mikrocontroller und Digitale Elektronik STM32 SPI, DMA und Timer


von Ingo L. (corrtexx)


Lesenswert?

Ich habe einen STM32F030, der per SPI einen DAC befeuert. Das Ganze 
läuft per DMA und Timer => Der Timer triggert in festen Zeitintervallen 
einen SPI-Transver, DMA entlastet dabei die CPU vollständig. Nun ist es 
so, dass der DAC 16Bit benötigt. Kein Problem also.

Wenn ich jetzt weiter denke, würde ich später gern einen 3-fach DAC 
nehmen. Dieser benötigt dann 3x16Bit. Diese würde ich auch gern per DMA 
übertragen.

Leider finde ich im DB keine Möglichkeit, dass der DMA 3x hintereinander 
"feuert" und somit 3 Übertragungen in einem Rutsch macht. OK, ein F0 ist 
ja nunmal wirklich kein Möglichkeitenmonster. Kann mir jemand sagen ob 
ein F4 sowas nativ ohne Klimmzüge kann? Habe ein F4 Discovery hier 
rumliegen, würde allerdings sicher 1-2 Tage brauchen bis ich das 
ausprobiert habe, daher wäre es echt cool, wenn mir jemand sagen könnte 
ob das geht.

von Lama (Gast)


Lesenswert?

Verstehe dein Problem nicht.

Im Interrupt DMA auf das nächste Kanal umkonfigurieren und neu starten.

Sollte in wenigen Zeilen geschrieben sein.

Ingo L. schrieb:
> OK, ein F0 ist
> ja nunmal wirklich kein Möglichkeitenmonster.

Das hängt von der Person ab, der die Programmierung vornimmt...

von Ingo Less (Gast)


Lesenswert?

Genau das möchte ich vermeiden.

von Ingo Less (Gast)


Lesenswert?

Push

von Jan K. (jan_k)


Lesenswert?

Ingo Less schrieb:
> Genau das möchte ich vermeiden.

Verstehe noch nicht genau das Problem.
Du schubst doch den Spi Transfer per timer an, der dma schaufelt das 
weg. Du schmeißt ja nicht explizit den dma an. Du sagst ihm nur, kopiere 
x Bytes von Adresse A zu Adresse B, wenn welche da sind.
Ich vermute, der 3x dac hat 3 interne dac hat? Also 3 verschiedenen 
register für eine Spi?

Das Problem is doch, die richtige Spi Nachricht zu generieren und nicht 
den dma anzuschmeißen, oder?

von bla (Gast)


Lesenswert?

Gegenfrage: muss das Chip Select beim DAC kurz hoch und runter getaktet 
werden dass er das Datenwort übernimmt? Dann geht das glaub nicht. Sonst 
sollte es ja reichen, einfach 6 Bytes zu senden. Schau im Datenblatt des 
(nicht näher von dir spezifizierten) DACs ob er so Kram wie 
Auto-Inkrement oder so unterstützt.

Eine Alternative, wenn RAM und Datenbuszugriffe kein Problem sind, du 
aber ganz unbedingt dringend zwingend das über DMA machen musst: mach 
SPI in Software, schreib die Zustände der Pins SCK, SDO und CS als Bits 
in einen Array und schick den als parallele Daten per DMA auf einen 
GPIO-Port. Das braucht halt pro SPI-Datenbit zwei Bytes RAM und zwei bis 
drei Instruktionen, aber wenn du eh von F0 auf F4 wechselst ist das eh 
drin.

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.