Forum: Mikrocontroller und Digitale Elektronik Multichannel DAC mit SPi-DMA beschreiben


von Markus M. (soarmaster)


Lesenswert?

Hallo zusammen,

ich möchte mit einem STM32H7xxx einen 8-kanal DAC mit SPI-DMA ansteuern. 
Das besondere ist, dass die SPI ALLE Kanäle nacheinander mit einem 
Transfer beschreiben soll. Nun finde ich keinen DAC, der das mitmacht. 
Alle DACs wollen nach jedem Frame einen SYNC haben, der die Daten aus 
dem Input-Register in das entsprechende DAC Register schreibt. Die 
SPI-DMA kann das aber nicht. Hat jemand eine Empfehlung für einen 8 
Channel DAC (12 oder 16 Bit) mit derartigem "sequential write"?

Gruß,
Markus

von Rahul D. (rahul)


Lesenswert?

Markus M. schrieb:
> Hat jemand eine Empfehlung für einen 8
> Channel DAC (12 oder 16 Bit) mit derartigem "sequential write"?

Das nicht, aber z.B. TI hat einen Application Report zur Lösung (wenn 
ich das Problem richtig verstanden habe):
https://www.ti.com/lit/an/snaa070a/snaa070a.pdf?ts=1754701476142

von N. M. (mani)


Lesenswert?

Markus M. schrieb:
> Die SPI-DMA kann das aber nicht.

Das halte ich für eine gewagte These. Mit dem H7 den du dir ausgesucht 
hast, hast du ein echtes DMA Monster 😄

Markus M. schrieb:
> Alle DACs wollen nach jedem Frame einen SYNC haben, der die Daten aus
> dem Input-Register in das entsprechende DAC Register schreibt.

Daten übertragen und sync können doch 2 DMA Jobs sein. Genau dafür gibt 
es doch die DMA Streams beim H7 vermute ich.

Mach mal genauere Angaben wie das genau aussehen soll und was für einen 
DAC du verwendet hättest.

: Bearbeitet durch User
von N. M. (mani)


Lesenswert?

MDMA mit Linked List meinte ich

von Markus M. (soarmaster)


Lesenswert?

Rahul D. schrieb:
> Markus M. schrieb:
>> Hat jemand eine Empfehlung für einen 8
>> Channel DAC (12 oder 16 Bit) mit derartigem "sequential write"?
>
> Das nicht, aber z.B. TI hat einen Application Report zur Lösung (wenn
> ich das Problem richtig verstanden habe):
> https://www.ti.com/lit/an/snaa070a/snaa070a.pdf?ts=1754701476142

Da geht es um Daisy Chaining, also mehrere DACs in Serie. Die Option 
habe ich auch, anstatt einen 8-Kanal DAC 8 Einkanal-DACs zu nehmen. Ist 
aber momentan nicht so geplant.

Gruß
Markus

von Markus M. (soarmaster)


Lesenswert?

N. M. schrieb:
> Markus M. schrieb:
>> Die SPI-DMA kann das aber nicht.
>
> Das halte ich für eine gewagte These. Mit dem H7 den du dir ausgesucht
> hast, hast du ein echtes DMA Monster 😄
>
> Markus M. schrieb:
>> Alle DACs wollen nach jedem Frame einen SYNC haben, der die Daten aus
>> dem Input-Register in das entsprechende DAC Register schreibt.
>
> Daten übertragen und sync können doch 2 DMA Jobs sein. Genau dafür gibt
> es doch die DMA Streams beim H7 vermute ich.
>
> Mach mal genauere Angaben wie das genau aussehen soll und was für einen
> DAC du verwendet hättest.

