|
相关连接:
《匠人手记》24《用单片机IO口实现单线单工通讯》
《匠人手记》24《用单片机IO口实现单线单工通讯》论坛讨论地址
主题:《匠人手记》24《用单片机IO口实现单线单工通讯》已经发布 程序匠人 发表于 2007-1-8 23:49
楼主: 《匠人手记》24《用单片机IO口实现单线单工通讯》已经发布 《匠人手记》24《用单片机IO口实现单线单工通讯》已经发布,敬请关注。 许多便宜的单片机都没有标准的串行通讯口。因此,我们常用单片机的IO口来模拟串行通讯。在该手记中,匠人给出一个简单的通讯方案。 由于文档中包含了图片,所以还是按惯例,以PDF格式发布。
------------------------------------------------------------------------------------- wszqw 发表于 2007-1-10 20:32 14楼: 问匠人两个问题: 1、你用什么软件画流程图的? 2、这种通信场合,我一般就是模拟串口协议 起始位+数据位+停止位 ,一般也用标准波特率。 我觉得这个协议就不错了,当然你的也不错;但是我推荐还是串口协议,你觉得呢?
------------------------------------------------------------------------------------- 17楼: 答wszqw 1、你用什么软件画流程图的? 答:Visio
2、这种通信场合,我一般就是模拟串口协议 起始位+数据位+停止位 ,一般也用标准波特率。 我觉得这个协议就不错了,当然你的也不错;但是我推荐还是串口协议,你觉得呢? 答:匠人觉得,标准的串口协议,主机及从机的波特率必须一致,这对于RC振荡的系统来说,比较麻烦,尤其是字节较多时。 不过,标准总线也有好处,就是便于调试(有许多电脑串口调试软件),此事有待进一步探讨。
------------------------------------------------------------------------------------- hotpower 发表于 2007-1-10 23:01 18楼: 倒塌了~~~就灌点水吧
匠人好辛苦呀~~~
现在成熟的单总线协议很多.基本有:
1-wire总线 hdq16总线 和一些红外协议等等很多...
由于单总线的单线特点,基本由复位(同步),写'1',写'0'组成. 匠人的单总线应该归属于类红外的单总线协议.
它是由dt决定,这里匠人用了1t='0',3t='1'. 即有个容错范围,0.5t<'0'<1.5t,2.5t<'1'<'3.5t. 非法: t<0.5t,1.5t<t<2.5t,t>3.5t(可用于复位即同步引导,当然肯定要长些时间了)
这种协议实际应用中是有个偏移的问题的,菜农在这上面吃过苦头的~~~ 由于在长线通讯中,电平信号的上升(充电过程)和下降(放电过程)是存在很大差异的.故有时1:3估计也不够. 要达到真正的自适应应该分别测出充电和放电时间.
大家知道实际上单总线也分同步和异步协议,类红外实际为异步协议,故对时间要求很严,而且占用系统资源较大.
而单总线的同步协议的代表1-wire在这上面有很大的优点,它很适合IO中断的操作. 它可以在每个电平的下降沿开始计算时间即测出是复位,写'1',写'0'这3个状态. 而且位和位之间时间可以任意,当然不能很长.
就灌到这里吧,希望匠人不要以为菜农在拍砖~~~匠人的精神可嘉~~~
------------------------------------------------------------------------------------- 程序匠人 发表于 2007-1-11 00:18
19楼: hotpower高见,转!
------------------------------------------------------------------------------------- 程序匠人 发表于 2007-1-11 00:32
20楼: 3问hotpower
1、大家知道实际上单总线也分同步和异步协议,类红外实际为异步协议,故对时间要求很严,而且占用系统资源较大 ——异步协议对时间要求很严?我感觉……
2、这种协议实际应用中是有个偏移的问题的 ——你说的长线通讯有多长啊?
3、另,你觉得我文档中的采用增加一个校准位实现波特率自适应的方法可行吗?能否解决你的偏移问题?
------------------------------------------------------------------------------------- hotpower 发表于 2007-1-11 00:34
21楼: 倒~~~到底是"转"还是"砖"~~~
恭喜匠人开始忽悠~~~
------------------------------------------------------------------------------------- hotpower 发表于 2007-1-11 00:50
22楼: 倒塌了~~~还梅花三弄呢~~~
1.异步协议都存在波特率问题,因为不像同步协议有同步(一般为下降沿). 故相对来说"异步协议对时间要求很严". 2.长线可能在几十米甚至上百米,再线的质量和平行及双绞线等问题, 故线损耗及线电容等都存在很大的差异,所以就带来了上升及下降时间的 不一致. 3.波特率自适应肯定是有好处的,特别是对RC振荡器更有好处. 但在长线应用中,1:1的自适应估计行不通. 因为发送方是按1:1发送的,但接收方波形的畸变就未知了,因为这和线路 的长短有很大的差异,这在工程中是常有的事. 故接收方自适应应该将'1'/'0'分别测试,而不能简单地认为是相等的. 所以实际应用中可能要复杂的多,这要根据实际具体考虑了.
------------------------------------------------------------------------------------- 程序匠人 发表于 2007-1-11 08:33
23楼: 三弄hotpower
1、倒~~~到底是"转"还是"砖"~~~ ——是“转”,意思就是说你的贴已经被百宝箱转贴了。也可以理解为“砖”,意思就是说你的贴为百宝箱添“砖”加瓦了。根据你的爱好,特赠送透明短裤一条请查收。呵呵
2、关于畸变的问题 ——匠人的通讯协议中,低电平是作为“同步信号”的,略有畸变应该没有太大问题,因为我本来就是按RC振荡模式来考虑。高电平时间1t或3t才有实际意义。我想,即使有畸变,也应该是一个方向的畸变吧,要么都变大,要么都变小。通过波特率校准位采样t,应该可以消除影响吧。不知道这样想法对否?
3、关于异步通讯的问题 ——匠人觉得这种通讯方式虽然只是单线制,但由于每个低电平都作为“同步信号”因此,时间误差不会被累积。这更像是同步通讯吧。呵呵,一家之言。 汽车电子 发表于 2007-1-11 08:53 ------------------------------------------------------------------------------------- 24楼: 强烈支持!
对于一个喜欢“拿来主义”的人来说,我是非常喜欢这样的贴子的。 我重视实际应用远远多于理论基础。 祝愿匠人的百宝箱里面有取之不尽的宝物!
------------------------------------------------------------------------------------- 程序匠人 发表于 2007-1-11 09:05
25楼: 本来就对“同步”“异步”理解不透彻,于是匠人上网搜了一下
本来就对“同步”“异步”理解不透彻,于是匠人上网搜了一下,于是更加糊涂了。
根据网上信息:同步通讯比使用异步通讯效率高,但是,“同步通信”的通信双方必须先建立同步,即双方的时钟要调整到同一个频率。(这一点和hotpower 的"异步协议对时间要求很严"似乎有点出入.)
------------------------------------------------------------------------------------- zhiwei 发表于 2007-1-11 09:06
26楼: 还不如用IRDa
用红外协议,或者可以这样保证同步:每位发出一个PWM,占空比1/3表示0;展空比2/3标示1;用1/2来判决,可以先发一个同步高脉冲来确定位宽。 如______|---|_--|__-|______帧,该帧数据为同步+0+1
------------------------------------------------------------------------------------- 程序匠人 发表于 2007-1-11 09:11
27楼: 其实这个协议里已经借鉴了红外协议
------------------------------------------------------------------------------------- xwj 发表于 2007-1-11 09:14
28楼: “同步”“异步”并不是绝对的,对于有特定格式的数据,可以
从数据信号上获取同步的, 而且大多数串行数据也都是(可以)这样做的,比如红外遥控、UART、来电显示的FSK等...
------------------------------------------------------------------------------------- xwj 发表于 2007-1-11 09:26
29楼: 不同意匠人的电平定义!
你那样根本无法双机通讯 “通讯线平时空闲时处于低电平,由一个100ms 的高电平作为引导码来唤醒从机。然后发送一个字节串行数据。完毕后通讯线恢复到空闲状态的低电平。对于从机来说,接受完8 位数据,或检测到一个连续5t 的低电平(结束码)即可认为通讯结束。”
应该把高低电平反过来才对,毕竟大多数单片机都是用的弱上拉,而且只有下降沿和低电平中断
而且,单片机用一个IO口可以实现单线半双工通讯的,并且加上交互应答后可以明显减少一次传送的时间的(100mS的引导码时间被缩短) ------------------------------------------------------------------------------------- 高建明 发表于 2007-1-11 13:23
30楼: 这种方式可靠性不高
我一般是3条线,单向传输,需要一个中断脚,一个波特率时钟,类似SPI,一条同步信号线,一条数据线,一条时钟线,相当可靠,软件开销极少
------------------------------------------------------------------------------------- xwj 发表于 2007-1-11 15:02
31楼: 单线双向通信的可靠性不成问题,我们已经用了很多年了
只是资源占用多点罢了
LS的太浪费了,完全没必要又是“同步信号线”又是“时钟线”的,重复了 ------------------------------------------------------------------------------------- coldra 发表于 2007-1-11 15:22
32楼: 基本同意29楼意见
------------------------------------------------------------------------------------- wszqw 发表于 2007-1-11 18:03
33楼: 多谢匠人!
建议匠人将你的手记集成一册,做成一个pdf文档 ------------------------------------------------------------------------------------- wszqw 发表于 2007-1-11 19:00
34楼: 关于长线通信,这样做比较好
发送端加一个p管做驱动
通信协议还用匠人的协议
1、对于hotpower老侠说的充电/放电/偏移什么的容易克服
2、对于xwj大侠说的极性问题也可解决
------------------------------------------------------------------------------------- wszqw 发表于 2007-1-11 19:15
35楼: 我做过这样的长线通信
不过系统用的是24V电源,所以P管上接的是24V电源,接收端用电阻分压到5V送单片机RX脚
开始想弄个匠人那样的协议,再考虑一下觉得不如就用串口,可靠性一样,速度还更快,最简单不过了。波特率1200bps
用一捆约200米长的单芯细线(就是平时用来焊板的那种线)试了试,我靠,居然接收没有一点问题,连自己都不敢相信。
不知道这是不是所谓的电流传送?反正最后就这么用的了,一个发送多个接收(广播方式)。用的挺好。 ------------------------------------------------------------------------------------- xwj 发表于 2007-1-11 19:27
36楼: 34楼的电路要双工的话就要2个IO了
不过可以用于机外长线通讯
而IO直连的方式直适合于机内或干扰小的场合,但可以用单个IO做半双工通讯
------------------------------------------------------------------------------------- 程序匠人 发表于 2007-1-11 20:56
37楼: wszqw的电路,匠人也用过类似的
不过是用2个三极管
------------------------------------------------------------------------------------- wszqw 发表于 2007-1-11 21:10
38楼: 呵呵,其实我也是用2个管呢
两次取反恢复原极性
因为我用的是单片机的串口收发啊~~ ------------------------------------------------------------------------------------- 高建明 发表于 2007-1-11 21:19
39楼: XWJ的单线双向通信如何实现?
XWJ的单线双向通信如何实现? 看到过一个空调控制器用单线通信的,还用一种居然一条通信线接在直流电源线上来通信的,我服了!~~~~~~ ------------------------------------------------------------------------------------- 高建明 发表于 2007-1-11 21:23
40楼: 另外XWJ的单线双向通信速度如何?
另外XWJ你用I/O模拟的单线双向通信速度如何?能否做到1000BPS以上不丢码? ------------------------------------------------------------------------------------- hotpower 发表于 2007-1-11 22:17
41楼: 如39楼单线可能集电源,语音,1主多从双向低功耗通信
不说大家应该知道是什么产品了.
单线半双工通讯没什么新奇的,不过协议确实很重要.
至于总线空闲电平状态是什么,这要根据实际要求而决定.
并非只是一般的低或高电平,可能还有高阻状态.
传输电平高低也不一样,肯定是高压传送的距离更远些,这和超高压送变电道理一样.
------------------------------------------------------------------------------------- 汽车电子 发表于 2007-1-12 00:34
42楼: 其实把半双工的UART的两根线合为一根
全部采用UART现成的协议,这样简单省事,我在01年做过,一个2051系统,是做个RS485集线器
------------------------------------------------------------------------------------- gtw 发表于 2007-1-12 08:18
43楼: 直接用LinBus就是喽
电源线通信线只一根,协议是现成的 -------------------------------------------------------------------------------------
hotpower 发表于 2007-1-12 21:01
46楼: 哈哈~~~配合匠人找了些普及材料~~~
用于汽车网络的LIN协议分析
基于普通单片机的LIN协议实现方案
低成本LIN总线协议在汽车网络中的应用
------------------------------------------------------------------------------------- gtw 发表于 2007-1-13 09:23
47楼: 相比之下
LinBus 成熟:已经成为标准并使用 可靠:用在汽车上 同步:允许15%时钟偏差 简单:单线 距离:40m 节点:16个
值得仔细研究 ------------------------------------------------------------------------------------- hotpower 发表于 2007-1-13 09:47
48楼: 我采用具有总线保护的接法
图纸在单位,没法上传.
我是很早自己做的总线,速率在20KBPS以上.
和下图的LINBUS有些区别.
1.采用总线上发送'1',空闲时高阻. 即Vbat前加三极管控制. 2.总线电阻各取100p,提高发送速率. 3.接收电路经过非门后接入.(2.2V以上翻转)
由于现场环境总线上可能出现认为的高压,若采用OC门驱动方式,即低电平 驱动总线,那么在发送'0'时,很容易烧毁接口. 采用发送高控制后,就不怕烧毁IO了,因为上拉的是1.2K左右的电阻,又无低电平 大电流输出,故其"线与"就变成了总线上的多个'1'信号.
当然这样做也是有缺点的,因为它不如OC门放电迅速.因为它无放电通道. 优点是无0.8Vbat和0.2Vbat之分,只要总线上有2.2V以上电平信号即可翻转.
实际应用效果还不错,刚好最近有个项目要用单总线,准备再完善一些.
------------------------------------------------------------------------------------- hotpower 发表于 2007-1-13 13:14
49楼: 给出3个版本LIN总线协议的下载地址
建议用下载工具下载.
LIN 2.1 LIN 2.0 LIN 1.3
LIN联盟的网站
-------------------------------------------------------------------------------------
程序匠人 发表于 2007-1-14 16:46
52楼: 没想到这篇贴子引来这么多“纯净水”
向生命不息、灌水不止、死而后已的HOTPOWER致敬!
随便说一下,这两天没事,在家里把匠人手记》24《用单片机IO口实现单线单工通讯》的思路实际编了两个小程序(一个发一个收)调试了一下,已经调试通过了。 ------------------------------------------------------------------------------------- hotpower 发表于 2007-1-14 18:41
53楼: 倒塌了~~~向生命不息、灌水不止、死而后已
干脆追认烈士吧!!!我倒塌了~~~
我常听什么"骨灰级"...晕~~~倒~~~
|