TI中文支持网
TI专业的中文技术问题搜集分享网站

CC3220SF SPI使用DMA的问题

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

Kevin Qiu1:

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

user6458813:

回复 Kevin Qiu1:

您好,能详细说一下是在Network terminal的哪个例程使用到吗?因为这个demo整合了很多个历程

Kevin Qiu1:

回复 user6458813:

是驱动程序,可以在sysconfig中查看,CC3220SDK中没有提供具体的DMA例程,可以参考CC3200中的例程
e2e.ti.com/…/878878

user6458813:

回复 Kevin Qiu1:

我就是之前使用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()。连个参数都没有。

Kevin Qiu1:

回复 user6458813:

初始化在驱动C:\ti\simplelink_cc32xx_sdk_4_30_00_06\source\ti\drivers\dma
SPI例程自带DMA功能

user6458813:

回复 Kevin Qiu1:

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);方法。要用标志位的

Kevin Qiu1:

回复 user6458813:

1.是的
2.可以通过sysconfig可以选择三线或四线,没有用标志位的例程

user6458813:

回复 Kevin Qiu1:

你好,再请问一下。还是之前的代码:
// 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接受完成了。

Kevin Qiu1:

回复 user6458813:

通过SPI_Status可以知道传输是否完成

SPI_TRANSFER_COMPLETEDSPI transfer completedSPI_TRANSFER_STARTEDSPI transfer started and in progressSPI_TRANSFER_CANCELEDSPI transfer was canceledSPI_TRANSFER_FAILEDSPI transfer failedSPI_TRANSFER_CSN_DEASSERTSPI chip select was de-asserted (only applicable in return partial mode)SPI_TRANSFER_PEND_CSN_ASSERTSPI transfer is pending until the chip select is assertedSPI_TRANSFER_QUEUEDSPI transfer added to transaction queue

user6458813:

回复 Kevin Qiu1:

你好,我按照你的提示,在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_乒乓模式?

赞(0)
未经允许不得转载:TI中文支持网 » CC3220SF SPI使用DMA的问题
分享到: 更多 (0)