Ich habe diese Thema schon Stunden mit der KI diskutiert, die reimt sich 
aber anhand der Datenblätter die abenteuerlichsten Lösungen zusammen 
;-). Fakt ist, dass es (anscheinend) keinen DAC git, der im Burst Mode 
alle DAC Register beschreiben kann. Eigentlich schade, da gerade DMA 
davon profitiert, ohne Unterbrechungen und damit zusätzliche CPU Last 
arbeiten zu können.
Einen Versuch mit Hardware NSS der SPI habe ich noch. Mit der 
DMA-Linked-List muss ich mich erst noch beschäftigen. Vielleicht geht es 
damit, dass ein zweiter DMA-Kanal nach 24 (bzw 32) Clocks der SPI mit 
einem GPIO das SYNC-Signal kurz auf high toggelt, danach die SPI-DMA den 
folgenden Kanal sendet usw.
Gruß
Markus

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


Lesenswert?

Du wirst keinen Controller finden der ein 8x24 bzw. 8x32 Bit 
Ausgangsschieberegister hat. Der H7 kann 32bit in einen Frame packen und 
die DMA kann 8 32bit Frames hinter einander schicken. Das NSS Signal 
wird dabei automatisch von der SPI für jeden Frame generiert und die 
Speicheradresse, von der deine Daten kommen, wird nach jedem Frame von 
der DMA hoch gezählt.
Wo ist jetzt dein Problem ?

von Markus M. (soarmaster)


Lesenswert?

Jeder versteht es irgendwie anders... Ich habe kein Problem mit dem 
Controller und der DMA uns weiß wie sie funktioniert.

Mein aktuelles Thema sind Multichannel DACs. Bisher nutze ich sie, indem 
ich einen Frame sende, das Sync Signal per Software schalte, dann den 
nächsten Frame auf gleiche Art usw.

Nun war mein Gedanke bzw der Wunsch, hier DMA einzusetzen. Aber eben 
nicht um nur einen Frame zu senden, sondern alle mit einem DMA Transfer 
so wie in unzähligen anderen Projekten, in denen jedoch noch kein 
Multichannel SPI-DAC das Ziel war.
 Die Frage hier bezog sich darauf, ob es einen DAC gibt, der 8 Frames 
_in_nur_einem_Sync_Zyklus empfangen kann, quasi seinen internen 
Adresspointer sequentiell selbst hochzählt.
Da es den nun offensichtlich nicht gibt, werde ich mit den 
"Single-Frame-DAC" weiter arbeiten. Hier kam nun die Erkenntnis, das 
Sync Signal pro Frame von der SPI-Hardware erzeugen zu lassen.
Aktueller Stand ist, dass im Versuchsaufbau nur der erste Frame 
berücksichtigt wird, die restlich ignoriert werden. Daran arbeite ich 
derzeit mit dem Logic Analyzer.

Gruß
Markus

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


Angehängte Dateien:

Lesenswert?

Beispiel: LTC2656 Octal 16-/12-Bit Rail-to-Rail DAC. Das war der erste 
den ich bei Mouser gefunden habe.
In Anhang das Timing.
Und im Datenblatt auf Seite 19 steht:

Normal operation resumes by executing any command
which includes a DAC update, in software as shown in
Table 1 or by taking the asynchronous LDAC pin low.

Ich verstehe "or" so das der LDAC nicht unbedingt gebraucht wird, wenn 
du den als Sync meintest.

Dazu gibt es die Commands (Table 1):
Write to Input Register n, Update (Power Up) All und
Write to and Update (Power Up) n

Ich denke andere DAC werden ähnlich arbeiten.

von Markus M. (soarmaster)


Lesenswert?

Hans-Georg L. schrieb:
> Normal operation resumes by executing any command
> which includes a DAC update, in software as shown in
> Table 1 or by taking the asynchronous LDAC pin low.
>
> Ich verstehe "or" so das der LDAC nicht unbedingt gebraucht wird, wenn
> du den als Sync meintest.

Vielleicht ist das ja beim Erstkontakt mit diesen Bausteinen etwas 
verwirrend, aber LDAC haut die Daten raus, SYNC schaufelt sie rein. Es 
ging von Anfang an um´s rein, nicht ums raus.

Egal.

Problem gelöst.: Der H7 hat einen Hardware SLAVE SELECT (NSS). Der ist 
recht flexibel konfigurierbar. Er macht das was SS eigentlich soll und 
er kann zwischen zwei SPI-Frames innerhalb eines DMA-Transfers "warten", 
wobei auch SCLK und MOSI stehen bleiben. Perfekt für das was ich wollte. 
Alles voll über DMA, kein Dazwischenfunken per Software.

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

