1Wire搜索算法.docx

上传人:b****5 文档编号:5126149 上传时间:2022-12-13 格式:DOCX 页数:16 大小:23.43KB
下载 相关 举报
1Wire搜索算法.docx_第1页
第1页 / 共16页
1Wire搜索算法.docx_第2页
第2页 / 共16页
1Wire搜索算法.docx_第3页
第3页 / 共16页
1Wire搜索算法.docx_第4页
第4页 / 共16页
1Wire搜索算法.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

1Wire搜索算法.docx

《1Wire搜索算法.docx》由会员分享,可在线阅读,更多相关《1Wire搜索算法.docx(16页珍藏版)》请在冰豆网上搜索。

1Wire搜索算法.docx

1Wire搜索算法

1-Wire搜索算法

1-Wire搜索算法

Dec05,2019

摘要:

Maxim的1-Wire器件都带有一个64位的唯一注册码,存储在只读存储器内(ROM),能够在1-Wire网络中通过1-Wire主机对其寻址。

如果1-Wire网络中从机器件的ROM码是未知的,贝V可采用搜索算法查找这些码。

本文详细说明了搜索算法的原理,并提供了一个范例,便于用户使用。

该算法对任何现有的或将要推出的1-Wire器件都是有效的。

绪论

Maxim的每片1-Wire器件都有唯一的64位注册码,它存储在只读存储器(ROM中。

在1-Wire网络中,注册码用于1-Wire主机对从机器件进行逐一寻址。

如果1-Wire网络中从机器件的ROM码是未知的,可以通过搜索算法来找到此码。

本文不仅详细地解释了搜索算法,而且还提供了实现快速整合的例程。

该算法适用于任何具有1-Wire接口特性的

现有产品及未来产品。

图1.64位唯一的ROM注册码

搜索算法

搜索算法采用的是二叉树型结构,搜索过程沿各分节点进行,直到找到器件的ROM码

即叶子为止;后续的搜索操作沿着节点上的其它路径进行,按照同样的方式直到找到总线上的所有器件代码。

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

搜索命令分为两类:

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

搜索命令发出之后,开始实际的搜索过程。

首先总线上的所有从机器件同时发送ROM

码(也叫注册码)中的第一位(最低有效位)(参见图1)。

与所有的1-Wire通信一样,无论是读取数据还是向从机器件写数据,都由1-Wire主机启动每一位

分享

其它渠道E-Mail

更多信

注册EE-Mail打印

操作。

按照1-Wire的特性,当所有从机器件同时应答主机时,结果相当于全部发送数据位的逻辑AND;从机发送其ROMI码的第一位后,主机启动下一位操作、接着从机发送第一位数据的补码;从两次读到的数据位可以对ROM码的第一位做出几种判断(参见表

1)。

表1.检索信息位

按照搜索算法的要求,1-Wire主机必须向总线上的从机发回一个指定位;如果从机器件中ROM码的当前位的值与该数据位匹配,则继续参与搜索过程;若从机器件的当前位与之不匹配,则该器件转换到等待状态,并保持等待状态直到下一个1-Wire复位信号到来。

其余63位ROM码的搜索依然按照这种’读两位’、‘写一位’的模式进行重复操作(参见表2)。

按照这种搜索算法进行下去,最终除了一个从机器件外所有从机将进入等待状态,经过最后一轮检测,就可得到最后保留(未进入等待状态)器件的ROM码。

在后续

搜索过程中,选用不同的路径(或分支)来查找其它器件的ROM码。

需要注意的是本文ROM码的数据位用第1位(最低有效位)到第64位(最高有效位)表示,而不是我们常用的那种第0位到第63位的模式;这样设置允许将差异位置计数器初始值置为0,为以后的比较提供了方便。

表2.1-Wire主机和从机的搜索过程

从表1可以看出:

如果所有总线上的器件在当前位具有相同值,那么只有一条分支路径可选;总线上没有器件响应的情况是一种异常状态,可能是要查找的器件在搜寻过程中与1-Wire总线脱离。

如果出现这种情况,应中止搜索,并发出1-Wire复位信号起始新的搜索过程。

如果当前位既有0也有1,这种情况称为位值差异,它对在后续搜索过程中查找器件起关键作用。

搜索算法指定在第一轮查询中若出现差异(数据位/补码=0/0),

则选用‘0'路径。

注意:

这一点是由本文档中介绍的特定算法决定的,其它算法中或许首先选用‘1'路径。

记录最后一次值差异的位置以供下一次搜索使用,表3列出了出现值差异时路径的选取情况。

表3.搜索路径方向

搜索算法计算还对最初8位过程中出现的最后一次位差异保持跟踪;64位注册码的前8位是家族码,在器件的搜索过程中可以按照其家族码进行分类。

记录家族码的最后一次差异可以用于有选择性地跳过1-Wire器件的整个分组。

如需进行选择性的搜索,可参考关于高级变量搜索的详细解释。

64位ROM码中包含8位循环冗余校验码(CRC);CRC值用

于验证是否搜索到正确的ROM码。

ROM码的排列如图1所示。

DS2480B系列串口到1-Wire线路的驱动程序在硬件中实现了部分与本文档中相同的搜索算法;详细资料请参阅DS2480B数据资料和应用笔记192,DS2480B

串行接口1-Wire线驱动器的使用的详细介绍;从DS2490USB口到1-Wire桥

接器硬件电路中实现了整个搜索过程。

图2列出了对一个从器件进行搜索的流程图;注意:

右侧Reference栏对在流程图中出现的符号进行了说明;在本文档的源代码附录中也将用到这些专用符号。

图2.搜索流程

图2.搜索流程,第2部分

搜索算法通过对LastDiscrepancy、LastFamilyDiscrepancy、LastDeviceFlag和ROM_N值(参见表4)的处理,利用上述流程实现了两个不同类型的搜索操作;这两个操作是搜索1-Wire器件ROM码的基础。

First

‘FIRST操作是搜索1-Wire总线上的第一个从机器件。

该操作是通过将

LastDiscrepancy、LastFamilyDiscrepancy和LastDeviceFlag置零,然后进行搜索完成的。

最后ROM码从ROM_N寄存器中读出。

若1-Wire总线上没有器件,复位序列就检测不到应答脉冲,搜索过程中止。

Next

‘NEXT操作是搜索1-Wire总线上的下一个从机器件;一般情况下,此搜索操作是在‘FIRST操作之后或上一次‘NEXT操作之后进行;保持上次搜索后这些值的状态不变、执行又一次搜索即可实现‘NEXT操作。

之后从ROM_N寄存器中来读出新一个ROM

码。

若前一次搜索到的是1-Wire上的最后一个器件,则返回一个无效标记FALSE,并且把状态设置成下一次调用搜索算法时将是‘FIRST操作的状态。

图3(a,b,c)例举了三个器件的搜索过程,为便于说明,设器件的ROM码只有2位。

图3.搜索过程举例

高级变量搜索

有3种利用同一组状态变量LastDiscrepancy、LastFamilyDiscrepancy、LastDeviceFlag、ROM_N实现的高级变量搜索算法,这几种高级搜索算法允许来指定作为搜索目标或需要跳过搜索的器件的类型(家族码)以及验证某类型的器件是否在线(参见表4)。

Verify

‘VERIFY操作用来检验已知ROMI码的器件是否连接在1-Wire总线上,通过提供ROM码并对该码进行目标搜索就可确定此器件是否在线。

首先,将ROM_N寄存器值设置

为已知的ROM码值,然后将LastDiscrepancy和LastDeviceFlag标志位分别设置为64(40h)和0;进行搜索操作,然后读ROM_N的输出结果;如果搜索成功并且ROM_N中存

储的仍是要搜索器件的ROM码值,那么此器件就在1-Wire总线上。

TargetSetup

‘TARGETSETUP操作就是用预置搜索状态的方式首先查找一个特殊的家族类型,每个1-Wire器件都有一个字节的家族码内嵌在ROM码中(参见图1),主机可以通过家族码

来识别器件所具有的特性和功能。

若1-Wire总线上有多片器件时,通常是将搜索目标首先定位在需注意的器件类型上。

为了将一个特殊的家族作为搜索目标,需要将所希望的家族码字节放到ROM_N寄存器的第一个字节中,并且将ROM_N寄存器的复位状态置零,然

后将LastDiscrepancy设置为64(40h);把LastDeviceFlag和LastFamilyDiscrepancy设置为0。

在执行下一次搜索算法时就能找出所期望的产品类型的第一个器件;并将此值存入ROM_N寄存器。

需要注意的是如果1-Wire总线上没有挂接所期望的产品类型的器件,

就会找出另一类型的器件,所以每次搜索完成后,都要对ROM_N寄存器中存储的结果进

行校验。

FamilySkipSetup

‘FAMILYSKIPSETUP操作用来设置搜索状态以便跳过搜索到的指定家族中的所有器件,此操作只有在一个搜索过程结束后才能使用。

通过把

LastFamilyDiscrepancy复制到LastDiscrepancy,并清除LastDeviceFlag即可实现该操作;在下一搜索过程就会找到指定家族中的下一个器件。

如果当前家族码分组是搜索过程中的最后一组,那么搜索过程结束并将LastDeviceFlag置位。

表4.搜索变量状态的设置

结论

本文提供的搜索算法可以找出任意给定的1-Wire器件组中独一无二的ROM码,这是

保证多点1-Wire总线应用的关键,已知ROM码后就可以对逐一选定的某个1-Wire器件

来进行操作。

本文还对一些变量搜索算法做了详细论述,这些变量搜索算法能够查找或跳过特定类型的1-Wire器件。

附录给出了实现搜索过程和所有变量搜索算法的例程,并给出了‘C程序代码。

附录

F面给出了搜索算法的‘C程序代码及实现每个变量搜索算法的函数。

FamilySkipSetup和TargetSetup函数实际上并没有进行搜索操作,它们只不过是用来设置搜索寄存器,以便在下一次执行‘NEXT操作时能跳过或找到所期望的类型。

需要

注意的是低级1-Wire函数可通过调用TMEXAPI实现。

这些程序调用只是用于系统测试,也可以用特定平台调用。

关于TMEXAPI和其它一些1-WireAPI的详细资料请参考应用笔

记155。

下列TMEXAPI测试程序的源代码可从Maxim网页下载。

//TMEXAPITESTBUILDDECLARATIONS#defineTMEXUTIL

#include"ibtmexcw.h"longsession_handle;

//ENDTMEXAPITESTBUILDDECLARATIONS

//definitions#defineFALSE0#defineTRUE1

//methoddeclarationsintOWFirst();intOWNext();intOWVerify();

voidOWTargetSetup(unsignedcharfamily_code);voidOWFamilySkipSetup();intOWReset();

voidOWWriteByte(unsignedcharbyte_value);

voidOWWriteBit(unsignedcharbit_value);

unsignedcharOWReadBit();

intOWSearch();

unsignedchardocrc8(unsignedcharvalue);

//globalsearchstate

unsignedcharROM_NO[8];

intLastDiscrepancy;

intLastFamilyDiscrepancy;

intLastDeviceFlag;

unsignedcharcrc8;

//

//Findthe'first'devicesonthe1-Wirebus

//ReturnTRUE:

devicefound,ROMnumberinROM_NObuffer//FALSE:

nodevicepresent

//

intOWFirst()

{

//resetthesearchstate

LastDiscrepancy=0;

LastDeviceFlag=FALSE;

LastFamilyDiscrepancy=0;

returnOWSearch();

}

//

//Findthe'next'devicesonthe1-Wirebus

//ReturnTRUE:

devicefound,ROMnumberinROM_NObuffer//FALSE:

devicenotfound,endofsearch//

intOWNext()

{

//leavethesearchstatealone

returnOWSearch();

}

//

//Performthe1-WireSearchAlgorithmonthe1-Wirebususing

theexisting

//searchstate.

//ReturnTRUE:

devicefound,ROMnumberinROM_NObuffer//FALSE:

devicenotfound,endofsearch//

intOWSearch()

{

intid_bit_number;

intlast_zero,rom_byte_number,search_result;intid_bit,cmp_id_bit;

unsignedcharrom_byte_mask,search_direction;

//initializeforsearch

id_bit_number=1;

last_zero=0;

rom_byte_number=0;

rom_byte_mask=1;

search_result=0;

crc8=0;

//ifthelastcallwasnotthelastone

if(!

LastDeviceFlag)

{

//1-Wirereset

if(!

OWReset())

{

//resetthesearch

LastDiscrepancy=0;

LastDeviceFlag=FALSE;

LastFamilyDiscrepancy=0;

returnFALSE;

//issuethesearchcommandOWWriteByte(0xF0);

//looptodothesearch

do

{

//readabitanditscomplement

id_bit=OWReadBit();cmp_id_bit=OWReadBit();

//checkfornodeviceson1-wire

if((id_bit==1)&&(cmp_id_bit==1))break;

else

{

//alldevicescoupledhave0or1

if(id_bit!

=cmp_id_bit)

search_direction=id_bit;//bitwritevalueforsearchelse

{

//ifthisdiscrepancyifbeforetheLastDiscrepancy

//onapreviousnextthenpickthesameaslasttimeif(id_bit_number

((ROM_NO[rom_byte_number]&rom_byte_mask)>0);else

//ifequaltolastpick1,ifnotthenpick0

search_direction=(id_bit_number==LastDiscrepancy);

//if0waspickedthenrecorditspositioninLastZero

if(search_direction==0)

{

last_zero=id_bit_number;

//checkforLastdiscrepancyinfamilyif(last_zero

LastFamilyDiscrepancy=last_zero;}

}

//setorclearthebitintheROMbyterom_byte_number

//withmaskrom_byte_mask

if(search_direction==1)

ROM_NO[rom_byte_number]|=rom_byte_mask;else

ROM_NO[rom_byte_number]&=~rom_byte_mask;

//serialnumbersearchdirectionwritebit

OWWriteBit(search_direction);

//incrementthebytecounterid_bit_number//andshiftthemaskrom_byte_mask

id_bit_number++;

rom_byte_mask

//ifthemaskis0thengotonewSerialNumbyterom_byte_numberandresetmask

if(rom_byte_mask==0)

{

docrc8(ROM_NO[rom_byte_number]);//accumulatetheCRC

rom_byte_number++;

rom_byte_mask=1;

}

}

}

while(rom_byte_number

//ifthesearchwassuccessfulthen

if(!

((id_bit_number

//searchsuccessfulsoset

LastDiscrepancy,LastDeviceFlag,search_result

LastDiscrepancy=last_zero;

//checkforlastdevice

if(LastDiscrepancy==0)

LastDeviceFlag=TRUE;

search_result=TRUE;

}

}

//ifnodevicefoundthenresetcounterssonext'search'willbelikeafirst

if(!

search_result||!

ROM_NO[0])

{

LastDiscrepancy=0;

LastDeviceFlag=FALSE;

LastFamilyDiscrepancy=0;

search_result=FALSE;

returnsearch_result;

}

//

//VerifythedevicewiththeROMnumberinROM_NObufferispresent.

//ReturnTRUE:

deviceverifiedpresent

//FALSE:

devicenotpresent

//

intOWVerify()

{

unsignedcharrom_backup[8];

inti,rslt,ld_backup,ldf_backup,lfd_backup;

//keepabackupcopyofthecurrentstate

for(i=0;i

rom_backup[i]=ROM_NO[i];ld_backup=LastDiscrepancy;ldf_backup=LastDeviceFlag;lfd_backup=LastFamilyDiscrepancy;

//setsearchtofindthesamedevice

LastDiscrepancy=64;

LastDeviceFlag=FALSE;

if(OWSearch())

{

//checkifsamedevicefound

rslt=TRUE;

for(i=0;i

{

if(rom_backup[i]!

=ROM_NO[i])

{

rslt=FALSE;

break;

}

}

}

else

rslt=FALSE;

//restorethesearchstate

for(i=0;i

ROM_NO[i]=rom_backup[i];

LastDiscrepancy=ld_backup;

LastDeviceFlag=ldf_backup;

LastFamilyDiscrepancy=lfd_backup;

//returntheresultoftheverify

returnrslt;

}

//

//Setupthesearchtofindthedevicetype'family_code'onthenextcall//toOWNext()ifitispresent.

//

voidOWTargetSetup(unsignedcharfamily_code)

{

inti;

//setthesearchstatetofindSearchFamilytypedevicesROM_NO[0]=family_code;

for(i=1;i

ROM_NO[i]=0;

LastDiscrepancy=64;

LastFamilyDiscrepancy=0;

LastDeviceFlag=FALSE;

}

//

//Setupthesearchtoskipthecurrentdevicetypeonthenextcall

//toOWNext().

//

voidOWFamilySkipSetup()

{

//settheLastdiscrepancytolastfamilydiscrepancyLastDiscrepancy=LastFamilyDiscrepancy;

LastFamilyDiscrepancy=0;

//checkforendoflist

if(LastDiscrepancy==0)LastDeviceFlag=TRUE;

/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1