RS485差分信号A下拉、B上拉的后果
在很久以前,当我刚刚跳槽到了一个新工作单位时,入职的第一天就扔给我挖了个坑(入职的第一天不应该是入职培训吗),说你看看这个问题,我们自己用USB转485调试这个串口一点问题也没有,为啥和别的单位一联调就会出现乱码和结尾多收一个ox00,我去好劲爆啊上班的第一天就要考验我的能力啊,那我的好好表现一下(后来了解到其实这是他们一贯甩锅的方式)哈哈。
那我就先用USB转485测一下吧,坑爹玩意用USB转485也不好使啊,也会收到0X00啊(当时心中有成群结队的***奔腾),平静一下,呼~~~,首先上个原理图吧如下:
然后我们测量一下RS485芯片MAX485E后端的TTL信号波形如下图:
将上图波形放大后,可以看到在一包数据结束后,即一个停止位后,将信号拉低(图中画红圈圈的地方),造成CPU误判认为新的一轮数据传输开始了,随后一直为低电平,因此多收一个0x00。
我们现在返回看原理图可以看到电路中是将A下拉B上拉,因为在空闲状态下MAX485E会设置为接收状态-----即高阻,但是由于硬件的原有出现了一个下降沿,就会使得CPU误判为下一轮的传输开始啦,但后续一直为低电平所以就一直收到oX00啦,修改电路将A上拉B下拉后。
测量MAX485E后端的TTL信号波形如下图,而且经过测试后再也没有收到0X00这样的数据。-------OK解决。
好了,我们在连着正在设备来测量一下吧,看到的现象是这样滴,通过debug接受到串口数据有时前两个字节是乱码,如:发送数据头为:0x24、0x2d;但是有时会收到0xb2、0xbc,概率约为50%;其他数据正确(闹鬼了)。
该示波器上场了,我们来实际测一下MAX485E后端的TTL信号波形吧如下图:
测完人家的,在测一下我们自己接USB转485的波形吧,对比出差异了吧,,,
当时呢,我是用了两个板卡测试的一个是ARM A7双核的一个是单片机,单片机测试是没得乱码的但是主控有啊(又想甩锅给嵌入式小哥,但是当时不熟没好意思),那我就从原理上分析分析吧。
根据UART串口协议,串口在接受数据之前需要判断传输线是否为空闲(为高电平)并且起始位为1bit的低电平,看上上图红色标记出来的小尖,由于单片机主频低那个小小的尖根本捕获不到,所以单片机是没有问题的,但是呢ARM可不是他的主频能到1.2GHz,肯定捕获到了所以造成ARM能收到0X00但是单片机收不到,问题找到了,想办法解决吧,但是我A已经上拉了,B也下拉了,咋回事呢(就是嵌入式下个程序有bug)。
经过我一天的苦苦摸索(其实是半天)后,并于设备厂家小哥沟通后,发现(重点)他们的电路图和代码发现他们是用软件来控制485芯片的RE及DE引脚并且在每次发送数据前拉高RE、DE引脚后没用足够的延时,照成空闲位保持时间太短,增加延时后,经过测试没有上述问题了。
所以啊作为一个硬件攻城狮不但要填自己的坑还要填别人的坑,,,,坑啊啊啊啊啊啊啊啊(真是的,啊呸)。