Part Number:CC3235SF
情况是这样,我使用CC3235的SPI_DMA,在中断中一次收数据32,在中断中直到收满1024个数据后,在系统中检测收满1024标志位使用sl_send发送出去。
我咋spi_dma中增加一个spiCount计数用于计数1024个数,在一个主程序中(其他线程没开)增加一个check计数,检测这个标志位执行多少次。
static void SpiIntHandler()
{
ulStatus = MAP_SPIIntStatus(GSPI_BASE,true); /* 获取SPI的中断状态 */
MAP_SPIIntClear(GSPI_BASE,SPI_INT_DMARX|SPI_INT_DMATX); /* 清除收发标志位 */
if(ulStatus & SPI_INT_DMARX) /* 中断收到 */
{
if(g_IsFreezed == 0) /* 解冻状态下 */
{
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_BeamBuff[g_BeamCount], UDMA_DST_INC_8);
g_DMARcvBank = 1;
}
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_BeamCount], UDMA_DST_INC_8);
g_DMARcvBank = 0;
}
g_BeamCount += TOTAL_DMA_ELEMENTS; /* 一次收32字节数据 */
if((g_BeamCount == (2*BEAM_SIZE)) || (g_BeamCount == (4*BEAM_SIZE)))
{
g_pBeamBuff = (g_BeamBank == 0) ? (&g_BeamBuff[0]) : (&g_BeamBuff[2*BEAM_SIZE]); /* 数据存储在“g_pBeamBuff”中 */
g_BeamBank = (g_BeamBank == 0) ? 1 : 0;
spiCount++;
g_BeamRcvOK = 1; /* 收集满1024就会置位表示接收到SPI数据了 */
}
if(g_BeamCount >= (4*BEAM_SIZE)) /* 满2048后,从新从0开始计数 */
g_BeamCount = 0;
}
主程序
while(1)
{
check++;
if(g_BeamRcvOK )
{
g_BeamRcvOK =0
sl_Send(g_TcpSock.iNewSockDesc, g_pBeamBuff,1024, 0)
}
if(check %2000 == 1999)
{
UART_PRINT("%d %d \n\r",spiCount,check);
}
}
check 计数完全不及spiCount的计数!!!
如果去掉sl_send速度就提升上来了。。。。。。
ning wang:
但是去掉sl_send 就没意义了啊!!!主程序竟然跑不过中断!!!
,
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
Cherry Zhou:
您好,
您有考虑过使用 Simplelink SDK 中包含的 SPI 驱动程序吗? 这个会更简单明了:
dev.ti.com/…/node
,
ning wang:
那个例程试过了,接收到的SPI数据有错误,比如主机发送128个数据,从机接收数据不完整,而且接收到的数据有的是0,有的数据是正确的。
,
Cherry Zhou:
好的我们跟进给工程师看下哈。
,
Cherry Zhou:
您好,
您方便提供多一点信息吗?请问CC32xx 是从机还是主机? 如果是从机,您有没有验证过 SPI 极性和相位是否与系统usecase匹配? 这通常是接收不完整或错误数据的原因。
ning wang said:
check 计数完全不及spiCount的计数!!!
如果去掉sl_send速度就提升上来了。。。。。。
ning wang said:但是去掉sl_send 就没意义了啊!!!主程序竟然跑不过中断!!!
能麻烦您clarify下这两句话吗?