当单线总线上挂有多个 DS18B20 时,系统对总线上器件的数量和每个器件 ROM 码的识别是
通过 DS18820 的搜索 ROM 命令与算法配合来实现的。
1.ROM 搜索原理
根据单线总线协议,当主机发出搜索 ROM 命令后,从机应答时从 64 位 ROM 码的最低
位开始,先发送原码,然后发送该位的补码,
之后主机写入 1 位数据,ROM 码最低位与此数据相同的 DS18B20 继续应答,反之则不
再应答,如此循环“读 2 位、写 1 位”的过程,
直至读到一个完整 ROM 码为止,然后复位总线,进行下一次搜索。下面对读、写进行
具体分析。
(1)读 2 位
由于主机发出搜索命令后,所有从机都会将自己 ROM 码的第一位(最低位)的原码和
补码放到总线上,那么就有下面四种可能的情况:
若所有器件第一位都为 0:那么所有器件放到总线上的原码都为 0,补码都为 1,读 2
位得到为“01”;若所有器件第一位都为 1:同上可知,
读到的值为“10”;若器件中有些为 1,而有些为 0:那么,放原码和补码时,都会有
器 件放 0 到总线上,根据“线与”
逻辑可知读到的结果为“00”;总线上无器件:此情况下,没有器件拉低总线,读到为
“11”。
(2)写 1 位
主机写 1 位的目的是为了排除和定位,具体要写入什么数据需要根据读 2 位的结果而定:
若读到为“11”,表明无器件则结束搜索过程,
无需再写入;若读到为“01”或“10”,表明所有器件此位相同,则应对应写入“0”
或 “1”,继续读下一位;若读到为“00”,表明总线上
的器件在该位上数据发生冲突,此时,写入 1 位数据具有“排除”的作用,如果器件
ROM 编码在该位上的数据与写入的数据相同,
则继续保持与总线的联系,如果不同则此器件在本次搜索中从总线上“排除”,不再响
应主机发布的命令,直到主机进行下一次复位。
2.ROM 搜索策略
根据上述 ROM 搜索原理的描述,可得到如下图所示的树形搜索策略图,其中圆形节点
内所示即为对应位的 ROM 码。
由图可知,只有遇到读两位为“00”才会出现分叉,这也是搜索的关键所在。每一次搜
索由根(即开始节点)沿树的一条路径进行,直到叶子(最后一位 ROM 码),读回一
个 ROM 码,为了确保每次搜索所选路径不同,必须对所经过的分又进行记录。其具体流
程规则为:
(1)复位总线,发送 ROM 搜索命令;
(2)按读两位、写一位的方式进行,寻找“00”读码。在读到“00”之前若为“10”
或“01”,直接记录对应位 ROM 码,并写入该码;若为“11”退出搜索。
(3)第一次搜索中读到“00”时,先全部写“0”,选择 ROM 码为“0”的路径,将最高
“00”读码(即图中最接近叶子)位置记录并保存下来为“最高 00 位”。
(4)之后每次搜索中,遇到“00”读码后,比较此位与“最高 00 位”的位置,若在“最
高 00 位”之前,则一律写上一次搜索在此位置写入的值;若位置相同,则写“1”;
若在之后则写“0”。
在每一次搜索完成后,要将“最高 00 位”更新为本次搜索中写“0”的最高“00”
读码位置,这也是最为重要的一步。