Hallo,
ich hab ein Problem mit dem DMAController beim xMega32A4. Über DMA will
ich Daten per USARTC0 an den PC senden. Der DMA wird gestartet aber es
wird nichts gesendet. Die Daten bei der USARTC0 bleiben noch die alten
vom Empfangen, auch wird die ISR des DMA nicht angesprungen.
Anbei ist der Init und Code zum aufrufen des DMA
Init :
1 | void DMA_TX_ESP_init()
|
2 | {
|
3 | // reset source address
|
4 | DMA_TX_ESP_CHANNEL.SRCADDR0 = 0;
|
5 | DMA_TX_ESP_CHANNEL.SRCADDR1 = 0;
|
6 | DMA_TX_ESP_CHANNEL.SRCADDR2 = 0;
|
7 |
|
8 | // set up destination address
|
9 | DMA_TX_ESP_CHANNEL.DESTADDR0 = (((uint16_t) &USART_Netzwerk.DATA) >> 0) & 0xff;
|
10 | DMA_TX_ESP_CHANNEL.DESTADDR1 = (((uint16_t) &USART_Netzwerk.DATA) >> 8) & 0xff;
|
11 | DMA_TX_ESP_CHANNEL.DESTADDR2 = 0;
|
12 |
|
13 | DMA_TX_ESP_CHANNEL.ADDRCTRL = DMA_CH_SRCRELOAD_NONE_gc; // never reload source address
|
14 | DMA_TX_ESP_CHANNEL.ADDRCTRL |= DMA_CH_SRCDIR_INC_gc; // increment source address during transfer
|
15 | DMA_TX_ESP_CHANNEL.ADDRCTRL |= DMA_CH_DESTRELOAD_NONE_gc; // destination address does not need to be reloaded
|
16 | DMA_TX_ESP_CHANNEL.ADDRCTRL |= DMA_CH_DESTDIR_FIXED_gc; // the destination address should be fixed
|
17 |
|
18 | DMA_TX_ESP_CHANNEL.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_DRE_gc; // automatically trigger a new burst when UARTC0 is ready
|
19 | DMA_TX_ESP_CHANNEL.TRFCNT = 0; // reset block size
|
20 | DMA_TX_ESP_CHANNEL.REPCNT = 0; // do not repeat block transfers
|
21 | DMA_TX_ESP_CHANNEL.CTRLA = DMA_CH_SINGLE_bm; // single shot mode (i.e. one burst transfer per trigger event)
|
22 | DMA_TX_ESP_CHANNEL.CTRLA |= DMA_CH_BURSTLEN_1BYTE_gc; // 1 byte bursts
|
23 | DMA_TX_ESP_CHANNEL.CTRLB |= DMA_CH_TRNINTLVL_HI_gc;
|
24 | }
|
Aufruf :
1 | char helper[] = "Aktueller Unixtimestamp: ";
|
2 | strcat(send_buffer,helper);
|
3 | ultoa(Unixtimestamp,int_buffer,10);
|
4 | strcat(send_buffer,int_buffer);
|
5 | send_buffer[strlen(send_buffer)] = 0x90; //String ENDE
|
6 | DMA_TX_ESP_CHANNEL.SRCADDR0 = ((uint16_t)tx_buffer_Pointer >> 0) & 0xff;
|
7 | DMA_TX_ESP_CHANNEL.SRCADDR1 = ((uint16_t)tx_buffer_Pointer >> 8) & 0xff;
|
8 | DMA_TX_ESP_CHANNEL.SRCADDR2 = 0;
|
9 | DMA_TX_ESP_CHANNEL.TRFCNT = strlen (send_buffer);
|
10 | DMA_TX_ESP_CHANNEL.CTRLA |= DMA_CH_ENABLE_bm;
|
Int. Enable
1 | PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm;
|
2 | sei();
|
Gruß JackFrost