请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:AWR1642BOOST 工具/软件:TI-RTOS
因为我没有收到另一个线程的查询部分的响应、所以重新过帐。
我设法将处于阻塞模式的 SPI 作为从设备工作、但当我将其配置为在非阻塞模式下工作时、我面临着一些问题。
所发生的情况是、回调模式下的 SPI_Transfer 不会在传输完成时触发回调、也不会接收/传输数据。
在 msInitTask 内、我初始化 DMA 和 SPI
dma_params_init (&dmaParams);
gDmaHandle = dma_open (0、&dmaParams、&errCode);
if (gDmaHandle = NULL)
{
printf ("打开 DMA 驱动程序失败,错误=%d\n",错误代码);
返回;
}
SPI_PARAMS_INIT (params); params.mode = SPI_SLAVE; params.dataSize = 8; params.dmaEnable = 1; params.dmaHandle = gDmaHandle; Params.U.slaveParams.dmaCfg.txDmaChanNum =1U; Params.U.slaveParams.dmaCfg.rxDmaChanNum =0U; params.frameFormat = SPI_POL0_PHA1; Params.ShiftFormat = SPI_MSB_FIRST; Params.pinMode = SPI_PINMODE_4PIN_CS; params.transferMode = SPI_MODE_CALLACK; params.eccEnable = 1; params.csHold = 1; params.transferCallbackFxn = spiCallback;
然后启动任务
Task_Params_init (&spiTaskParams); spiTaskParams.priority = 4; spiTaskParams.STACKSIZE = 3*1024; Task_create (SPITASK、&spiTaskParams、NULL); Semaphore_post (SPISem);
我定义我的回调
void spiCallback (SPI_Handle handle、SPI_Transaction *事务) { if (事务->状态=SPI_TRANSFER_Completed) { Semaphore_post (SPISem); } return; }
我创建一个任务来执行 SPI 相关的任务
空 SPITASK (UARg arg0、UARg arg1)
{
char *msg ="1abcdefghijklmnopqrstuvwxyzDONE2abcdefghijklmnopqrstuvwxyzDONE";
字符 Rx[63];
System_printf ("SPI 任务已启动\n");
spiTransaction.count =(size_t) 62;
spiTransaction.txBuf =(void*) msg;
spiTransaction.rxBuf =(void *) rx;
spiTransaction.arg =空;
spiTransaction.slaveIndex = 0U;
while (1){
Semaphore_pend (SPISem、BIOS_wait_forever);
System_printf ("立即传输\n");
SPI_transfer (handle、&spiTransaction);
}
}
在事务计数超过50个字节之前、处于阻塞模式的 SPI 工作正常、因此 SPI_Transfer 停止阻塞。
在非阻塞模式下、在 SPI 传输完成后永远不会调用我的回调。 我看不到来自 MISO 线路的信号。