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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版