打印

一个半双工485通信容易忽略的问题(已解决,附解决方案)

[复制链接]
13077|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
prcxf|  楼主 | 2007-5-19 08:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有两块CPU通过MAX485进行通信,9600波特率
功能:主CPU发送完一个6字节的数据包后,从CPU回复一个字节的确认信号

原来像下面这么做不行,经常丢掉数据包且MAX485容易坏:
主CPU发送完后,转为接收模式,等待回复信号10毫秒,然后处理回复信号,此后到下次发送之前MAX485芯片一直处于接收状态;从CPU发完确认信号后,平时也一直处于接收状态。

作如下改动后,好了,何故?请高手指点:
主CPU发送完后,转为接收模式,等待回复信号10毫秒,然后处理回复信号,此后到下次发送之前MAX485芯片恢复成发送状态

解决方案:max485芯片的a、b端不采用datasheet推荐的电路,而采用如后面链接的电路!

解决方案见fpga2006网友的博客:后面的链接
相关链接:http://blog.21ic.com/user1/3149/archives/2007/34598.html

相关帖子

沙发
coldra| | 2007-5-19 08:49 | 只看该作者

改动后没有说明白完整

使用特权

评论回复
板凳
xwj| | 2007-5-19 08:54 | 只看该作者

恢复成状态。。。

使用特权

评论回复
地板
zhaoyu2005| | 2007-5-19 09:31 | 只看该作者

还是你的线路哪里出的问题

我们用主机带10几台从机也很少出现你说的问题,如果少了通信芯片一般是其他设备引入了了电势差造成的,良好接地一般不出问题

使用特权

评论回复
5
prcxf|  楼主 | 2007-5-19 11:07 | 只看该作者

呵呵,对不起,改过了

呵呵,电路没有问题,接地很好
主要是有一点没搞懂,就是两个单片机平时都把max485设置成接收状态,应该不会导致485总线冲突(我想总线冲突才是485坏的原因)

只有两个单片机同时为发送状态,485总线才会冲突吧?

使用特权

评论回复
6
xwj| | 2007-5-19 11:23 | 只看该作者

平时应该设置为接收状态,只有发送时才转换成发送状态

否则多个发送端数据竞争,谁都不能正确收发
这是基本的常识和原则

注意:收发转换间要留足够的时间间隔,发送完要适当延时,以确保数据完全发送出去,这个检查TI很容易做到的


MAX485容易坏和收发状态无关,端口必须要有保护电路,并着重检查地电位差、降低共模电压

使用特权

评论回复
7
prcxf|  楼主 | 2007-5-22 09:47 | 只看该作者

问题解决(内容来自老古,图片来自fpga2006的博客)

http://www.laogu.com/wz_740.htm
4.3 故障保护

故障保护技术是近两年产生的,一些新的RS-485芯片都采用了此项技术,如SN75276、MAX3080~MAX3089。什么是故障保护,为什么要有故障保护,如果没有故障保护会产生什么后果?
众所周知,RS-485接口采用的是一种差分传输方式,各节点之间的通信都是通过一对(半双工)或两对(全双工)双绞线作为传输介质。根据RS-485的标准规定,接收器的接收灵敏度为±200mV,即接收端的差分电压大于、等于+200 mV时,接收器输出为高电平;小于、等于-200mV时,接收器输出为低电平;介于±200mV之间时,接收器输出为不确定状态。在总线空闲即传输线上所有节点都为接收状态以及在传输线开路或短路故障时,若不采取特殊措施,则接收器可能输出高电平也可能输出低电平。一旦某个节点的接收器产生低电平就会使串行接收器(UART)找不到起始位,从而引起通信异常,解决此类问题的方法有两种:
(1)使用带故障保护的芯片,它会在总线开路、短路和空闲情况下,使接收器的输出为高电平。确保总线空闲、短路时接收器输出高电平是由改变接收器输入门限来实现的。例如,MAX3080~MAX 3089输入灵敏度为-50mV/-200mV,即差分接收器输入电压UA-B≥-50mV时,接收器输出逻辑高电平;如果UA-B≤-200mV,则输出逻辑低电平。当接收器输入端总线短路或总线上所有发送器被禁止时,接收器差分输入端为0V,从而使接收器输出高电平。同理,SN75276的灵敏度为0mV/-300mV,因而达到故障保护的目的。
(2)若使用不带故障保护的芯片,如SN75176、MAX1487等时,可在软件上作一些处理,从而避免通信异常。即在进入正常的数据通信之前,由主机预先将总线驱动为大于+200mV,并保持一段时间,使所有节点的接收器产生高电平输出。这样,在发出有效数据时,所有接收器能够正确地接收到起始位,进而接收到完整的数据。

max485芯片的a、b端不采用datasheet推荐的电路,而采用如图电路! 
相关链接:http://www.laogu.com/wz_740.htm

使用特权

评论回复
8
andrew.xu| | 2007-5-22 10:45 | 只看该作者

还有这种事呀

重来没碰到过,都是只有在发送数据时才使能发送的
领教了

使用特权

评论回复
9
zhaoyu2005| | 2007-5-22 15:34 | 只看该作者

这是谁画的图?

光耦多,是吗?别浪费了,便宜点给我吧

使用特权

评论回复
10
andrew.xu| | 2007-5-22 16:15 | 只看该作者

就是,光偶很贵的

用的又是同一个电源,要光偶毛用呀,还增加复杂性,同时也增加故障率
一个很好的反面教材

使用特权

评论回复
11
古道热肠| | 2007-5-22 16:15 | 只看该作者

RS485通讯要注意

   Max487与75LBC184的特性是不一样的,刚跑施工现场时,遇到过混用不正常,后分开用,据书上讲,184的抗开拢能力很好的

使用特权

评论回复
12
MHQ_11| | 2007-5-22 16:25 | 只看该作者

尽量避免485都是接收状态,使能发送要提前

当每个485都是接收时,485总线是悬空状态.此时总线是不确定的.
任何干扰可能导致,A可能大于B,也可能小于B.
485芯片会收到乱码,干扰正常通讯.
当有一个485芯片是发送状态时,此时虽然没发数,实际相当于发的是"1",此时总线是确定状态(A>B).
所以要尽力避免悬空状态的出现.
方法一:采用带故障保护的485芯片.
方法二:线路空闲后,虽然过一段才需要发数,此时也需要立即将下一个需要发数的485芯片切成发,用它来控制总线状态.这样做避免总线出现任何扰动,保证你发的正常数据前,有足够长的高电平时间(因为起始位是0),这样就不会产生误码.

使用特权

评论回复
13
prcxf|  楼主 | 2007-5-22 17:47 | 只看该作者

同意12楼,但将a、b端加上拉和下拉电阻就可以了!

通信各节点在加了上拉和下拉电阻后都可设置为接收状态。

使用特权

评论回复
14
hqgboy| | 2007-5-23 08:47 | 只看该作者

好的。。。。顶。

使用特权

评论回复
15
snakeemail| | 2007-5-23 09:22 | 只看该作者

最近我也用,顶

使用特权

评论回复
16
mhq_11| | 2007-5-23 15:48 | 只看该作者

对图有疑问?

7楼贴的那张图有问题?
我觉得这应该是,带光隔离的485接口.光藕两侧不应该是同样的电源.
画面上应该有DC-DC.
此外,如果不是光隔离的485接口,是不是不能通过接入上下拉电阻解决悬空问题.我试过很容易烧接口芯片.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

51

帖子

0

粉丝