使用两块CC3200进行SPI DMA 在乒乓模式下传输并发送给TCP时出现小部分数据传输错误的问题
CC3200作为从机时,向主机发送一组大小为1024字节的数据。每组数据开头为0x11 0x22 0x33 0x44,结尾为0x66,0x77,0x88,0x99,中间的数据都为0x55。
在不结合TCP的情况下。通过使用串口输出主机收到的部分字节可以看到,有一小部分数据是错误的。
当我结合TCP的时候,可以发现错误的数据的规律。就是会出现某一组数据全为0x55的情况。不见了人为设置的数组数据头和尾。
一般几十组数据才会出现有一组这样错误的情况。想请问一下TI的工程师,会是什么原因造成的,有什么好的修改方案吗。
下面是我处理接收到的数据的程序。发送接收缓冲数组大小都是1024.如果需要我可以上传我的程序。
ulMode = MAP_uDMAChannelModeGet(UDMA_CH30_GSPI_RX | UDMA_PRI_SELECT);
iStatus=sl_Send(iSockID,g_ucRxBuffA,1024,0);
//
// If the primary control structure indicates stop, that means the "A"
// receive buffer is done. The uDMA controller should still be receiving
// data into the "B" buffer.
//
if(ulMode == UDMA_MODE_STOP)
{
//
// Set up the next transfer for the "A" buffer, using the primary
// control structure. When the ongoing receive into the "B" buffer is
// done, the uDMA controller will switch back to this one.
//
UDMASetupTransfer(UDMA_CH30_GSPI_RX| UDMA_PRI_SELECT,UDMA_MODE_PINGPONG, 1024,
UDMA_SIZE_8,UDMA_ARB_1,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
g_ucRxBuffA,UDMA_DST_INC_8);
Report("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n",
g_ucRxBuffA[0], g_ucRxBuffA[1], g_ucRxBuffA[2], g_ucRxBuffA[3],
g_ucRxBuffA[4], g_ucRxBuffA[5], g_ucRxBuffA[6], g_ucRxBuffA[7],
g_ucRxBuffA[1020], g_ucRxBuffA[1021], g_ucRxBuffA[1022], g_ucRxBuffA[1023]);
}
//
// Check the DMA control table to see if the ping-pong "B" transfer is
// complete. The "B" transfer uses receive buffer "B", and the alternate
// control structure.
//
ulMode = MAP_uDMAChannelModeGet(UDMA_CH30_GSPI_RX | UDMA_ALT_SELECT);
//
// If the alternate control structure indicates stop, that means the "B"
// receive buffer is done. The uDMA controller should still be receiving
// data into the "A" buffer.
//
if(ulMode == UDMA_MODE_STOP)
{
//
// Set up the next transfer for the "B" buffer, using the alternate
// control structure. When the ongoing receive into the "A" buffer is
// done, the uDMA controller will switch back to this one.
//
UDMASetupTransfer(UDMA_CH30_GSPI_RX| UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,1024,
UDMA_SIZE_8,UDMA_ARB_1,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
g_ucRxBuffB,UDMA_DST_INC_8);
Report("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\r\n",
g_ucRxBuffB[0], g_ucRxBuffB[1], g_ucRxBuffB[2], g_ucRxBuffB[3],
g_ucRxBuffB[4], g_ucRxBuffB[5], g_ucRxBuffB[6], g_ucRxBuffB[7],
g_ucRxBuffB[1020], g_ucRxBuffB[1021], g_ucRxBuffB[1022], g_ucRxBuffB[1023]);
iStatus=sl_Send(iSockID,g_ucRxBuffB,1024,0);
}
//
// If the GSPI DMA TX channel is disabled, that means the TX DMA transfer
// is done.
//
if(!MAP_uDMAChannelIsEnabled(UDMA_CH31_GSPI_TX))
{
//
// Start another DMA transfer to SPI TX.
//
UDMASetupTransfer(UDMA_CH31_GSPI_TX| UDMA_PRI_SELECT,UDMA_MODE_BASIC,sizeof(g_ucTxBuff),
UDMA_SIZE_8,UDMA_ARB_1,
(void *)g_ucTxBuff,UDMA_SRC_INC_8,(void *)(GSPI_BASE + MCSPI_O_TX0),
UDMA_DST_INC_NONE);
//
// The uDMA TX channel must be re-enabled.
//
MAP_uDMAChannelEnable(UDMA_CH31_GSPI_TX);
}
MAP_SPIEnable(GSPI_BASE);
MAP_SPIIntClear(GSPI_BASE,SPI_INT_EOW);//清除SPI中断标志
MAP_SPIIntEnable(GSPI_BASE, SPI_INT_EOW);
MAP_IntEnable(INT_GSPI);
没有结合TCP的时候,串口输出的数据就是错误的,建议先不结合TCP,用TI 例程测试串口收发,看有没有错误
例程只有串口的DMA PINGPONG模式,有测试过是没问题的。
我换成SPI的DMA PINGPONG 才出现了前面说的一小部分数据出错的问题。
通过示波器辅助看了下波形。测试了几组不同情况下的数据。得到的结论是:
1、单独SPI DMA PINGPONG模式,数据是没有问题的。
2、加上TCP控制SPI的收发,TCP上位机只发不收,数据也没有问题。
3、一旦加上,CC3200把SPI收到的数据发送给TCP上位机时,就会出现数据出现错误,也就是说只要加上iStatus=sl_Send(iSockID,g_ucRxBuffA,1024,0);iStatus=sl_Send(iSockID,g_ucRxBuffB,1024,0);这两个函数就会导致数据出错,删除这两个函数,就可以让数据正常。
请问,能帮我解释是什么问题吗?是否是这个发送给TCP上位机数据的函数我放的位置不正确,发送的时机不对?
问题已经解决,一直忘了结帖。
仅在SPI DMA PINGPONG两个CC3200主从机 通信的情况下,数据是没问题的。
加上TCP功能后会出现问题但是后来通过修改数据源,通过FPGA发送数据后,这个问题就没有了,所以认为是数据源的问题。