HAL库SPI DMA循环调用问题

2019-07-14 15:09发布

使用HAL库的SPI DMA方式读取一个器件的数据,然后在回调函数中开启下一个器件的SPI DMA方式来读取数据,依此方式依次读取几个器件,比如器件1、2、3。。。。。。,用SPI DMA函数HAL_SPI_TransmitReceive_DMA读取器件1后在SPI的回调函数HAL_SPI_TxRxCpltCallback中调用HAL_SPI_TransmitReceive_DMA开始读取器件2,然后下一步再在HAL_SPI_TxRxCpltCallback中调用HAL_SPI_TransmitReceive_DMA读取器件3 。。。。。。但发现 读取总有些问题,尤其不能被中断打断,这是为什么呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
xieweibin
1楼-- · 2019-07-14 21:20
 精彩回答 2  元偷偷看……
naiztycheng
2楼-- · 2019-07-15 00:18
这是不是和在UART中断里面启用DMA中断发送或接受UART命令一样呀。就是在循环里面继续循环(尽管支持循环嵌套)

进中断处理函数之后SPI的DMA应该先关掉吧,使用HAL_SPI_DMAPause()/ HAL_SPI_DMAStop()。这样就没有问题了。你也可以试一试在callback里面只设置准备开启的DMA设备,比如用变量存储任务号。然后在SPIx_IRQHandler的末尾根据任务号来开启。这样程序执行完就推出循环了。但是没有试过。
楼主如果要试一下的话,讲结果告诉我,谢谢。
易元空灭
3楼-- · 2019-07-15 02:37
疑问1:你的器件1,2,3....通过什么来选择?同一路SPI不同片选还是多路SPI接从器件?
疑问2:HAL_SPI_TxRxCpltCallback中调用HAL_SPI_TransmitReceive_DMA开始读取器件2这用法是否正确?
疑问3:DMA从外设到内存过程不需要CPU干预,为什么中断能打断SPI的通信数据?
如果描述不清楚的,就请上代码吧。
ureuswerwr
4楼-- · 2019-07-15 07:54
我觉得提问题就得粘贴代码,这样问大家也不知道是什么原因导致的
andyfly7
5楼-- · 2019-07-15 09:19
建议配置为半双工。
xxn082349
6楼-- · 2019-07-15 10:11
 精彩回答 2  元偷偷看……

一周热门 更多>