我自己写了下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:
能把您的程序发到论坛里学习下吗