TI中文支持网
TI专业的中文技术问题搜集分享网站

请问有SPI DMA 双缓冲的例程吗?

我自己写了下SPI双缓存的例程发现无法通信。。。。。。请问有能用的例程吗?很急!!!!!

Susan Yang:

请问您现在使用的是哪个芯片?CC3200的话,SPI DMA的例程可以参考

https://github.com/yhpan0613/SimpleLink-CC3200/tree/mainstream_br/example/spi_udma_demo

jun wang26:

回复 Susan Yang:

您好,我们设置了SPI的DMA接收双缓存A和B,用于接收FPGA发送的数据,然后还有SPI的DMA发送,用于将上位机接收的数据通过SPI传到FPGA

初始化是这样的

UDMASetupTransfer(UDMA_CH30_GSPI_RX| UDMA_PRI_SELECT,UDMA_MODE_PINGPONG, BUFF_SIZE, UDMA_SIZE_8,UDMA_ARB_1, (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE, g_ucRxBuffA,UDMA_DST_INC_8);

UDMASetupTransfer(UDMA_CH30_GSPI_RX| UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,BUFF_SIZE, UDMA_SIZE_8,UDMA_ARB_1, (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE, g_ucRxBuffB,UDMA_DST_INC_8);

UDMASetupTransfer(UDMA_CH31_GSPI_TX| UDMA_PRI_SELECT,UDMA_MODE_BASIC,16, UDMA_SIZE_8,UDMA_ARB_1, (void *)g_ucTxBuff,UDMA_SRC_INC_8,(void *)(GSPI_BASE + MCSPI_O_TX0), UDMA_DST_INC_NONE);

然后在循环中不断检测标志位,

ulMode = MAP_uDMAChannelModeGet(UDMA_CH30_GSPI_RX | UDMA_PRI_SELECT);//获取DMA通道模式 if(ulMode == UDMA_MODE_STOP) { UDMASetupTransfer(UDMA_CH30_GSPI_RX| UDMA_PRI_SELECT,UDMA_MODE_PINGPONG, BUFF_SIZE, UDMA_SIZE_8,UDMA_ARB_1, (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE, g_ucRxBuffA,UDMA_DST_INC_8);

iStatus=sl_Send(iSockID,g_ucRxBuffA,BUFF_SIZE,0); while(iStatus<0)  { iStatus=sl_Send(iSockID,g_ucRxBuffA,BUFF_SIZE,0); if(iStatus>0)break; } }

ulMode = MAP_uDMAChannelModeGet(UDMA_CH30_GSPI_RX | UDMA_ALT_SELECT); if(ulMode == UDMA_MODE_STOP) { UDMASetupTransfer(UDMA_CH30_GSPI_RX| UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,BUFF_SIZE, UDMA_SIZE_8,UDMA_ARB_1, (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE, g_ucRxBuffB,UDMA_DST_INC_8); iStatus=sl_Send(iSockID,g_ucRxBuffB,BUFF_SIZE,0);// while(iStatus<0)// { iStatus=sl_Send(iSockID,g_ucRxBuffB,BUFF_SIZE,0); if(iStatus>0)break; } }

但是必须在上述程序中再加上SPI发送的程序 ,不管有没有需要发送数据,

if(!MAP_uDMAChannelIsEnabled(UDMA_CH31_GSPI_TX)) { UDMASetupTransfer(UDMA_CH31_GSPI_TX| UDMA_PRI_SELECT,UDMA_MODE_BASIC,TR_BUFF_SIZE, UDMA_SIZE_8,UDMA_ARB_1, (void *)g_ucTxBuff,UDMA_SRC_INC_8,(void *)(GSPI_BASE + MCSPI_O_TX0), UDMA_DST_INC_NONE); MAP_uDMAChannelEnable(UDMA_CH31_GSPI_TX); while(MAP_uDMAChannelIsEnabled(UDMA_CH31_GSPI_TX)); memset(g_ucTxBuff,0,TR_BUFF_SIZE);

}

如果在一个循环中删掉上述的这段发送程序就无法进行SPI的DMA双缓冲接收了,请问这是什么问题呢?

feng jing:

回复 jun wang26:

能把您的程序发到论坛里学习下吗

赞(0)
未经允许不得转载:TI中文支持网 » 请问有SPI DMA 双缓冲的例程吗?
分享到: 更多 (0)