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

原文连接 http://blog.sina.com.cn/s/blog_57ad1bd20102uxxu.html

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.   4个DS18B20在面包板上

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

3.Saleae Logic分析仪

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码,还能通过程序执行时产生“波形”分析调试代码,也可以方便的测定延时函数的时间。

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注册码

图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。

图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

0

连接器件的该位有0有1,这是一个差异位(混码位)

0

1

连接器件的该位均为0

1

0

连接器件的该位均为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位 循环冗余校验码(CRC);CRC值用于验证是否搜索到正确的ROM码。ROM码的排列如图1所示。关于CRC校验的原理,内容丰富到需要专文论述,这里不详述,可参见 Maxim 网站相关笔记。

1-Wire搜索算法详解(1)相关推荐

  1. A*启发式搜索算法详解 人工智能

    A*启发式搜索算法详解 人工智能 我们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地.路径搜索(Pathfinding)的目标是找到一条好的路径--避免障碍物.敌人,并把 ...

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

    原文连接:http://blog.sina.com.cn/s/blog_57ad1bd20102uxxv.html 1-Wire搜索算法详解(2) 4 实例及算法分析 要理解算法,或制定算法,我们需要 ...

  3. DS18B20 1-WIRE ROM搜索算法详解

    转自:http://blog.sina.com.cn/s/blog_57ad1bd20102uxxw.html 1-WIRE搜索算法详解(1) 0前言 美信公司(http://www.maximint ...

  4. (DFS)深度优先搜索算法详解

    背景 DFS 英文全称为(Depth First Search),中文简称深度优先搜索算法,其过程为沿着每一个可能的路径向下进行搜索,直到不能再深入为止,并且每一个节点只能访问一次. 算法的搜索遍历图 ...

  5. BWT压缩算法及FM搜索算法详解

    BWT压缩算法其经典地位无可撼动, 思想真是个奇妙的东西, 废话不多说, 让我们来看看她的奇妙之处吧. 假设有一串字符串S="acaacg", 长度为6, 如果直接对此串进行压缩, ...

  6. C语言 DFS(深度优先搜索算法) 详解

    基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...

  7. C++算法之深度优先搜索算法详解

    1.深度优先搜索算法 深度优先搜索是一种在开发爬虫早期使用较多的方法.它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) .在一个HTML文件中,当一个超链被选择后,被链接的HT ...

  8. 二分搜索算法详解(Binary Search)

    二分搜索(Binary Search) 如何确定一个元素在数组中的位置?(假设数组里面全都是整数) 如果是无序数组,从第0个位置开始遍历搜索,平均时间复杂度:O(n) 如果是有序数组,可以使用二分搜索 ...

  9. 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

最新文章

  1. 华为:N个同学站成一排,发饼干至少每人一个,相邻分值高的可以多分一个以上饼干,求问至少需要发多少个饼干满足要求
  2. 计算机端口封闭,如何查询局域网内被封的电脑端口?
  3. DB2更改数据文件路径
  4. linux 查看强制位,linux强制位与冒险位
  5. kali安装pip3
  6. 计算机的数据库应用领域,【信息管理论文】信息管理中计算机数据库技术的应用(共4410字)...
  7. TensorFlow 2.0和PyTorch谁更好?大牛们争了好几天
  8. 爬虫养成记 - urllib2的调试和错误处理
  9. java sort 插入排序_插入排序(insertSort)
  10. layout中蛇形线和差分线的使用
  11. 启动不了 驱动程序签字功能,bios关闭驱动数字签名 如何在bios禁用驱动程序签名,装系统,启动行为那个无效?...
  12. 对话状态跟踪学习笔记
  13. 大学计算机应用基础教程读后感,计算机应用基础的课程学习体会
  14. azkaban build报错
  15. 用python画小猪佩奇代码_用Python画小猪佩奇
  16. 590. N-ary Tree Postorder Traversal(Tree)
  17. 易语言如何使用处理事件
  18. matlab里butter,matlab中butter函数
  19. 传奇登录器列表显示不连接
  20. Android 增量更新实战

热门文章

  1. Vue表格Table精美模板分享
  2. Oracle 12C RAC关闭MGMT
  3. Carla自动驾驶模拟器使用教程Python编程 #最全最源
  4. NOJ 1145.求图像的周长
  5. Mapxtreme中的胖客户端、瘦客户端及中型客户端介绍
  6. 如何一键文字转声音制作广告语音
  7. 创业板股票如何在python取数_如何用python获取实时的股票数据?
  8. 单点登录出现“票根‘ST-xxxxxx-cas’不符合目标服务”的错误的解决办法
  9. 分享电脑好用且免费的实用软件及官方下载地址(亲测好用无广告)
  10. js发送http post请求