Markus M. schrieb:
> Hans-Georg L. schrieb:
>> Normal operation resumes by executing any command
>> which includes a DAC update, in software as shown in
>> Table 1 or by taking the asynchronous LDAC pin low.
>>
>> Ich verstehe "or" so das der LDAC nicht unbedingt gebraucht wird, wenn
>> du den als Sync meintest.
>
> Vielleicht ist das ja beim Erstkontakt mit diesen Bausteinen etwas
> verwirrend, aber LDAC haut die Daten raus, SYNC schaufelt sie rein. Es
> ging von Anfang an um´s rein, nicht ums raus.
>
> Egal.
>
> Problem gelöst.: Der H7 hat einen Hardware SLAVE SELECT (NSS). Der ist
> recht flexibel konfigurierbar. Er macht das was SS eigentlich soll _und_
> er kann zwischen zwei SPI-Frames innerhalb eines DMA-Transfers "warten",
> wobei auch SCLK und MOSI stehen bleiben. Perfekt für das was ich wollte.
> Alles voll über DMA, kein Dazwischenfunken per Software.

Was habe ich anderes geschrieben als das der H7 mit DMA ohne Sync kann ?
Du hast doch dauernd mit deinem SYNC angefangen.
Hast du dir das Datenblatt überhaupt angeschaut?
Da gibt es kein Sync und der LDAC Ist Asynchron Update Pin ...

Hauptsache du bist der Könner und glücklich :-)

von Markus M. (soarmaster)


Lesenswert?

Hans-Georg L. schrieb:
> Markus M. schrieb:
...
ischen zwei SPI-Frames innerhalb eines DMA-Transfers "warten",
>> wobei auch SCLK und MOSI stehen bleiben. Perfekt für das was ich wollte.
>> Alles voll über DMA, kein Dazwischenfunken per Software.
>
> Was habe ich anderes geschrieben als das der H7 mit DMA ohne Sync kann ?
> Du hast doch dauernd mit deinem SYNC angefangen.
> Hast du dir das Datenblatt überhaupt angeschaut?
> Da gibt es kein Sync und der LDAC Ist Asynchron Update Pin ...
>
> Hauptsache du bist der Könner und glücklich :-)

Ja, da gibts kein Sync. Analog und TI nennen den Pin und das Signal 
"SYNC",  bei deinem genannten Chip heißt das "/CS_LD", macht aber das 
gleiche wie Sync.... Ja, und der muss per Hardware kommen, LDAC kann der 
DAC selbst per entsprechenden Command.

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

Hans-Georg L. schrieb:
> Das NSS Signal wird dabei automatisch von der SPI für jeden Frame
> generiert.

Sorry das ich NSS anstelle von SYNC geschrieben habe, das war ein 
unverzeihlicher Anfängerfehler ;-)

von Wastl (hartundweichware)


Lesenswert?

Markus M. schrieb:
> Der H7 hat einen Hardware SLAVE SELECT (NSS).

Praktisch jeder STM32 (ich kenne nicht alle) hat einen Hardware
Chip Select der von SPI aus gesteuert werden kann. Dass der
nicht so flexibel gesteuert werden kann wie beim H7 mag sein,
aber er existiert allermeistens.

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


Angehängte Dateien:

Lesenswert?

Wastl schrieb:
> Markus M. schrieb:
>> Der H7 hat einen Hardware SLAVE SELECT (NSS).
>
> Praktisch jeder STM32 (ich kenne nicht alle) hat einen Hardware
> Chip Select der von SPI aus gesteuert werden kann. Dass der
> nicht so flexibel gesteuert werden kann wie beim H7 mag sein,
> aber er existiert allermeistens.

Im Anhang ist eine Übersichtstabelle:

Das Dokument dazu gibt es hier:

https://www.st.com/resource/en/application_note/an5543-guidelines-for-enhanced-spi-communication-on-stm32-mcus-and-mpus-stmicroelectronics.pdf

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.