dsPIC "intelligenter" DMA?

OP #2327320
Lesenswert?

Hallo miteinander

Ich habe eine kleine Frage zu DMAs: DMA funktioniert ja in etwa so, dass 
man ein Array von Daten übergibt und dieser arbeitet dann das Ganze für 
SPI, UART... ab.
Da es aber bei vielen SPI-Anwendungen nicht ein reines SPI ist, sondern 
noch weitere Kontroll-Leitungen vorhanden sind (Frame-Sync, Load bei 
DACs), habe ich mich gefragt, ob man das Senden an eines DACs ebenfalls 
mittels DMA lösen kann?

Mein Problem:
Ein dsPIC33FJ soll einen 4-Kanal DAC über das SPI alle 1ms mit neuen 
Daten füttern.
CS geht auf 0 und "gleichzeitig" geht FrameSync kurz auf 1 und wieder 
auf 0. Dann werden die 16Bit für den DAC hinausgeschoben. Anschliessen 
CS wieder auf 1. Das ganze für jeden der 4 DAC's wiederholen. Am Schluss 
soll der DAC die neuen Werte an die Ausgänge übertragen -> Load kurz auf 
0 und wieder auf 1. Und das alle 1ms.

Kann man Zusätzliches Bitgewackel auch mit dem DMA lösen oder ist das 
nur für das SPI Modul gedacht?

Sry für die Fragen aber ich beschäftige mich zum ersten mal mit DMA.

Besten Dank für die Hilfe
MFG
Patrick
Gast #2327343
Lesenswert?

>DMA funktioniert ja in etwa so, dass man ein Array von Daten übergibt..
Nein.
Der DMA-Controller nimmt (irgentwie von aussen oder von innen 
getriggert) Daten entgegen, und schickt die direkt in das Memory hinein.
Dazu gibt es verschiedene Techniken.
Mal wird die CPU dafür für einige Takte angehalten, mal ist abwechselnd 
CPU u DMA aktiv, mal geht der Transfer 'spurlos' (ggfs über DPRAM) an 
der CPU vorbei.
Je leistungsfähiger der Transfer desto aufwändiger und teurer der uC.
WAS das für Daten sind, ist dem DMA-Controller egal.
Gast #2327428
Lesenswert?

Der DMA-Controller macht ja nur den Datentransfer vom Speicher zum Modul 
bzw. vom Modul zum Speicher. Dazu bekommt der DMA-Controller einen 
Trigger vom Modul (z.B. UART Tx leer, ADC-Wert fertig usw).
D.h. die Logik für Deine Steuerleitung müßte im SPI-Controller selber 
vorhanden sein, der DMA hat damit nichts am Hut. Wenn's der 
SPI-Controller nicht kann, dann hilft auch der DMA nicht.
#2327507
Lesenswert?

Patrick B. schrieb:

> Ein dsPIC33FJ soll einen 4-Kanal DAC über das SPI alle 1ms mit neuen
> Daten füttern.
> CS geht auf 0 und "gleichzeitig" geht FrameSync kurz auf 1 und wieder
> auf 0. Dann werden die 16Bit für den DAC hinausgeschoben. Anschliessen
> CS wieder auf 1. Das ganze für jeden der 4 DAC's wiederholen. Am Schluss
> soll der DAC die neuen Werte an die Ausgänge übertragen -> Load kurz auf
> 0 und wieder auf 1. Und das alle 1ms.

Einige dsPIC33 haben ein DCI (Data Communication Interface), das z.B. 
für Audio-Codecs verwendet werden kann. Stichwort I2S oder AC97. Wenn Du 
einen passenden Codec verwendest, macht das DCI die ganzen Geschichten 
mit MCLK,LRCLK/FSYNC etc automatisch, und es wird so einfacher bzw 
überhaupt erst möglich, das per DMA zu realisieren.

fchk
OP #2327591
Lesenswert?

Ich habe es gerade nachgeschaut. Der dsPIC33FJ128MC804, den ich 
verwende, hat ein DCI, aber leider sind nur CSCK, COFS, CSDI und CSDO 
vorhanden. Dann müsste ich das Load-Bit extern lösen.
Die Analogausgabe ist auch nicht für Audio gedacht, aber wenn man damit 
den DAC ansteuern kann...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren