This is a 7 year old post you are responding to. The project I was working on has long been mothballed and I don't have LPCxpresso installed. I have switched CPU manufactures. Even though NXP forwarded this to me, I had to create a new account to respond this, they didn't recognize my credentials.
I found the datasheet was more accurate than the code. I have about 5 include files that I modified for bug fixes, I let NXP know about the bugs but have no idea if anything was ever fixed. I also don't recall having many examples to work from, but found the datasheet to be fairly accurate.
I will tell you how I created and initialized the descriptors. For the above reasons, I'd suggest taking it with a grain of salt.
// DMAREQ_SPI0_TX CH 9
// DMAREQ_SPI0_RX CH 8
static DMA_CHDESC_T DMASPITXDescriptor[2] __attribute__ ((aligned(16)));
static DMA_CHDESC_T DMASPIRXDescriptor[2] __attribute__ ((aligned(16)));
// note that SPI0ADCTXDATA, ADCRXA, and ADCRXB are source/destination in memory for where the DMA transfer is directed to
int DMA_init(void)
{
DMASPITXDescriptor[0].source = (uint32_t) &SPI0ADCTXDATA[SPI0ADCTXDATALEN-1];
DMASPITXDescriptor[0].dest = (uint32_t) &LPC_SPI0->TXDATCTL;
DMASPITXDescriptor[0].next = (uint32_t) &DMASPITXDescriptor[1];
DMASPITXDescriptor[0].xfercfg = 0; // this should be ignored for SRAM descriptor table
DMASPITXDescriptor[1].source = (uint32_t) &SPI0ADCTXDATA[SPI0ADCTXDATALEN-1];
DMASPITXDescriptor[1].dest = (uint32_t) &LPC_SPI0->TXDATCTL;
DMASPITXDescriptor[1].next = (uint32_t) &DMASPITXDescriptor[1];
DMASPITXDescriptor[1].xfercfg = DMA_XFERCFG_CFGVALID |
DMA_XFERCFG_RELOAD | DMA_XFERCFG_WIDTH_32 | DMA_XFERCFG_SRCINC_1 |
DMA_XFERCFG_DSTINC_0 | DMA_XFERCFG_XFERCOUNT(SPI0ADCTXDATALEN);
DMASPIRXDescriptor[0].source = (uint32_t) &LPC_SPI0->RXDAT;
DMASPIRXDescriptor[0].dest = (uint32_t) &ADCRXA[sizeof(ADCRXA) - 1];
DMASPIRXDescriptor[0].next = (uint32_t) &DMASPIRXDescriptor[1];
DMASPIRXDescriptor[0].xfercfg = DMA_XFERCFG_CFGVALID | DMA_XFERCFG_SETINTA |
DMA_XFERCFG_CLRTRIG | DMA_XFERCFG_RELOAD | DMA_XFERCFG_WIDTH_8 | DMA_XFERCFG_SRCINC_0 |
DMA_XFERCFG_DSTINC_1 | DMA_XFERCFG_XFERCOUNT(sizeof(ADCRXA));
DMASPIRXDescriptor[1].source = (uint32_t) &LPC_SPI0->RXDAT;
DMASPIRXDescriptor[1].dest = (uint32_t) &ADCRXB[sizeof(ADCRXB) - 1];
DMASPIRXDescriptor[1].next = (uint32_t) &DMASPIRXDescriptor[0];
DMASPIRXDescriptor[1].xfercfg = DMA_XFERCFG_CFGVALID | DMA_XFERCFG_SETINTB |
DMA_XFERCFG_CLRTRIG | DMA_XFERCFG_RELOAD | DMA_XFERCFG_WIDTH_8 | DMA_XFERCFG_SRCINC_0 |
DMA_XFERCFG_DSTINC_1 | DMA_XFERCFG_XFERCOUNT(sizeof(ADCRXB));
if (!Chip_DMA_SetupTranChannel(LPC_DMA, DMAREQ_SPI0_TX, &DMASPITXDescriptor[0])) return -1;
Chip_DMA_SetupChannelTransfer(LPC_DMA, DMAREQ_SPI0_TX, DMASPITXDescriptor[1].xfercfg);
Chip_DMA_EnableChannel(LPC_DMA, DMAREQ_SPI0_TX);
Chip_DMA_EnableIntChannel(LPC_DMA, DMAREQ_SPI0_TX);
Chip_DMA_SetupChannelConfig(LPC_DMA, DMAREQ_SPI0_TX,
DMA_CFG_HWTRIGEN | DMA_CFG_TRIGPOL_LOW | DMA_CFG_TRIGTYPE_EDGE |
DMA_CFG_PERIPHREQEN | DMA_CFG_CHPRIORITY(1));
if (!Chip_DMA_SetupTranChannel(LPC_DMA, DMAREQ_SPI0_RX, &DMASPIRXDescriptor[0])) return -1;
Chip_DMA_SetupChannelTransfer(LPC_DMA, DMAREQ_SPI0_RX, DMASPIRXDescriptor[1].xfercfg);
Chip_DMA_EnableChannel(LPC_DMA, DMAREQ_SPI0_RX);
Chip_DMA_EnableIntChannel(LPC_DMA, DMAREQ_SPI0_RX);
Chip_DMA_SetupChannelConfig(LPC_DMA, DMAREQ_SPI0_RX,
DMA_CFG_HWTRIGEN | DMA_CFG_TRIGPOL_LOW | DMA_CFG_TRIGTYPE_EDGE |
DMA_CFG_PERIPHREQEN | DMA_CFG_CHPRIORITY(0));
NVIC_EnableIRQ(DMA_IRQn);
NVIC_EnableIRQ(PIN_INT0_IRQn);
return 0;
}
you will need an interrupt routine which is called when the transfer is complete.
void DMA_IRQHandler(void)
The first DMA initializes and loops on the second descriptor. The second DMA ping-pongs between descriptors.
Not much but good luck
Bob