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) ,这样输出和操作,程序再老化就不在出这个问题了