ROM搜索算法对多个DS18B20进行地址读取ROM搜索算法是一个用于解决1-wire总线上多个器件地址寻址的算法实际应用假设在一条总线上挂载了多个 1-Wire器件、但主机不知道它们地址无法进行通信此时可以通过ROM搜索算法枚举出每一个器件的64位ROM地址后在通过器件地址进行通信。DS18B20一款‌单总线数字温度传感器‌传感器、转换电路都集成在内部像三极管一样直接使用。每个芯片有唯一的 64 位序列号一根总线上可挂多个DS18B20实现多点测温。‌‌核心思路就是通过枚举的方法逐位确定器件n位ROM码的每一位主机在这过程会读取两次数据写一次方向第一次读取所有设备相同位的实际码线与值第二次读取所有设备该位的补码线与值对两次读取的值进行判断和方向选择如下结果为01时所有设备该位都是0无冲突方向选择跟随为0结果为10时所有设备该位都是1无冲突方向选择跟随为1结果为00时有设备是0也有设备是1有冲突方向选择0或1结果为11时总线无设备响应搜索终止无冲突时方向由器件决定冲突时主机才真正有选择权选择方向。但无论哪种情况主机都必须写入一位方向写入方向位后器件在同一个写时隙内采样并比较判断自己是否继续参与。冲突冲突是获取每一个器件地址的关键当两次读取到的值为00时产生冲突有设备是0也有设备是1而这个0和1就可以做为接下来进行搜索的方向当主机确定把0/1做为接下来搜索的方向向总线写0/1每搜索一次确定一个地址同时也只记录一个冲突点。示例使用ROM算法读取3路DS18B20的ROM地址分别为28DADB09000324BF、2881650E00032402、28FD950D000324C9对应的64个位如下对于3路或者是n路64位ROM地址使用ROM算法时第一次搜索前9个位都一样所以可以确定不会产生冲突而到第10位时A器件实际码为1补码为0B器件实际码为0补码为1C器件实际码为1补码为0ABC器件实际码线与值为01 0 1 0ABC器件补码线与值为00 1 0 0实际码和补码的线与值都为0所以产生了冲突需要选择方向并记录冲突位置为第10位。假设在冲突位置选择0为搜索方向此时只有器件B符合条件直到循环到第64位得到器件B的地址为2881650E00032402。第二次搜索前9个位都一样所以可以确定不会产生冲突而到第10位时产生冲突与第一次搜索产生冲突的位置进行比较发现两次搜索发生的冲突位置相同此时就需要在第二次搜索的第10位产生冲突时改变方向选择1为搜索方向因为第一次搜索在第10位产生冲突时选择0为搜索方向所以第二次在相同位置产生冲突时选择第一次搜索的相反方向。接下来在第11位的时候器件A实际码为0补码为1器件C实际码为1补码为0因为在第10位时已经选择1做为方向所以不再考虑器件B了器件AC实际码线与值为0补码线与值也为0所以器件AC在第11位时产生了00冲突所以产生了又需要选择方向并更新第二次产生冲突的位置为第11位。假设在冲突位置又选择0为搜索方向此时只有器件A符合条件直到循环到第64位得到器件A的地址为28DADB09000324BF。第三次搜索前9个位都一样所以可以确定不会产生冲突而到第10位时产生冲突与第二次产生冲突的位置进行比较发现第三次产生冲突的位置第10位小于第二次产生的位置第11位此时保持第二次冲突时选择的方向进行搜索到第11位时又产生了冲突与第二次产生冲突的位置进行比较发现第三次产生冲突的位置第11位与第二次产生的位置第11位相同此时就需要在第三次搜索的第11位产生冲突时改变方向选择1为搜索方向因为第二次搜索在第11位产生冲突时选择0为搜索方向所以第三次在相同位置产生冲突时选择第二次搜索的相反方向。此时只有器件C符合条件直到循环到第64位得到器件C的地址为28FD950D000324C9。第四次搜索防止还有其他器件没有被搜索到用于终止搜索所以搜索次数比器件数多一次判断依据是没有产生新的冲突位。通过前三次搜索获得每个DS18B20的64位ROM地址第四次搜索终止搜索。