打印

做多485串口的东东,对485方向控制头痛,有好招么?

[复制链接]
14121|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Wxy8030|  楼主 | 2009-9-8 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设备:CPU+16C554+16C554+RAM,扩展8个串口,串口用485方式输出!
    原来做485时一般用TX取反控制485的发送方向,但一直认为这是一种不正规的方式,还是用独立的控制比较好,但用独立的控制同时又带来一个问题,那就是485发送结束时,怎么去切换485的发送方向?
    51单片机不存在这个问题,因为有发送结束中断,但16C554却存在问题,它只有发送寄存器空中断,但实际上这个时候还有一个字符没有发送结束——说白了就是16C554(16C550也一样,PIC单片机、LPC213X系列的ARM都有这个问题,别的CPU没研究过不知道)就没有一个能产生中断的方式来准确的告诉CPU串口已经发送结束!除了一个可供查询的标志位......可查询必然会带来延时,尤其是CPU需要处理比较多的事务的时候!
    难道要开个定时器,每几十个微秒就去查询一下,而且要保证所有的通信不会在几十微秒内有数据返回???
    兄弟们还有什么好办法么?

相关帖子

沙发
Wxy8030|  楼主 | 2009-9-8 16:20 | 只看该作者

MAX13487......

本帖最后由 Wxy8030 于 2009-9-8 16:22 编辑

嘿嘿,原来MAX13487的自动控制是这么实现的:
1、必须有上、下拉电阻;
2、每次DI由低到高时,输出驱动会等到A-B大于VDT(0.1V到6V)才关闭,然后由电阻保证总线在正确状态!

......这个到底合适不合适呢......???

使用特权

评论回复
板凳
宇容创行| | 2009-9-8 16:21 | 只看该作者
多发一个无用字符,不就可以继续用发送寄存器空中断

使用特权

评论回复
地板
Wxy8030|  楼主 | 2009-9-8 16:24 | 只看该作者
3楼的主意不是没想过,可问题是我这个设备并不是光连接我自己的设备,万一这个无用字符会引起其他设备的错误呢?

使用特权

评论回复
5
宇容创行| | 2009-9-8 16:27 | 只看该作者
方向都切换了,其它设备怎么可能收到呢

使用特权

评论回复
6
xwj| | 2009-9-8 16:47 | 只看该作者
发送寄存器空中断触发定时器,定时器延时一个字节后触发事件,关发送

程序流程上的事,只有想不到的,没有做不到的

使用特权

评论回复
7
Wxy8030|  楼主 | 2009-9-8 16:55 | 只看该作者
唉......我有八个方向要控制......不知道有没有八个定时器的单片机......

使用特权

评论回复
8
Wxy8030|  楼主 | 2009-9-8 17:01 | 只看该作者
目前能想到的只有两个办法:
1、改用MAX13487!(觉得这个片子不过比用TX直接控制强那么一点点......)
2、开一定时器,尽量短的时候(20uS ?嘿嘿......)内查询发送状态......然后就祈祷所有的通信数据别返回的那么快吧!

使用特权

评论回复
9
xwj| | 2009-9-8 17:01 | 只看该作者
晕,定时器复用是最基本的技能
不懂就自己去思考、搜索。

使用特权

评论回复
10
Wxy8030|  楼主 | 2009-9-8 17:25 | 只看该作者
还是有点不太明白,请老X指点下:
1、如果串口1开始发送最后一个数据,波特率为9600,启动定时器;
2、一个不确定的时间(假设为20uS)后,串口2开始发送最后一个数据,波特率为115200,这个时候怎么复用定时器?

总不能发送也必须有固定的时间间隔吧?

使用特权

评论回复
11
原野之狼| | 2009-9-8 19:30 | 只看该作者
抽象出几个软定时器来呀

使用特权

评论回复
12
Wxy8030|  楼主 | 2009-9-8 20:23 | 只看该作者
TO 原野之狼......能否具体一点呢?

TO 老X:难道是第二个串口开始发送时,读出当前定时器的值,然后计算出重新装载的值......???似乎复杂了点.......

使用特权

评论回复
13
yewuyi| | 2009-9-8 21:06 | 只看该作者
如果你加一个无效字节的话,根本就不需要那么麻烦的把,出现缓冲器空中断后关掉就可以了,最后一个字节直接放弃

使用特权

评论回复
14
Wxy8030|  楼主 | 2009-9-8 21:58 | 只看该作者
TO 老叶:可惜我的串口是485、232共用的,485是关掉了,可232还......

使用特权

评论回复
15
Wxy8030|  楼主 | 2009-9-8 22:04 | 只看该作者
而且当出现中断的时候,多余的那个字节的起始位已经开始发送了(虽然还没仔细研究这个低电平具体有多长时间).........

使用特权

评论回复
16
原野之狼| | 2009-9-9 00:39 | 只看该作者
你如何用过PC来编写程序的话就知道 settimer 一下就可以弄个定时器 想几个就几个
但是INITEL的CPU定时器可不多哦。。。
这就是通过软件来实现的啦

使用特权

评论回复
17
yewuyi| | 2009-9-9 12:28 | 只看该作者
呵呵,建议LZ使用MODBUS的协议格式,发完之后会有一个延迟,这个延迟为报文结束判断的必须条件。

使用特权

评论回复
18
Wxy8030|  楼主 | 2009-9-9 12:39 | 只看该作者
TO 老叶——
是个通用产品,只负责串口转发以及波特率的改变等,用于接入其他各种带串口的设备,串口会流过什么数据,实在是不确定的......

使用特权

评论回复
19
冷漠| | 2009-9-9 17:53 | 只看该作者

没那么复杂,做芯片的人早就考虑到了。

本帖最后由 冷漠 于 2009-9-9 18:10 编辑

很简单的事。根本不需要什么延时判断切换程序。仔细看时序图。利用16C554的 /RTS 信号去控制RS485芯片的方向控制。/RTS信号是在FIFO接收到1/2/4/8/14(16)最后一个字节停止位中点产生的,所以可以作为完整的帧切换信号。
    关键是:如何在发送器发送1/2/4/8/16字节后让MODEM输出 /RTS信号,并控制 /CTS管脚令发送器停止发送,且同时切换RS485接口芯片到接收状态。
   很简单,把 /RTS和 /CTS管脚短接,并同时连接到RS485接口芯片方向控制端脚即可。
   又一个问题,如何能让发送的内容同时回到接收器?否则怎么自动产生 /RTS信号?只要采用CAN接口芯片代换标准RS485接口芯片,问题就解决啦。像PCA82C250、TJA1050 之类。
      网络上查一下“CAN控制器与8051系列单片机的接口技术。”早有前人思考并解决了的问题。

使用特权

评论回复
20
冷漠| | 2009-9-9 18:17 | 只看该作者
芯片设计师头脑没那么简单。

再看看/RXRDY、/TxRDY 信号时序图,都是可以利用来切换rs485驱动器方向的信号。都是由用户决定有效与否的信号,不需要特别计算。

使用特权

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

本版积分规则

148

主题

2119

帖子

2

粉丝