I'm attempting to set the DMA for the RX of the UART/ESCI.
The DMA finishes but the destination buffer never received the that was received.
Why is it the DMA finishes but doesn't put the data in the destination buffer address?
Edit: I can receive over the uart by polling the CR1 register or interrupting when the UART received.
Edit: After the DMA is finished, I print of the status register. The status register is 0xE0_01_C0_00
#define DMA_ESCIA_TX 18
#define DMA_ESCIA_RX 19
#define DMA_ESCIB_TX 34
#define DMA_ESCIB_RX 35
void esci_init_default(struct ESCI_tag pEsci)
pEsci->CR1.R = 0x0005000C;
uint8_t tx_channel = pEsci == &ESCI_A ? DMA_ESCIA_TX : DMA_ESCIB_TX;
uint8_t rx_channel = pEsci == &ESCI_A ? DMA_ESCIA_RX : DMA_ESCIB_RX;
EDMA.TCD[tx_channel].DONE = 1;
EDMA.TCD[rx_channel].DONE = 1;
pEsci->CR2.R = 0x2C00;
pEsci->LCR.R = 0x00000000;
}
void EDMA_ESCI_Receive(struct ESCI_tag* eSCI, uint8_t *bufptr, uint32_t count)
{
uint8_t rx_channel = eSCI == &ESCI_A ? DMA_ESCIA_RX : DMA_ESCIB_RX;
EDMA.TCD[rx_channel].SADDR = (vuint32_t)&eSCI->DR + 1;
EDMA.TCD[rx_channel].SSIZE = 0;
EDMA.TCD[rx_channel].SOFF = 0;
EDMA.TCD[rx_channel].SLAST = 0;
EDMA.TCD[rx_channel].SMOD = 0;
EDMA.TCD[rx_channel].DADDR = (vuint32_t)bufptr;
EDMA.TCD[rx_channel].DSIZE = 0;
EDMA.TCD[rx_channel].DOFF = 1;
EDMA.TCD[rx_channel].DLAST_SGA = 0;
EDMA.TCD[rx_channel].DMOD = 0;
EDMA.TCD[rx_channel].NBYTES = 1;
EDMA.TCD[rx_channel].BITER = count;
EDMA.TCD[rx_channel].CITER = count;
EDMA.TCD[rx_channel].DREQ = 1;
EDMA.TCD[rx_channel].INTHALF = 0;
EDMA.TCD[rx_channel].INTMAJ = 1;
EDMA.TCD[rx_channel].MAJORELINK = 0;
EDMA.TCD[rx_channel].ESG = 0;
EDMA.TCD[rx_channel].BWC = 0;
EDMA.TCD[rx_channel].START = 0;
EDMA.TCD[rx_channel].DONE = 0;
EDMA.TCD[rx_channel].ACTIVE = 0;
EDMA.SERQR.R = rx_channel;
}
int EDMA_ESCI_IsRxDMADone(struct ESCI_tag* eSCI)
{
uint8_t rx_channel = eSCI == &ESCI_A ? DMA_ESCIA_RX : DMA_ESCIB_RX;
return (EDMA.TCD[rx_channel].DONE == 1);
}
int esci_setBaudRate(struct ESCI_tag* pEsci , int baudRate)
{
if (pEsci == NULL) return -1;
pEsci->CR1.B.SBR = (BD_CPU_CLK_HZ / (16 * baudRate));
return ((BD_CPU_CLK_HZ)/(16 * pEsci->CR1.B.SBR));
}
#define COMMAND_BUFFER_SIZE 3
uint8_t dma_buffer[COMMAND_BUFFER_SIZE] = {0};
void main(void)
{
esci_init_default(&ESCI_A);
esci_setBaudRate(&ESCI_A, 9600);
memset(dma_buffer, 0x55, COMMAND_BUFFER_SIZE);
EDMA_ESCI_Receive(&ESCI_A, dma_buffer, 1);
while(1)
{
if(EDMA_ESCI_IsRxDMADone(&ESCI_A))
{
WriteUARTN(&ESCI_A.SR.R, 4);
WriteUARTN(dma_buffer, COMMAND_BUFFER_SIZE);
memset(dma_buffer, 0x55, COMMAND_BUFFER_SIZE);
EDMA_ESCI_Receive(&ESCI_A, dma_buffer, 1);
}
}
}