Hi Community, Ich bin auf der Suche nach einer Möglichkeit, vom RAM Daten per DMA ans UART zu schicken. Gibt es irgendwo vielleicht schon Beispiele oder ANs oder hat das schon mal jemand gemacht? Ich habe leider bisher nichts gefunden, und es sind doch einige Einstellungen notwendig (burstsize, transferwidth...). M2M läuft ohne Probleme. Ich arbeite mit einem LPC2478 DMA und UART sind aber gleich wie z.B. im LPC23xx. liebe Grüße Jan
mein Code sieht so aus:
1 | #define DMA_SRC 0x7FD00000 // usb Ram
|
2 | #define DMA_DST 0xE000C000 // uart0
|
3 | #define DMA_SIZE 0x04 // länge des zu kopierenden Blocks
|
4 | |
5 | |
6 | void init_DMA(void) |
7 | {
|
8 | |
9 | // Enable GPDMA clock
|
10 | PCONP |= (1 << 29); |
11 | |
12 | // clear all interrupts on channel 0
|
13 | GPDMA_INT_TCCLR = 0x01; |
14 | GPDMA_INT_ERR_CLR = 0x01; |
15 | |
16 | // CH0 verwenden
|
17 | GPDMA_CH0_SRC = DMA_SRC; |
18 | GPDMA_CH0_DEST = DMA_DST; |
19 | |
20 | GPDMA_CH0_LLI=0; |
21 | |
22 | // Controll konfigurieren
|
23 | GPDMA_CH0_CTRL = ((DMA_SIZE/4) & 0x0FFF) // Transfersize |
24 | | (0x0 << 12) // SBurstSize M 1 transfer |
25 | | (0x0 << 15) // DBurstSize P 1 transfer |
26 | | (0x0 << 18) // Source Width M 1 Byte |
27 | | (0x0 << 21) // Dest. Width P 1 Byte |
28 | | (1 << 26) // SI Source Inkrement |
29 | &~ (1 << 27) // DI kein Destination Inkrement |
30 | | 0x80000000; // Terminal count interrupt enable bit -> interrupt wenn DMA fertig! |
31 | |
32 | GPDMA_CH0_CFG |=(1<<0) // channel enable |
33 | | (1<<0) // flow controll M2P !!! M2P sonst 0 für M2M |
34 | | (1<<14) // IE masks out error interrupt |
35 | | (1<<15) // ITC masks out terminal count interrupt |
36 | &~(1<<18) // HALT ausschalten |
37 | &~(1<<16); // Lock ausschalten |
38 | |
39 | // Enable DMA channels, little endian
|
40 | GPDMA_CONFIG = 0x01; |
der UART ist initialisiert und funktioniert auch, wenn ich ohne DMA etwas auf die Adresse 0xE000C000 (Transmit Hold Register) schreibe. Burstsize und Width sind erstmal auf ein Tranfer und ein Byte eingestellt. Ändere ich die Zieladresse auf einen Bereich im USB Ram, funktioniert die Übertragung. (Seltsam ist, dass es auch funktioniert wenn ich das Flowcontroll auf M2P habe)
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.