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

spi中断接收模式,被干扰后数据会一直错位。

[复制链接]
any012 提问时间:2017-5-18 16:39 /
悬赏100ST金币已解决
本帖最后由 any012 于 2017-5-18 17:15 编辑

硬件是这样设计的:
芯片为stm32f103vb,作为从设备接收SPI主设备发送过来的固定长度的数据,现定为每秒发送一次,数据为9个16位数据。
从机的PC6引脚检测到有上升沿,表明主设备将要发送数据过来。发送完数据后,过一段时间PC6被拉低。

一开始是想用DMA方式接收的,PC6上升沿中断的回调函数里调用DMA接收函数,接收9个数据。
结果发现,用万用表表笔或示波器表笔碰触SCLK引脚,会产生数据错位。且,一旦错位,以后接收的数据会始终保持错位。

后来就想先改成SPI中断方式接收。同样再PC6上升沿中断回调函数里调用SPI中断接收函数,接收9个数据,并在PC6下降沿时关闭SPI中断。
结果可能是主设备开机时发送的数据不正常,如果主从设备同时开机的话,从设备就总是接收溢出错误。
后来在溢出错误处理部分的关闭SPI中断后,又清了一次溢出错误标志,开机问题算是解决了。
但,同样存在,用表笔碰触SCLK引脚,会造成接收数据移位的问题。


请大家帮忙分析下为何错位会一直存在?

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.     if (HAL_GPIO_ReadPin(EN_3V3_GPIO_Port, EN_3V3_Pin) == GPIO_PIN_SET)
  4.     {
  5.         HAL_GPIO_TogglePin(ERR_GPIO_Port, ERR_Pin);
  6.         HAL_SPI_Receive_IT(&hspi2, (uint8_t *) spi2RecvDate, 0x09);
  7.     }
  8.     else
  9.     {
  10.         __HAL_SPI_DISABLE_IT(&hspi2, SPI_IT_RXNE);
  11.         __HAL_SPI_CLEAR_OVRFLAG(&hspi2); //        HAL_GPIO_TogglePin(ERR_GPIO_Port, ERR_Pin);
  12.     }

  13. }
复制代码
  1. void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
  2. {
  3.     printf(
  4.             "\r\n Spi2 interruped recived OK. %04x, %04x, %04x, %04x, %04x, %04x, %04x, %04x, %04x",
  5.             spi2RecvDate[0], spi2RecvDate[1], spi2RecvDate[2], spi2RecvDate[3],
  6.             spi2RecvDate[4], spi2RecvDate[5], spi2RecvDate[6], spi2RecvDate[7],
  7.             spi2RecvDate[8]);
  8. //    HAL_GPIO_TogglePin(ERR_GPIO_Port, ERR_Pin);
  9. }
复制代码



最佳答案

查看完整内容

你可以建立回答机制,一问一答 那样的话效率低了,或者CRC校验
收藏 2 评论22 发布时间:2017-5-18 16:39

举报

22个回答
寂寞,点燃一支烟 回答时间:2017-5-18 16:39:39
你可以建立回答机制,一问一答  那样的话效率低了,或者CRC校验

评分

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

查看全部评分

any012 回答时间:2017-5-18 17:01:56
QQ图片20170518170042.png
any012 回答时间:2017-5-18 17:13:59
QQ图片20170518171321.png
any012 回答时间:2017-5-19 10:38:49
尝试在PC6下降沿,也即片选信号结束时,关闭SPI,然后再打开SPI。结果依旧。

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.     if (HAL_GPIO_ReadPin(EN_3V3_GPIO_Port, EN_3V3_Pin) == GPIO_PIN_SET)
  4.     {
  5.         HAL_GPIO_TogglePin(ERR_GPIO_Port, ERR_Pin);
  6.         HAL_SPI_Receive_IT(&hspi2, (uint8_t *) spi2RecvDate, 0x09);
  7.     }
  8.     else
  9.     {
  10.         __HAL_SPI_DISABLE_IT(&hspi2, SPI_IT_RXNE);
  11.         __HAL_SPI_CLEAR_OVRFLAG(&hspi2); //        HAL_GPIO_TogglePin(ERR_GPIO_Port, ERR_Pin);
  12.         __HAL_SPI_DISABLE(&hspi2);
  13.         __HAL_SPI_ENABLE(&hspi2);
  14.     }

  15. }
复制代码


寂寞,点燃一支烟 回答时间:2017-5-19 11:07:41
CLK 电压表接触会有电压啊  ,应该是改变了时钟的顺序,导致时序错误  ,提前接上电压表试试1

评分

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

查看全部评分

johnson_gong 回答时间:2017-5-19 11:27:56
关电重启应该恢复正常吧?
对于用表笔接触下SCLK会导致错位,可以这样试下:
1.那个SPI速度是可以设置的,看看调低点速率,会不会这样。
2.在SPI接口的数据线与CLK线,全部上拉,有可能时,最好主从间还串联个10欧姆的电阻,这两个方法主要是为了在传输数据是,保证电平稳定的措施。

评分

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

查看全部评分

any012 回答时间:2017-5-19 11:50:46
寂寞,点燃一支烟 发表于 2017-5-19 11:07
CLK 电压表接触会有电压啊  ,应该是改变了时钟的顺序,导致时序错误  ,提前接上电压表试试1 ...

提前接上电压表可能会避免这种问题。
但如果在实际工作环境中,有其他干扰加在了SCLK上而产生了问题,该怎么办呢?
受干扰后接收出错不怕,怕的是无法纠正过来。

现在想想,应该是SCLK上多余的脉冲使SPI的移位寄存器上接收了额外的数。怎样能纠正过来呢?
小小超 回答时间:2017-5-20 08:24:34
把SPI的通信线都接上上拉,同时加上滤波电容。能增强干扰能力。

评分

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

查看全部评分

any012 回答时间:2017-5-20 08:56:05
寂寞,点燃一支烟 发表于 2017-5-19 22:03
你可以建立回答机制,一问一答  那样的话效率低了,或者CRC校验

就是对效率有要求...
不过即使采用回答机制,也不能纠正从机的错位吧?
CRC校验其实用上了,倒数第二个数据既是。

问答机制或CRC校验可以检测出接收错误,但如何使下次接收数据不再保持错位?
目前的做法是重新初始化SPI,但感觉初始化SPI执行的操作太多了。
any012 回答时间:2017-5-20 09:00:01
ts2000 发表于 2017-5-20 08:24
把SPI的通信线都接上上拉,同时加上滤波电容。能增强干扰能力。

都有上拉的。当然实际使用未必会因为干扰造成这种结果。我是偶然发现SCLK上引入干扰后会造成这种接收数据持续错位的问题。
主要是想通过软件来解决干扰消失后依旧错位的问题。
寂寞,点燃一支烟 回答时间:2017-5-20 09:13:49
你的时钟线有干扰么,一般时钟我们都不测量的,用示波器,万用表不靠谱
zbber 回答时间:2017-5-20 09:37:47
把SPI的通信线都接上上拉,同时加上滤波电容
无薪税绵 回答时间:2017-5-20 10:10:39
楼主在使能SPI后,
有没有第一时间清除接收缓冲区中断标志?
any012 回答时间:2017-5-20 10:15:00
无薪税绵 发表于 2017-5-20 10:10
楼主在使能SPI后,
有没有第一时间清除接收缓冲区中断标志?

用的HAL库,SPI初始化时有清寄存器。
在程序中是反复调用
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
这个函数来实现中断接收的。这个函数里只有是能SPI接收中断及是能SPI,没有清中断标志。
12下一页

所属标签

相似问题

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