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
>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.
Aber das Bitgewackel ist nicht möglich? Der DMA kann ja nicht wie eine Funktion programmiert werden... Patrick
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.
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
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...
Hallo, Der dspic33fj64GP802 u. 804 hat einen 16b Stereoaudiodac und son AC97 Singsbums.. Vieleicht hilft Dir die Info weiter..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.