关键词:CC3200 SPI DMA
主要配置流程如下:
我想咨询几个问题
1,这段程序的意思是:
SPI通过中断接收到数据后,缓存到一个FIFO中,当SPI的FIFO中的数据达8个时,触发DMA来读 一次,读后缓存入DMA的FIFO中,
当DMA中的FIFO的数据达TOTAL_DMA_ELEMENTS时,触发SPI中断函数SpiIntHandler().我的理解是否正确?如果不正确错在哪里?
2,如果我上面的理解正确的话,我想请教下面个问题:
a, SPI接收到数据后是首先是存放在GSPI_BASE + MCSPI_O_RX0这个寄存器中的,收到8个数据触发DMA时,DMA读取的源地址还是这个地址,
这个地址是代表着SPI的FIFO地址吗?
b,UDMA_ARB_8代表什么函义?
3,关于UDMASetupTransfer这个函数的详细说明在哪个文档中?有相关的API说明吗?
4,NO DEAD CYCLE BETWEEN TWO SUCCESSIVE WORDS IN SLAVE MODE的内含是什么?
是指在多个字节之间可以一直保持CS为低,直到传输结束而不用拉高吗?
spi_init()
{
UDMAInit();
***();
SPIIntRegister(ulBase,SpiIntHandler);
UDMASetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
UDMA_SIZE_8,UDMA_ARB_8,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
(void *)&g_Buff, UDMA_DST_INC_8);
UDMASetupTransfer(UDMA_CH30_GSPI_RX|UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
UDMA_SIZE_8, UDMA_ARB_8,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
(void *)&g_Buff[TOTAL_DMA_ELEMENTS], UDMA_DST_INC_8);
SPIFIFOLevelSet(ulBase,8,8);
SPIDmaEnable(ulBase,SPI_RX_DMA);
MAP_SPIIntEnable(ulBase,SPI_INT_DMARX);
SPIDmaEnable(ulBase,SPI_TX_DMA);
MAP_SPIIntEnable(ulBase,SPI_INT_DMATX);
}
SpiIntHandler()
{
ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);
if(ulStatus & SPI_INT_DMARX)
{
if(g_DMARcvBank == 0)
{
UDMASetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
UDMA_SIZE_8,UDMA_ARB_8,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
(void *)&g_Buff[g_Count], UDMA_DST_INC_8);
}
else
{
UDMASetupTransfer(UDMA_CH30_GSPI_RX|UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
UDMA_SIZE_8,UDMA_ARB_8,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
(void *)&g_BeamBuff[g_Count], UDMA_DST_INC_8);
}
g_Count += TOTAL_DMA_ELEMENTS
}
}