关键词: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
}
}
Viki Shi:
当DMA中的FIFO的数据达TOTAL_DMA_ELEMENTS时,触发SPI中断函数SpiIntHandler().我的理解是否正确?如果不正确错在哪里?
这句理解不对,dma获取到数据后会通知cpu来处理这些数据。当使用spi的dma模式来读取数据时,流程为 spi中断接收到满足fifo设置要求的数据后,通知DMA来获取 。DMA的功能主要是分担cpu 的工作,让cpu可以继续做其他事情 ,当dma获取到设定的数据大小后,就要通知cpu来把这些数据拿走处理
user1252639:
回复 Viki Shi:
那SpiIntHandler()这个中断函数是谁触发的?SPI每收到一个数据就触发一次吗还是SPI的FIFO中有8个数据时触发一次?这样的话SPI_INT_DMARX又是指什么含义,还有就是在前面配置SPI和DMA就是指明了DMA的源地址和目标地址,为什么在SpiIntHandler()中又调用了一遍UDMASetupTransfer()?dma获取到设定的数据大小后,就要通知cpu来把这些数据拿走处理,这个通过什么通知的???没发现有DMA获取设定数据有中断处理函数啊!!!
Viki Shi:
回复 user1252639:
这个讲起来比较复杂,建议先了解下DMA,原理问题不好阐述
user1252639:
回复 Viki Shi:
原理性的东西会看,现在就想知道谁触发的SpiIntHandler()?文档写的不是很清晰!!!