Мне нужно переслать по SPI большой блок данных (4096 байт). Я нашел пример
Код
void vfnInitDMA_SPITxMstr(void)
{
SIM->SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
SIM->SCGC7 |= SIM_SCGC7_DMA_MASK;
/********************************************************************************
**************************************************/
/********************************************************************************
**************************************************/
/* Look for the DMA request sources table on your RM for a complete list of available sources */
DMAMUX->CHCFG[0] |= DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(17); //SPI0 TX
/*start the sequence*/
//DMA_ERQ |= DMA_ERQ_ERQ0_MASK;
/* This example has no table of data to */
/* transfer, making only a single minor loop necessary to complete a major loop */
DMA0->TCD[0].SADDR = (uint32_t)&MstrDataSend_Buff; //Source address
/* Destination address */
DMA0->TCD[0].DADDR = (unsigned long)(&SPI0->PUSHR); //
/* Source offset disabled */
DMA0->TCD[0].SOFF = 0x04;
/* Source and Destination Modulo off, source and destination size 2 = 32 bits */
DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);
/* Transfer 4 bytes per transaction */
DMA0->TCD[0].NBYTES_MLNO = 0x04;
/* No adjust needed */
DMA0->TCD[0].SLAST = -32;
/* Destination offset disabled */
DMA0->TCD[0].DOFF = 0x00;
/* No link channel to channel, 1 transaction */
DMA0->TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(8);
/* No adjustment to destination address */
DMA0->TCD[0].DLAST_SGA = 0;
DMA0->TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(8);
DMA0->TCD[0].CSR = DMA_CSR_INTMAJOR_MASK | DMA_CSR_DREQ_MASK;
}
Есть пара непонятных моментов.
DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2); - это размер единичной посылки или размер всего блока? где задается размер пересылаемого блока?
Сообщение отредактировал Jenya7 - Jun 3 2018, 14:08