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

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

[复制链接]
any012 提问时间:2016-11-24 09:28 /
阅读主题, 点击返回1楼
收藏 2 评论35 发布时间:2016-11-24 09:28
35个回答
衔胆栖冰 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版