Other Parts Discussed in Thread:CC3200
CC3200的SPI工作在从机DMA乒乓模式下,使能收发中断,部分初始化如下
SPIFIFOLevelSet(ulBase,8,8);
SPIFIFOEnable(ulBase, SPI_RX_FIFO | SPI_TX_FIFO);
SPIIntEnable(ulBase,SPI_INT_RX_FULL|SPI_INT_TX_EMPTY);
中断处理中:
static void SpiIntHandler()
{
unsigned long ulStatus;
ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);
MAP_SPIIntClear(GSPI_BASE,SPI_INT_DMARX|SPI_INT_DMATX);
if(ulStatus & SPI_INT_DMARX)
{
if(g_DMARcvBank == 0)
{
UDMASetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_PINGPONG,32,
UDMA_SIZE_8,UDMA_ARB_8,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
(void *)&buf[0], UDMA_DST_INC_8);
g_DMARcvBank = 1;
}
else{
……..
}
请问DMA工作原理及中断是什么时候触发的?我不是专业做这个的,很多可能基本的东西不一定了解,我按我的理解说一下流程,帮我看一下是否正确,谢谢
首先SPI收到一个字节数据到寄存器DR中,然后由于开通了DMA,所以DR中的数据自动转移到DAM的缓存FIFO中,当缓存FIFO中的数据数量达到要求的值时,触发中断,交由CPU进行进一步处理???是这样的吗????
Viki Shi:
有个SPI+DMA的例程,参考一下:github.com/…/spidma.ino
,
Viki Shi:
以及:e2e.ti.com/…/402221
,
user1252639:
再多问一句,这里的中断函数什么时候调用 ????SPI收到一外数据就触发还是收到满足DMA的要求的数量后触发?
,
Viki Shi:
参考此帖答案:e2echina.ti.com/…/185079