1、1-Wire 搜索算法 Dallas Semiconductor的每片 1-Wire器件都有唯一的 64位注册码它存储在只读存储器 (ROM)中。在 1-Wire网络中注册码用于 1-Wire主机对从机器件进行逐一寻址。如果 1-Wire网络中从机器件的 ROM 码是未知的,可以通过搜索算法来找到此码。本文不仅详细地解释了搜索算法,而且还提供了实现快速整合的例程该算法适用于任何具有 1-Wire接口特性的现有产品及未来产品。 表 1 64 位唯一的 ROM 注册码 MSB 64位 ROM注册码 LSB 8位 CRC校验码 MSB LSB 48位序列号 MSB LSB 8位家族码 MSB LSB
2、 搜索算法 搜索算法采用的是二叉树型结构,搜索过程沿各分节点进行,直到找到器件的 ROM码即叶子为止;后续的搜索操作沿着节点上的其它路径进行,按照同样的方式直到找到总线上的所有器件代码。 搜索算法首先通过复位 (Reset)和在线应答脉冲 (Presence Pulse)时隙将1-Wire总线上的所 有器件复位;成功地执行该操作后,发送 1个字节的搜索命令;搜索命令使 1-Wire器件准备、就绪开始进行搜索操作。 搜索命令分为两类标准搜索命令 (0F0H)用来搜索连接到网络中所有器件;报警或有条件搜索命令 (0ECH)只用来搜索那些处于报警状态下的器件 , 这种方式缩小了搜索范围,可以快速查找
3、到所需要注意的器件。 搜索命令发出之后,开始实际的搜索过程。首先总线上的所有从机器件同时发送 ROM 码 (也叫注册码 )中的第一位 (最低有效位 )(参见 图 1)。 与所有的 1-Wire通信一样无论是读取数据还是向从机器件写数据,都由 1-Wire主机启动每一位操作。按照 1-Wire的特性,当所有从机器件同时应答主机时,结果相当于全部发送数据位的逻辑 AND; 从机发送其 ROM码的第一位后,主机启动下一位操作、接着从机发送第一位数据的补码;从两次读到的数据位可以对 ROM码的第一位做出几种判断 (参见表 2)。 按照搜索算法的要求, 1-Wire主机必须向总线上的从机发回一个指定位;
4、如果从机器件中 ROM码的当前位的值与该数据位匹配,则继续参与搜索过程;若从机器件的当前位与之不匹配,则该器件转换到等待状态,并保持等待状态直到下一个 1-Wire复位信号到来。 其余 63位 ROM 码的搜索依然按照这种读两位、写一位的模式进行重复操作 (参见 表 3)。 表 2 检索信息位 位 (实际值 ) 位 (补码 ) 结论 0 0 从机 ROM码中的当前位既有 0,也有 1;即存在差异 0 1 从机 ROM码中的当前位均为 0。 1 0 从机 ROM码中的当前位均为 1。 1 1 总线上没有从机器件响应。 按照这种搜索算法进行下去,最终除了一个从机器件外所有从机将进入等待状态,经过最
5、后一轮检测,就可得到最后保留 (未进入等待状态 )器件的 ROM码。在后续搜索过程中,选用不同的路径 (或分 支 )来查找其它器件的 ROM码。需要注意的是本文 ROM码的数据位用第 1位 (最低有效位 )到第 64位 (最高有效位 )表示,而不是我们常用的那种第 0位到第 63位的模式;这样设置允许将差异位置记数器初始值置为 0,为以后的比较提供了方便。 表 3 1-Wire 主机和从机的搜索过程 主机 从机 1-Wire 发出复位信号 产生在线应答脉冲。 写搜索命令 (标准或报警 ) 从机准备搜索。 读第 1 位的 AND 从机发送 ROM 码的第 1 位。 读第 1 位补码的 AND 从
6、机发送 ROM 码的第 1 位的补码。 写第 1 位指 定位 (依照算法 ) 从机接收主机的指定位若所读的位与 ROM码的第 1 位不匹配,则进入等待状态。 读第 64 位的 AND 从机发送 ROM 码的第 64 位。 读第 64 位补码的 AND 从机发送 ROM 码的第 64 位的补码。 写第 64 位指定位 (依照算法 ) 从机接收主机的指定位若所读的位与 ROM码的第 64 位不匹配,则进入等待状态。 从表 4 可以看出:如果所有总线上的器件在当前位具有相同值,那么只有一条分支路径可选;总线上没有器件响应的情况是一种异常状态,可能是要查找的器件在 搜寻过程中与 1-Wire 总线脱离
7、。如果当前位既有 0也有 1,这种情况称为位值差异,它对在后续搜索过程中查找器件起关键作用。搜索算法指定在第一轮查询中若出现差异 (数据位 /补码 = 0/0), 则选用 0路径。注意:这一点是由本文档中介绍的特定算法决定的,其它算法中或许首先选用 1路径。记录最后一次值差异的位置以供下一次搜索使用,表 3列出了出现值差异时路径的选取情况。 表 4 搜索路径方向 搜索位所在位置和 最后一次值差异所在位置的比较 路径选取 = 采用路径 1 采用路径 0 搜索算法计算还对最初 8位过程中出现的最后一次位差异保持跟踪; 64位注册码的前 8位是家族码,在器件的搜索过程中可以按照其家族码进行分类。记录
8、家族码的最后一次差异可以用于有选择性地跳过 1-Wire器件的整个分组。如需进行选择性地搜索,可参考关于高级变量搜索的详细解释。 64位 ROM码中包含 8位循环冗余校验码 (CRC); CRC值用于验证是否搜索到正确的 ROM码注释对实例中出现的符号进行了说明;在本文档的源代码附录中也将用到这些专用符号。 注释: id_bit 在位搜索中第一次读 取的值,该位是搜索过程中所有应答器件的id_bit_number 位的逻辑 AND cmp_id_bit id_bit 位的补码,该位是搜索过程中所有应答器件的id_bit_number位的补码的逻辑 AND id_bit_number 记录当前搜
9、索是 1到 64位 ROM码中哪一位的量 LastDeviceFlag 指明前一次搜索到的已是最后一个器件的标志位 LastDiscrepancy 位指针指明下次搜索从哪个值差异位开始 LastFamilyDiscrepancy 位指针。用来指明 LastDiscrepancy是否是在ROM码中前 8位家族码内和其位置 last_zero 上次被写入 0的值差异位的位置 ROM_NO 记录当前正在查找的 ROM,注册码的 8字节缓冲器 search_direction 位变量其值用来指明搜索方向具有此数据位规定值的所有器件继续响应搜索操作其它器件转入等待状态直到下一次 1-Wire复位搜 索算法通过对 LastDiscrepancy、 LastFamilyDiscrepancy、 LastDeviceFlag 和 ROM_NO 值 (参见表 4)的处理利用上述流程实现了两个不同类 型的搜索操作;这两个操作是搜索 1-Wire 器件 ROM 码的基础。 FIRST FIRST操作是搜索 1-Wire总线上的第一个从机器件。该操作是通过将LastDiscrepancy、 LastFamilyDiscrepancy和 LastDeviceFlag置零,然后进行搜索完成的。最