搜索
bottom↓
回复: 13

stm32F4的hal库spi_dmaReceive问题

[复制链接]

出0入0汤圆

发表于 2020-1-2 19:53:40 | 显示全部楼层 |阅读模式
本帖最后由 JYJT 于 2020-1-2 21:31 编辑

在发送完成回调里启动接收,使用HAL_SPI_Receive_DMA,然后在接收完成回调里启动发送,使用HAL_SPI_Transmit_DMA。结果HAL_SPI_Receive_DMA里面,调用的是HAL_SPI_TransmitReceive_DMA,如图1:


这货同时开启了发送和接收,如图2:



也就是发送和接收都lock了,如图3:

在接收完成回调了hal库仅仅清除了接收的lock标志和state,并没有清除发送的lock标志,导致HAL_SPI_Transmit_DMA查询lock和state时,状态不对,返回不是HAL_OK。然后这个交错发送就完成不了。。有遇到类似问题的坛友吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2020-1-2 20:46:56 | 显示全部楼层
本帖最后由 JYJT 于 2020-1-2 21:32 编辑

验证了这个HAL_SPI_Receive_DMA执行后,会进 接收完成中断和 发送完成中断,接收lock标志,和发送lock标志会被分别清除,也就是说,如果发送完成中断在接收完成中断之前执行,才可以在接收完成的回调里,继续开启发送。HAL的这个spi的DMA接收逻辑理顺了一点。

出0入0汤圆

发表于 2020-1-2 20:50:52 | 显示全部楼层
用了Hal库,各种状态多注意。比较有些模式是需要修改的

出0入0汤圆

 楼主| 发表于 2020-1-2 20:53:44 | 显示全部楼层
JYJT 发表于 2020-1-2 20:46
验证了这个HAL_SPI_Receive_DMA执行后,会进 接收完成中断和 发送完成中断,接收lock标志,和发送lock标志 ...

也就是说,我想在发送完成回调里,开启接收。然后再在接收完成回调里,开启发送,这种方法,在HAL全双工master模式下,不太靠谱。

出0入0汤圆

 楼主| 发表于 2020-1-2 21:06:54 | 显示全部楼层
这样一来,不就又来了一个新问题,如果用HAL_SPI_TransmitReceive_DMA()函数,那他的接收中断和发送中断,到底是哪个会被先执行?随机优先吗? 这个真不靠谱。

出0入131汤圆

发表于 2020-1-2 21:19:17 | 显示全部楼层
你全部用 HAL_SPI_TransmitReceive_DMA 不就行了

还有你这字体容易被封号

出0入0汤圆

 楼主| 发表于 2020-1-2 21:27:23 | 显示全部楼层
asj1989 发表于 2020-1-2 21:19
你全部用 HAL_SPI_TransmitReceive_DMA 不就行了

还有你这字体容易被封号

我也正在考虑使用TransmitReceive。谢谢你。

出0入0汤圆

 楼主| 发表于 2020-1-2 21:28:15 | 显示全部楼层
蚁族 发表于 2020-1-2 20:50
用了Hal库,各种状态多注意。比较有些模式是需要修改的

是的,踩坑,填坑

出0入0汤圆

 楼主| 发表于 2020-1-2 21:40:36 | 显示全部楼层
asj1989 发表于 2020-1-2 21:19
你全部用 HAL_SPI_TransmitReceive_DMA 不就行了

还有你这字体容易被封号

跟元老学习

出0入0汤圆

 楼主| 发表于 2020-1-3 10:21:04 | 显示全部楼层
用 HAL_SPI_TransmitReceive_DMA ,也存在一样的问题,rx的中断先被触发,tx在rx之前触发,回调函数在rx里,导致rx里再次执行 HAL_SPI_TransmitReceive_DMA 失败。

出0入131汤圆

发表于 2020-1-3 10:54:33 | 显示全部楼层
JYJT 发表于 2020-1-3 10:21
用 HAL_SPI_TransmitReceive_DMA ,也存在一样的问题,rx的中断先被触发,tx在rx之前触发,回调函数在rx里 ...

你可以只开一个中断啊,比如只开tx

反正tx结束了 rx也就结束了。

出0入0汤圆

 楼主| 发表于 2020-1-3 11:57:09 | 显示全部楼层
asj1989 发表于 2020-1-3 10:54
你可以只开一个中断啊,比如只开tx

反正tx结束了 rx也就结束了。

不是开不开的问题。

出0入0汤圆

 楼主| 发表于 2020-1-6 20:48:05 | 显示全部楼层
asj1989 发表于 2020-1-3 10:54
你可以只开一个中断啊,比如只开tx

反正tx结束了 rx也就结束了。

1.DMA中断关不掉。
2.DMA中断分为两个接收和发送独立。
3.有可能发送中断先被响应,有可能接收中断先被响应。

出0入0汤圆

发表于 2020-2-13 22:03:34 | 显示全部楼层
JYJT 发表于 2020-1-6 20:48
1.DMA中断关不掉。
2.DMA中断分为两个接收和发送独立。
3.有可能发送中断先被响应,有可能接收中断先被响 ...

我也遇到了相同的问题调用HAL_SPI_TransmitReceive_DMA偶然数据会出错,还没找到方法解决,不知道楼主搞定了没,有没有什么建议
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 00:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表