STM32 485通讯一段时间出现不能接收数据的现象分析

1.那就要有必须要先说说485芯片是如何工作的

-》485是单工通讯,就是芯片在同一时间要么接收数据,要么发送数据。

-》芯片如何切换是接收数据还是发送数据呢,芯片通过控制485芯片的方向引脚来原则是接收模式还是发送模式,如下图,当Driver信号是低电平是接收模式,当Driver信号是 高电平那么就是发送模式

2.经过仿真后,发现485不接收数据的原因是,Driver是高电平。

3.485方向接收模式设置地方:我485使用DMA发送模式,在DMA发送完成中断后,设置485接收,即Driver输出为0.

4.通过加标志量,发送程序是运行到这里的,的确执行了把Driver置为0,那么就怀疑其他地方把IO口串改了

5. 检查代码,我485定义的程序是

#define RS_485_RX3_EN()     GPIO_ResetBits(GPIOD , GPIO_Pin_10)    //接收使能

这样看来是没问题的,

6.继续检查是不是端口D的其他设备操作出了问题

  #define CS1_0()        GPIOD->ODR &= ~GPIO_Pin_0

发现这么一段代码,这端程序操作是分两两步的,

第一步,B=~GPIOD->ODR

第二步,A=GPIOD->ODR

第三步,GPIOD->ODR=A&B

这样恰恰就出现在这里的问题。

7.分析如下:

-》当这段代码执行第二步时,A执行的时候恰好485是接收的,那么PD10=1,也就是A的数据里PD10=1的

-》恰好,第二步好执行完,我们的DMA中断触发了,直接进入DMA中断

-》进入中断会吧PD10置为0,这个时候PD10=0

-》中断执行完后,会在跳到前面执行的地方,即第三步开始,这个时候第三步就会把上次记忆的PD10=1,写入到GPIOD里,也就直接串改了GPIOD的输出

8.验证我们的猜测,把所有的GPIOD输出都改成GPIO_ResetBits(GPIOD , port) ,这样输出和操作,程序再老化就不在出这个问题了

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值