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.

CC3220SF SPI使用DMA的问题

Other Parts Discussed in Thread: CC3220SF, CC3200, SYSCONFIG

你好,我发现SDK中有SPI的历程,但是相比较CC3200的SDK少了UDMA的历程,在CC3200的SDK中,有专门的uart_DMA的历程,再加上文档可以让人知道怎么使用SPI的DMA。但是CC3220SF怎么使用DMA呢?我没找到相关的文档。。。

  • DMA可以看C:/ti/simplelink_cc32xx_sdk_4_30_00_06/docs/drivers/doxygen/html/_u_d_m_a_c_c32_x_x_8h.html
    Network terminal例程中用到了DMA
  • 您好,能详细说一下是在Network terminal的哪个例程使用到吗?因为这个demo整合了很多个历程
  • 是驱动程序,可以在sysconfig中查看,CC3220SDK中没有提供具体的DMA例程,可以参考CC3200中的例程
    e2e.ti.com/.../878878
  • 我就是之前使用CC3200并打算将程序移植到CC3220SF的,CC3200的DMA使用、文档等信息比较清晰明朗。但看SPICC32XXDMA.h里的介绍。只有简短的一段示例代码:
    // SPI already opened in callback mode
    SPI_Transaction t0, t1, t2;
    t0.txBuf = txBuff0;
    t0.rxBuf = rxBuff0;
    t0.count = 2000;
    t1.txBuf = txBuff1;
    t1.rxBuf = rxBuff1;
    t1.count = 1000;
    t2.txBuf = txBuff2;
    t2.rxBuf = NULL;
    t2.count = 1000;
    bool transferOk = false;
    if (SPI_transfer(spiHandle, &t0)) {
    if (SPI_transfer(spiHandle, &t1)) {
    transferOk = SPI_transfer(spiHandle, &t2);
    }
    }
    }
    但是DMA的初始化呢?3200中是得先初始化:UDMAInit();然后在UDMASetupTransfer里设置模式,但3220SF的dma初始化?我看UDMACC32XX.h文档,也只有UDMACC32XX_close(),UDMACC32XX_init();UDMACC32XX_open()。连个参数都没有。
  • 初始化在驱动C:\ti\simplelink_cc32xx_sdk_4_30_00_06\source\ti\drivers\dma
    SPI例程自带DMA功能
  • 1、SPI例程自带DMA功能是什么意思?我是不是可以理解为不需要使用UDMACC32XX_init();等UDMA,直接使用SPI_transfer就可以?

    2、除此之外,例程里面需要用到额外的两根线CONFIG_SPI_MASTER_READY,CONFIG_SPI_SLAVE_READY来控制主从的通讯,而我只需要4线甚至3线模式的传输。那么请问下我如何判断传输是否完成?SPI_Transaction结构体中的status值看起来能使用。于是我在SPI_transfer后使用while(!transaction.status);来等待传输完成。可实际上主机模式代码就卡在那里;从机模式就直接跳过了。请问有什么方法判断传输完成?不要使用历程里的sem_wait(&slaveSem);方法。要用标志位的

  • 1.是的
    2.可以通过sysconfig可以选择三线或四线,没有用标志位的例程
  • 你好,再请问一下。还是之前的代码:
    // SPI already opened in callback mode
    SPI_Transaction t0, t1, t2;
    t0.txBuf = txBuff0;
    t0.rxBuf = rxBuff0;
    t0.count = 2000;
    t1.txBuf = txBuff1;
    t1.rxBuf = rxBuff1;
    t1.count = 1000;
    t2.txBuf = txBuff2;
    t2.rxBuf = NULL;
    t2.count = 1000;
    bool transferOk = false;
    if (SPI_transfer(spiHandle, &t0)) {
    if (SPI_transfer(spiHandle, &t1)) {
    transferOk = SPI_transfer(spiHandle, &t2);
    }
    }
    }
    1、在SPI的文档中的代码。请问怎么知道传输完成了?按照driver里面的SPI例程,是得使用一个阻塞信号sem_wait(&Spi_Sem);等待SPI传输数据的完成。那么在调用多个SPI_transfer的时候,怎么知道是哪个SPI传输完成了?
    2、我需要使用SPI接受连续的数据流,然后使用TCP的sl_send发送,在CC3200上我可以很方便的使用乒乓DMA传输,使用两个缓冲轮流切换并发送,但是在CC3220SF这里我就不知道怎么知道是哪个SPI接受完成了。
  • 通过SPI_Status可以知道传输是否完成

    SPI_TRANSFER_COMPLETED 	
    SPI transfer completed
    
    SPI_TRANSFER_STARTED 	
    SPI transfer started and in progress
    
    SPI_TRANSFER_CANCELED 	
    SPI transfer was canceled
    
    SPI_TRANSFER_FAILED 	
    SPI transfer failed
    
    SPI_TRANSFER_CSN_DEASSERT 	
    SPI chip select was de-asserted (only applicable in return partial mode)
    
    SPI_TRANSFER_PEND_CSN_ASSERT 	
    SPI transfer is pending until the chip select is asserted
    
    SPI_TRANSFER_QUEUED 	
    SPI transfer added to transaction queue
    
    

  • 你好,我按照你的提示,在slave模式下,使用的代码如下:

    SPI_Params_init(&Spi_Params);
    Spi_Params.transferMode = SPI_MODE_CALLBACK; //设置为回调模式
    Spi_Params.transferCallbackFxn = transferCompleteFxn;//回调函数_回调模式专用
    Spi_Params.mode = SPI_SLAVE; //从模式
    Spi_Params.dataSize = 8; //8位数据位
    Spi_Params.frameFormat = SPI_POL0_PHA1; //spi采集时刻
    SPI_Transaction t0, t1, t2;
    t0.txBuf = txBuff0;
    t0.rxBuf = rxBuff0;
    t0.count = 2000;
    t1.txBuf = txBuff1;
    t1.rxBuf = rxBuff1;
    t1.count = 1000;
    t2.txBuf = txBuff2;
    t2.rxBuf = NULL;
    t2.count = 1000;
    bool transferOk = false;
    while(1)
    {
    if (SPI_transfer(Spi_handle, &t0)) {
    if (SPI_transfer(Spi_handle, &t1)) {
    transferOk = SPI_transfer(Spi_handle, &t2);
    }
    }
    if(t0.status == SPI_TRANSFER_COMPLETED)
    UART_PRINT("t0\n\r");
    if(t1.status == SPI_TRANSFER_COMPLETED)
    UART_PRINT("t1\n\r");
    if(t2.status == SPI_TRANSFER_COMPLETED)
    UART_PRINT("t2\n\r");

    }
    然而输出只有t0,请问下,这是怎么回事?另外你仔细看下ti/simplelink_cc32xx_sdk_4_30_00_06/docs/drivers/doxygen/html/_s_p_i_c_c32_x_x_d_m_a_8h.html 文档中的DMA and Queueing实例代码,这段代码个人觉得解释十分模糊,甚至连代码部分还多出了一个“}”。如何正确设置才能使用DMA_乒乓模式?
  • 上面代码在//spi采集时刻 下还有一行是Spi_handle = SPI_open(CONFIG_SPI_0,&Spi_Params);
  • 例程中关于DMA描述比较少,你可以参照手册第四章DMA配置
    www.ti.com.cn/.../swru465.pdf