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.

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

Other Parts Discussed in Thread: CC3200

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

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

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

  • 您好,我们设置了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双缓冲接收了,请问这是什么问题呢?

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