天天看点

1-Wire搜索算法详解(1)

最近一直在proteus上仿真单总线搜索算法,虽然参考了美信公司的应用笔记以及其他的一些资源,仍然没有成功,估计应该是protues问题。这里先转载一篇不错的博文,以供参考。

1-Wire搜索算法详解(1)

0前言

美信公司(​​http://www.maximintegrated.com/cn​​)生产了许多1-Wire®器件产品,硬件电路极致简单,而相应软件就显得复杂。美信网站的《应用笔记187》介绍了单线ROM搜索算法,并提供了​​TMEXAPI测试程序​​​的源代码,该算法较为复杂,而且是通用于多平台(windows\JAVA等)的API,无法直接在KeilC上调试并写入单片机。本人在学习理解其算法后,适当修改源代码,并作上了详细的注释和图解,代码在KeilC环境下调试通过,并在一个挂接4个DS18B20的小型1-Wire环境中测试成功,顺利获取4个ROM码。现把算法分析及测试过程成文如下,其中算法部分保留了大部分AN187的内容,但作了许多修改和补充,原文可参见​​http://www.maximintegrated.com/cn/app-notes/index.mvp/id/187​​。本文介绍的搜索算法及源代码,对任何现有的或将要推出的1-Wire器件都是有效的。

1测试环境及图示

硬件连接:4个DS18B20并接,MCU为笙泉MG82G516仿真芯片(其他普通51系列都可,仿真芯片可以方便调试),软件为Keil3。

​​

1-Wire搜索算法详解(1)

​​

1.   4个DS18B20在面包板上

​​

1-Wire搜索算法详解(1)

​​

2.笙泉THO65B+仿真器(可仿真51芯片)

​​

1-Wire搜索算法详解(1)

​​

3.Saleae Logic分析仪

​​

1-Wire搜索算法详解(1)

​​

4.全家福(开发板仅安装芯片及供电用)

图1中,4个DS18B20并接,红黄黑三线为电源、信号、地,绿色线通黄色线,接逻辑分析仪。原来逻辑分析仪从单片机端采集1-Wire信号,但实测中主机拉高电平(从机低电平)时,逻辑分析仪采集到一个尖刺脉冲,造成分析仪识别1-Wire协议失误;后将采集线接到从机端,信号正常。

图2是笙泉THO65B+仿真器,USB接口,可仿真51系列,方便程序调试。该仿真器芯片型号为MPC82G516,类似于STC15F2K60S2,为1T单片机,片上64KBFlash, 60KB程序存储器,3KB IAP存储器,1KB ISP 引導程序空间,以及1KRAM。

图3为逻辑分析仪,十分小巧,支持8路信号输入,最高采样速率24M,实际一般使用16M。USB接口,附送软件。图4为开发板,本例中主要功能仅为提供CPU插座及供电,1-Wire器件连接是相当简单的。

再给出一个用逻辑分析采集到的ROM搜索的全过程相关图片,有了这个分析仪,就可以十分方便地读出搜索到的ROM码,还能通过程序执行时产生“波形”分析调试代码,也可以方便的测定延时函数的时间。

​​

1-Wire搜索算法详解(1)

​​

​​

1-Wire搜索算法详解(1)

​​

​​

1-Wire搜索算法详解(1)

​​​

2  1-Wire®器件的ROM码

Maxim的1-Wire®器件都带有一个64位的唯一注册码,生产时通过激光刻蚀在内部只读存储器内(ROM),用于在1-Wire网络中通过1-Wire主机对其寻址。如果1-Wire网络中从机器件数量不定且ROM码未知,则可采用搜索算法查找这些码。下表是64BitROM码的组成示意:

(MSB表示MostSignificant Bit最高有效位,LSB表示LeastSignificant Bit最低有效位)     

MSB                       64位ROM码                         LSB

8位CRC

MSB             LSB

48位序列号

MSB             LSB

8位家庭码

MSB              LSB

搜索顺序是从低位到高位的,如下:

第64位←——————————————————————第1位

图5.64位唯一的ROM注册码

​​

1-Wire搜索算法详解(1)

​​

图6、通过逻辑分述仪采集到的1-Wire信号

图片说明:

1. 上图是逻辑分析仪在ROM搜索到1个ROM时1-Wire总线上采集到的信号,可见搜索耗时15ms;

2. 因低位先传送,逻辑分析仪上显示低位在左边;

3. 信号自左到右分别为:复位R、存在脉冲、主机发搜索命令8位、从机回复64位ROM码(包括家族码0x28、48位ROM、8位CRC码)

4. 分析软件识别出了1-Wire协议,在信号顶部标示了内容和数位,阅读时相当直观。

5. 将图6中家族码的部分放大如图7。

​​

1-Wire搜索算法详解(1)

​​

图7.搜索过程中采集的家族码部分放大图

图片说明

1.   家族码一共为8位,图中有3通道信号,最上面第1通道从1-Wire总线采集,第2通道是“1写”程序时通过转换指定单片机引脚得到(进入该程序时置位,退出前复位);第3路为“2读”信号;均为高电平;

2.   识别8位“一写”代码可见从左到右为00010100,反过来就00101000即28H;

3.   如何识别1-Wire读写的时序,请参见1-Wire技术资料或DS18B20数据表资料,本文不描述。

3 1-Wire搜索协议

搜索算法采用的是二叉树型结构,搜索过程沿各分节点进行,直到找到器件的ROM码即叶子为止;后续的搜索操作沿着节点上的其它路径进行,按照同样的方式直到找到​​总线​​上的所有器件代码。本文后面提供了一个简单示例:4个ROM,每个仅取4位,构造了一棵二叉树,并在此示例上推导出搜索算法的许多细节及实现。

搜索算法首先通过复位(reset)和在线应答​​脉冲​​(presencepulse)时隙将1-Wire总线上的所有器件复位;成功地执行该操作后,发送1个字节的搜索命令;搜索命令使1-Wire器件准备就绪、开始进行搜索操作。

搜索命令分为两类:标准搜索命令(F0hex)用来搜索连接到网络中所有器件;报警或有条件搜索命令(EChex)只用来搜索那些处于报警状态下的器件,这种方式缩小了搜索范围,可以快速查找到所需要注意的器件。本文附带代码仅使用了标准搜索命令。

搜索命令发出之后,开始实际的搜索过程。首先总线上的所有从机器件同时发送ROM码(也叫注册码)中的第一位(最低有效位)(参见图1)。与所有的1-Wire通信一样,无论是读取数据还是向从机器件写数据,都由1-Wire主机启动每一位操作。按照1-Wire协议设置特性,当所有从机器件同时应答主机时,结果相当于全部发送数据位的逻辑​​AND​​;从机发送其ROM码的第一位后,主机启动下一位操作、接着从机发送第一位数据的补码;从两次读到的数据位可以对ROM码的第一位做出几种判断(参见下表)。上述二次读取1-Wire总线上当前位ROM码的正码和反码的操作,本文简述为“二读”。

表1.检索信息位

主机读一位

从机提供当前位正码

主机再读一位

从机提供该位反码

二读后可以判断获得的信息

注意:主线读到的是各个响应从机的“线与”逻辑

连接器件的该位有0有1,这是一个差异位(混码位)
1 连接器件的该位均为0
1 连接器件的该位均为1
1 1 没有器件与总线相连

按照搜索算法的要求,“二读”后1-Wire主机必须向总线上的从机发回一个指定位,称为“一写”;如果从机器件中ROM码的当前位的值与该数据位匹配,则继续参与搜索过程;若从机器件的当前位与之不匹配,则该器件转换到休眠状态,直到下一个1-Wire复位信号到来被再次唤醒。其余63位ROM码的搜索依然按照这种‘读两位’、‘写一位’的模式进行重复操作。

按照这种搜索算法进行下去,最终除了一个从机器件外所有从机将进入等待状态,经过一轮检测,就可得到最后保留(未进入等待状态)器件的ROM码。在后续搜索过程中,选用不同的路径(或分支)来查找其它器件的ROM码。需要注意的是本文ROM码的数据位用第1位(最低有效位)到第64位(最高有效位)表示,而不是第0位到第63位的模式;这样设置允许将差异位置计数器初始值置为0,为以后的比较提供了方便。

上述过程可简述为“二读一写”,“二读”结果为“00”,主机就判定这一位是“差异位”,也可称为“冲突位”“混码位”。举例来说,“二读”就相当于“老师问名”,设想学生的名字就是64位ROM码,老师第1问时学生反应为:“1的不吭声,0就高喊到”;第2问时学生反过来:“0的不吭声,1的高喊到”,老师通过二次答复就可分辨:“不吭声+不吭声”表示一个学生也没有;“不吭声+到”表示大家都是1,“到+不吭声”表示大家都是0;而“到+到”收表示有0有1。试想,如果有0有1,只要有1个喊到,老师就能听到,这种合成效果就是所谓的“线与”,当然这里应称为“声与”。

搜索到“差异位”时,主机如何确定搜索方向(0还是1),这是本算法的核心问题,这也是典型的“二叉树遍历”算法。或许有人会提出一种“笨”算法,就是穷举64位组合,从000…000到111…111遍历,有应答的从机就会被一个一个找出来,这确实是一种简单的“笨”算法,在许多地方很有用,但对于64位ROM来说,假设一位的访问需要100us,64位则需要6.4ms,穷举全部ROM码有264=1844亿亿,极端的遍历时间为37亿年,这确实是一种无法实现的笨办法。

下表列出了1-Wire主机和从机的搜索过程:

Master Slave
发送“复位”信号 产生“存在”脉冲
发送“搜索”命令 全体器件进入“应付搜索”状态,不断地根据主机信号作出反应
从总线读取1位“线与” 全体器件发送64位ROM码的第1位
从总线读取1位“线与” 全体器件发送64位ROM码的第1位的反码
向总线写1位(按算法) 器件们接收此位后,凡与ROM码的第1位不符的器件进入休眠状态
读64位ROM码后续位 器件发后续位ROM码
读64位ROM码后续位的反码 器件发后续位ROM码的反码
写后续各位 器件们接收此位后,凡与ROM码的当前位不符的器件进入休眠状态.

从上表可以看出:如果所有总线上的器件在当前位具有相同值,那么只有一条分支路径可选;总线上没有器件响应的情况是一种异常状态,可能是要查找的器件在搜寻过程中与1-Wire总线脱离。如果出现这种情况,应中止搜索,并发出1-Wire复位信号起始新的搜索过程。如果当前位既有0也有1,这种情况称为位值差异,它对在后续搜索过程中查找器件起关键作用。搜索算法指定在第一轮查询中若出现差异(数据位/补码= 0/0),则选用‘0’路径。注意:这一点是由本文档中介绍的特定算法决定的,其它算法中或许首先选用‘1’路径。算法需要记录最后一次值差异的位置以供下一次搜索使用。

本文介绍的搜索算法是一个通用的程序,Maxim工程师极巧妙地设计了一些变量,只要在搜索前设置这些变量的初始值,程序就能完成不同的搜索功能,下文中会列出这些变量,但理解其奥秘需要花点时间。比如程序对最初8位ROM中出现的最后一次位差异设置了一个专门的变量保持跟踪,因为64位注册码的前8位是家族码,利用此变量可以在器件的搜索过程中可以按照其家族码进行分类。运用该变量可以有选择性地跳过1-Wire器件的整个分组。如需进行选择性的搜索,可参考关于高级变量搜索的详细解释。

64位ROM码中还包含8位

继续阅读