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

HAL库,SPI从设备中断接收,用HAL_SPI_Receive_IT()函数,overrun err.

[复制链接]
any012 提问时间:2016-11-29 11:40 /
悬赏10ST金币已解决
stm32f103vbt6,用spi2接收主设备发送来的数据,用的hal库。
接收函数用的是:
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
接收到的数据格式:16位。

计划是这样的:
wihile主循环外,调用一次上面的函数,进入中断接收状态;
进入whilie主循环后,当主设备发送信息后,该设备进入spi中断,中断处理后,会调用spi接收完成回调函数,在回调函数里再次调用上面的那个函数,准备接收下个数据。

问题:
进入HAL_SPI_RxCpltCallback()接收完成回调函数后,无法完成下次中断处理。
追踪了下,是进入了HAL_SPI_ErrorCallback()错误回调函数。

现在的流程是:
第一次调用HAL_SPI_Receive_IT()函数后,打开中断,等待接收数据;
主设备发送数据,该设备进入HAL_SPI_IRQHandler()中断函数,接受完数据关闭中断,并调用HAL_SPI_RxCpltCallback()回调函数;
在HAL_SPI_RxCpltCallback()回调函数里,再次调用HAL_SPI_Receive_IT(),以准备接收下一个数据;
结果,下个数据来了以后,进入了HAL_SPI_ErrorCallback()错误回调函数。
进一步判断,是由于SPI_FLAG_OVR置位,引起 SPI Overrun error interrupt occurred。

求教,为什么会产生这个错误?

最佳答案

查看完整内容

接收数据,特别是串行接收数据的接收问题往往不是来于接收方 1、检查接收方的延时,一定要小于发送方的延时(时间延时观察); 2、接收中断和处理后响应是否延时太长,太长应设立缓冲区,两个线程对缓冲区的数据独立运行处理(空间换时间方法); 3、其实也是最重要的检查回调函数的状态值设置与调用(寄存器使用上的搭配); ..... ...
收藏 2 评论9 发布时间:2016-11-29 11:40

举报

9个回答
wolfgang2015 回答时间:2016-11-29 11:40:15
接收数据,特别是串行接收数据的接收问题往往不是来于接收方
1、检查接收方的延时,一定要小于发送方的延时(时间延时观察);
2、接收中断和处理后响应是否延时太长,太长应设立缓冲区,两个线程对缓冲区的数据独立运行处理(空间换时间方法);
3、其实也是最重要的检查回调函数的状态值设置与调用(寄存器使用上的搭配);
.....

评分

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

查看全部评分

jackten 回答时间:2016-11-29 11:55:03
先看看              
any012 回答时间:2016-11-30 10:20:00
怀疑是主机发送的数据是16位,引起的。

修改1:
修改主机程序,先是发送8位数据,就发1个;从机接收格式也为8个字节,每接收到一个数据后,接收完成回调函数里,再调用中断模式接收函数。
结果:可以正常接收,且能不断接收。

修改2:
在修改1的基础上,改为连续发送8个数据(连续发送时,各数据间貌似没有间隔),从机程序不变。
结果:接收一次数据后执行回调函数,然后再次进中断时,报错,数据溢出。

暂时的结论:
感觉还是数据太快,回调函数无法处理。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

xhzheng 回答时间:2016-11-30 11:19:06
我使用非中断方式接收数据的,1000笔都可以接收到;

评分

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

查看全部评分

any012 回答时间:2016-11-30 12:32:52
xhzheng 发表于 2016-11-30 11:19
我使用非中断方式接收数据的,1000笔都可以接收到;

非中断方式接收,你用到回调函数了吗?
发过来的数据间隔大吗?
xhzheng 回答时间:2016-11-30 12:50:36
any012 发表于 2016-11-30 12:32
非中断方式接收,你用到回调函数了吗?
发过来的数据间隔大吗?

//        HAL_SPI_Transmit(&hspi6,TxData,TxLength,1000);
//        HAL_SPI_Receive(&hspi6,RxData,RxLength,1000);

我是读取SPI FLASH 资料;
any012 回答时间:2016-11-30 13:32:09
wolfgang2015 发表于 2016-11-30 12:58
接收数据,特别是串行接收数据的接收问题往往不是来于接收方
1、检查接收方的延时,一定要小于发送方的延时 ...

感谢回复。
因为接收终端后,需要对接收到的数据做判断,还有需要发送下个数据。
现在尝试这部分尽量不用HAL库里的函数,而是用类似与标准库的方法去操作。
wolfgang2015 回答时间:2016-11-30 13:43:19
any012 发表于 2016-11-30 13:32
感谢回复。
因为接收终端后,需要对接收到的数据做判断,还有需要发送下个数据。
现在尝试这部分尽量不用 ...

你这样的测试方法是有问题的。
any012 回答时间:2016-11-30 14:14:53
wolfgang2015 发表于 2016-11-30 13:43
你这样的测试方法是有问题的。

为什么这么说呢?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版