This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC3235SF: cc3235使用SPI DMA与sl_send共用问题。

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速度就提升上来了。。。。。。