你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库如何设置SPI2一直使能接收中断?

[复制链接]
any012 提问时间:2016-11-24 09:28 /
阅读主题, 点击返回1楼
收藏 2 评论35 发布时间:2016-11-24 09:28
35个回答
zxcscm 回答时间:2016-11-25 13:32:03
关注中,也遇到类似的问题,中断始终进不了。都快放弃hal库了
衔胆栖冰 回答时间:2016-11-25 16:06:24
zxcscm 发表于 2016-11-25 13:32
关注中,也遇到类似的问题,中断始终进不了。都快放弃hal库了

用DMA,速度杠杠的,我两路同时发送接收,每路40M bit/s,相当于单路80M bit/s,有没有很变态
衔胆栖冰 回答时间:2016-11-25 16:06:51
zxcscm 发表于 2016-11-25 13:32
关注中,也遇到类似的问题,中断始终进不了。都快放弃hal库了

用DMA,速度杠杠的,我两路同时发送接收,每路40M bit/s,相当于单路80M bit/s,有没有很变态
any012 回答时间:2016-11-25 16:33:43
衔胆栖冰 发表于 2016-11-25 16:06
用DMA,速度杠杠的,我两路同时发送接收,每路40M bit/s,相当于单路80M bit/s,有没有很变态 ...

没接触过DMA,也曾考虑过DMA。但有个疑问,我这个是作为接收设备,需要判断帧首,长度的。用DMA的话,只能循环接收吧?
any012 回答时间:2016-11-25 16:58:11
接收是固定长度,且有帧头的;发送同样是固定长度且有帧头,并且,还需要接收帧头时,发送的也是发送帧的帧头。
我觉得DMA不好实现吧。
衔胆栖冰 回答时间:2016-11-25 17:14:32
any012 发表于 2016-11-25 16:58
接收是固定长度,且有帧头的;发送同样是固定长度且有帧头,并且,还需要接收帧头时,发送的也是发送帧的帧 ...

我推测你的逻辑是这样的:收到第一个字节判断是否是包头,是的话继续读取一定长度的数据作为数据包的长度,然后接收一定长度的数据,最后还有检验位和结束位。这样的话,你觉得DMA不好处理
any012 回答时间:2016-11-26 08:38:54
逻辑是这样的,但接收了一帧的同时,也要发送一帧出去。所以我觉得需要在接收的时候做处理,而不是接收完一堆数据后再处理。所以我觉得用DMA方式的话,无从下手。
海迹天涯 回答时间:2016-12-30 09:19:26
楼主要养成追踪代码的习惯啊,在HAL_SPI_Receive_IT函数中调用了__HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR))开中断  ->     hspi->RxISR = SPI_RxISR_8BIT; 连接接收指针函数 -> 追踪这个指针函数发现在接收完成后调用了    SPI_CloseRx_ISR(hspi); -> 再追踪 SPI_CloseRx_ISR(hspi);函数,发现这个函数   __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));此时此刻我相信你已经明白为啥每次只能中断1次了。好了这下你也应该知道怎么改了吧

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

modu8888 回答时间:2016-12-30 09:45:12
我也遇到过一个片子!
也许那个片子压根没SPI2啊!
any012 回答时间:2016-12-30 10:19:09
海迹天涯 发表于 2016-12-30 09:19
楼主要养成追踪代码的习惯啊,在HAL_SPI_Receive_IT函数中调用了__HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | ...

后来改成类似于库函数那样的操作了。

在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想串口中断接收1个数据,然后在接收完成回调函数里再次打开中断接收。实际调试的时候,只能接收到第一个数据,然后就溢出错误了。原因应该是数据间隔太短,用HAL中断方式来不及处理这个字节下个字节就来到了,从而造成数据溢出。
现在回头想想,SPI这里可能也是由于这个问题。
串口那里,最后用的DMA+空闲中断解决了,参考论坛里的例子。
海迹天涯 回答时间:2016-12-30 10:31:46
any012 发表于 2016-12-30 10:19
后来改成类似于库函数那样的操作了。

在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想 ...

对,串口也是这样处理的,不过你说的溢出错误我没遇到过,最大使用过115200没出错,虽然HAL库的效率确实低了点,但是对于强大m3核的处理器来说这点延迟不影响的

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

hpdell 回答时间:2016-12-30 10:33:43
any012 发表于 2016-12-30 10:19
后来改成类似于库函数那样的操作了。

在串口接收的时候也遇到了类似的问题,不确定原因是否一样。当时想 ...

SPI 貌似没有空闲中断啊 ??
any012 回答时间:2016-12-30 13:39:17
hpdell 发表于 2016-12-30 10:33
SPI 貌似没有空闲中断啊 ??

额,我说的是串口。
韩教授 回答时间:2017-7-24 10:35:05
楼主你好,请问你最后怎么解决的?您的帖子我看了好几遍,还是没明白怎么解决的!太郁闷了,一直头疼这个问题!
any012 回答时间:2017-7-24 14:07:11
本帖最后由 any012 于 2017-7-24 14:12 编辑
韩教授 发表于 2017-7-24 10:35
楼主你好,请问你最后怎么解决的?您的帖子我看了好几遍,还是没明白怎么解决的!太郁闷了,一直头疼这个问 ...

用HAL库的话,用中断方式接收的话,在中断函数里做太多的判断或其它操作,有可能还没处理完下个数据就来了,结果造成接收数据溢出错误,从而无法继续下去。
当时我改成类似于标准库那样的操作了,就是用那些带__前缀的宏和函数去实现的,挺麻烦的,不过总算能即使处理完数据。
现在想想,可以在错误处理回掉函数里做错误处理,重启SPI接收也许能解决这个问题。

后来我又重做了一般这个程序,改用DMA方式接收。由于我这个板子有个特点,相当于有个类似于片选的信号过来,我就在片选信号有效的那个沿,调用DMA接收函数,接收固定长度。接收完成回调函数里再对数据进行判断处理。
不过也有问题,又干扰时数据错位后就会一直错位。我试着在片选信号无效的那个沿,重新初始化SPI。有一点效果,但偶尔还是出错。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版