摘要: 本应用说明描述了一个简单的协议,可以在主机和执行1线通信的远程控制器之间使用。
1线制设备用于设备与主机之间的距离可能超过1线制规格的远程场所。本应用说明描述了一个简单的协议,可以在主机和执行1线通信的远程控制器之间使用。最初创建是为了支持IEEE 1451.4传感器和执行器的智能传感器接口-混合模式通信协议和传感器电子数据表(TEDS)格式标准委员会。
1线制设备用于设备与主机之间的距离可能超过1线制规格的远程场所。
在这种情况下,能够在传感器和数据处理计算机之间有某种通信设备是有用的,它允许来自1-Wire设备的数据以统一和一致的方式有效和透明地传输,例如通过LAN或WAN网络。
本文档的目标是建议如何以一种相对简化的方式,通过在驱动软件中插入传输层,以统一的帧缓冲格式操作,轻松解决这个问题。这个额外的层允许将1线协议软件的不同部分放置在不同的物理位置,并以这种方式扩展了1线概念的多功能性。(为清晰起见,特殊术语、命令或代码以斜体显示。)创建此文档最初是为了支持用于传感器和执行器的智能传感器接口-混合模式通信协议和传感器电子数据表(TEDS)格式标准委员会。
设备的设备内置到远程传感器,通过1-Wire总线和一些单独的仪器,连接到主机应用程序。这些仪器通过不同的通信线路连接在一起,使用不同的通信协议。在这方面,仪器将充当通信中继器,在主机应用程序和1-Wire总线上的设备之间透明地传输数据。
图1所示。多协议场景中的中继器。
仪器(中继器)中的软件应在仪器的使用寿命内保持稳定(>10年),即使新的(未知的)设备的设备连接到1-Wire总线。
应该优化通信速度。这意味着其他通信总线(本例中的总线1和总线2)上的通信事务数量应该最小化,因为这些总线的带宽可能比1- wire总线本身低得多,并且/或者还可以用于与1- wire通信无关的其他通信任务。
所有关于特定1-Wire设备类型的知识都应该与Host程序隔离。中继器不应包含任何设备特定知识。
通信会话应该基于整个缓冲区(而不是单个字节和位),以便最小化中间总线(示例中的总线1和总线2)上的通信开销。
应该为中继器定义一些基本的和设备透明的1-Wire事务,以及相应的缓冲区格式。这几个设备透明事务应该足以与所有类型的1-Wire设备进行通信。
中继器应能处理的最小缓冲大小应明确规定。(假定中继器可能具有非常有限的缓冲能力)。
如果与设备设备的通信需要更大的缓冲区,则应该可以将1线事务拆分为在主机和具有1线连接的中继器之间传输的几个中间缓冲区。中间的通信协议通常会使用自己的格式(例如添加一些报头和尾字节)将1-Wire缓冲帧打包到“信封”中。这对1-Wire通信是透明的,不是本规范的一部分。
中继器中的1线接口不需要处理EPROM编程电压,更高速度的“超速”通信或强上拉电源交付,但其使用应由本规范定义。
假定通过中继器发起的所有通信活动都是从主机应用程序发起的。
1-Wire总线上的透明缓冲事务利用了这样一个事实,即发送和接收可以在位对位的基础上同时完成。(从1线设备接收位帧时,中继器应发送1(1))。
在一个事务之后,中继器中的缓冲区将包含从1-Wire(设备)读取的任何信息。如果需要的话,中继器中的缓冲区以及由此产生的1-Wire事务可以传输回主机。所有缓冲区通信主动由主机采取。
透明缓冲区事务协议在中继器中定义了两个通信缓冲区。
一个入站缓冲区用于接收来自主机的帧,一个出站缓冲区用于构造返回帧。
长度字节 | 单字节和多字节命令数组 |
长度字节 | 单字节和多字节命令结果数组 |
入站帧和出站帧的第一个字节都是长度字节,表示帧中不包括长度字节的字节数。
入站帧可能包含一系列1-Wire命令。解析入站缓冲区中的命令。如果解析产生结果,则将命令和结果放入出站缓冲区中。
如果入站缓冲区的长度为0,则忽略缓冲区,不进行任何处理。
中继器能够处理的入站和出站缓冲区的最小大小是49个字节,包括长度字节。
1-Wire命令有两种类型。单字节1-Wire命令和多字节1-Wire命令。头中第一个字节的MSB位标识它是单字节还是多字节命令。如果它是一个多字节命令,头由两个字节组成,命令字节和定义附加数据字节块长度的字节。
多字节命令 | ||
命令代码,1字节(0xxx xxxx) | Data_length 1字节 | data_bytes |
单字节命令 | ||
命令码,1字节(1xxx xxxx) |
多字节命令响应(指定命令) | ||
命令代码,1字节(0xxx xxxx) | Data_length 1字节 | data_bytes |
单字节命令响应(所有命令) | ||
命令码,1字节(1xxx xxxx) | Return_code 1字节 |
命令总是一个单字节值。如果1-Wire操作产生结果,则总是将该命令从入站缓冲区复制到出站缓冲区。
data_length与多字节命令一起使用的始终是单个字节,其值为属性后面的字节数data_length缓冲区中的字节。使用DATA_xxx命令data_lengthValue也用于区分内部协议寄存器上的读和写操作。对于寄存器,写:data_length不等于0。数据从入站缓冲区复制到命令标识的数据寄存器。没有命令或数据被复制到出站缓冲区。对于寄存器读取,data_length等于0。将命令复制到出站缓冲区。的data_length对于由命令标识的寄存器,将被复制到出站,然后是来自寄存器的数据。
return_code始终是一个单字节值,紧跟出站缓冲区中的单字节命令。
命令名 | 描述 | 代码 |
CMD_ML_RESET | 重置1-Wire上的所有设备,并报告是否有任何设备响应 | 80(十六进制) |
CMD_ML_SEARCH | 使用data__id和DATA_SEARCH_STATE寄存器中指定的当前搜索状态执行1-Wire搜索。 | 81 |
CMD_ML_ACCESS | 使用1-Wire MATCH_ROM命令55十六进制,选择DATA_ID寄存器中指定的当前设备。 | 82 |
CMD_ML_OVERDRIVE_ACCESS | 使用1-Wire MATCH_ROM命令69十六进制选择DATA_ID寄存器中指定的当前设备,该命令同时将设备设置为超速模式。如果中继器端不支持超速模式,该命令将返回RET_CMD_UNKNOWN | 83 |
CMD_RESET | 将中继器端复位为默认状态。出站缓冲区中先前处理过的数据保持不变。 | 84 |
CMD_GETBUF | 按原样返回出站缓冲区。 如果该命令可以正常处理,则不会将命令字节复制到出站缓冲区,并且出站缓冲区的长度保持不变。 如果不能处理此命令,则立即返回CMD_GETBUF命令,通常带有RET_BUSY返回码。这是导致返回出站缓冲区的唯一命令。 当CMD_GETBUF命令出现在入站缓冲区中时,它应该始终是入站缓冲区中的最后一个命令。 如果CMD_GETBUF之后的命令(在下一个入站缓冲区中)不是CMD_GETBUF,则在处理该命令之前清除出站缓冲区。这允许主机多次请求重传出站缓冲区。 | 85 |
CMD_ERROR | 错误的命令。仅在中继器端的出站缓冲区中使用,以向主机发出错误信号。它通常是由于处理多字节命令或中继器端的任何内部错误而导致的错误。如果它发生在入站缓冲区中,则返回状态应为RET_CMD_UNKNOWN。 | 86 |
(保留) | 为进一步扩展该协议而保留的单字节命令。应该返回返回代码RET_CMD_UNKNOWN | 87 - cf |
(特定于供应商的) | 由中继器供应商保留定义的单字节命令。如果没有使用,这些命令应该返回返回代码RET_CMD_UNKNOWN | D0-FF |
命令名 | 描述 | 命令 | 寄存器的大小 |
DATA_ID | 写或读64位1线ID号寄存器。如果写命令的数据长度小于8且大于0,则清除剩余的寄存器字节。 | 00(十六进制) | 8(字节) |
DATA_SEARCH_STATE | 写或读2字节的1线搜索状态寄存器。在写寄存器过程中,内部搜索算法状态被清除。写入第一个寄存器预设last不符点(搜索开始的DATA_ID位索引)。第二个寄存器lastfamily不同点总是通过写来清除。 | 01 | 2 |
DATA_SEARCH_CMD | 写或读1线搜索命令寄存器。这是在CMD_ML_SEARCH命令期间使用的1-Wire命令。 | 02 | 1 |
DATA_MODE | 定义1线总线的选项、速度和电平的写或读寄存器 | 03 | 1 |
DATA_CAPABILITY | 中继器的读1线功能(操作假设入站data_length值为0) | 04 | (1) 恒定值 |
DATA_OUTBOUND_MAX | 以字节为单位读取出站缓冲区的最大长度。(操作假设入站数据长度为0) | 05 | (1) 恒定值 |
DATA_INBOUND_MAX | 以字节为单位读取入站缓冲区的最大长度。(操作假设入站data_length值为0) | 06 | (1) 恒定值 |
DATA_PROTOCOL | 读取协议版本标识为以NUL(/0)结尾的C字符串。当前1.00版本的协议是“ML100”。(操作假设入站data_length值为0) | 07 | (最大20个,包括\0) 恒定值 |
DATA_VENDOR | 读取中继器供应商标识数据作为NUL(/0)终止的C字符串。(操作假设入站data_length值为0) | 08 | (最大20个,包括\0) 恒定值 |
CMD_ML_BIT | 使用提供的每个数据字节的LS位初始化write_read 1-Wire通信位。 | 09 | (na) |
CMD_ML_DATA | 发起1线通信块。data中的第一个字节定义了在称为block_length的1-Wire总线上处理的1-Wire数据字节的总数。1线处理从该字节后面的数据字节开始。如果要处理的数据字节数大于报头block_length-1,则处理的剩余字节等于FF十六进制的入站数据值。 1-Wire处理的结果放在出站寄存器中。 | 0一个 | (na) |
CMD_DELAY | 执行延迟,其长度由附加的数据字节定义。 Data_length为1。 | 0 b | (n / a) |
(保留) | 为进一步扩展此协议规范而保留的多字节命令。 如果中继器端不知道该命令,则将带有返回码RET_CMD_UNKNOWN的CMD_ERROR命令放入出站缓冲区中。 | 0 c-4f | |
(特定于供应商的) | 多字节命令保留给进一步的供应商特定用途。 如果中继器端不知道该命令,则将带有返回码RET_CMD_UNKNOWN的CMD_ERROR命令放入出站缓冲区中。 | 50-7F |
总共:12个RAM寄存器字节
返回代码名称 | 描述 | 返回代码 |
RET_SUCCESS | 命令操作成功 | 00(十六进制) |
RET_END_SEARCH | 设备搜索结束,ID搜索中的最后一个设备是之前找到的设备,搜索状态现在将被重置。 | 01 |
RET_BUSY | 之前的缓冲区尚未被处理。 | 02 |
RET_ERROR | 未指定的错误(停止入站缓冲区处理) | 03 |
RET_NO_DEVICE | 1-Wire上没有设备(停止入站缓冲区处理) | 04 |
RET_ML_SHORTED | 1-Wire出现短路(停止入站缓冲区处理) | 05 |
RET_OUTBOUND_OVERRUN | 出站缓冲区溢出错误(停止入站缓冲区处理) | 06 |
RET_INBOUND_OVERRUN | 入站缓冲区溢出错误(停止入站缓冲区处理) | 07 |
RET_REG_OVERRUN | 数据寄存器溢出错误(停止入站缓冲区处理) | 08 |
RET_END_OF_INBOUND | 入站缓冲区意外结束(停止入站缓冲区处理) | 09 |
RET_READ_ONLY | 尝试写入只读数据寄存器(data_length不为0,将停止入站缓冲区处理) | 0一个 |
RET_WRITE_ONLY | 尝试读取只写数据寄存器(data_length为0,停止入站缓冲区处理) | 0 b |
RET_CMD_UNKNOWN | 命令未知(停止入站缓冲区处理) | 0 c |
(保留) | 为将来对本协议规范的扩展保留 | 从d到f |
(特定于供应商的) | 供应商特定的返回码 | 80到FF |
在主机使用任何特定于供应商的命令之前,应该使用DATA_VENDOR命令来识别所期望的中继器类型。这种预防措施将防止不同供应商之间的命令争用。
入站和出站缓冲区可以按顺序包含多个命令。
入站缓冲区被解析并顺序处理。大多数正在处理的命令将把结果附加到出站缓冲区。因此,出站缓冲区中的命令序列将与入站缓冲区中的命令序列顺序匹配。唯一的例外是当CMD_ERROR插入出站缓冲区时,以及当CMD_GETBUF命令立即返回繁忙状态RET_BUSY时。
当接收到入站缓冲区时,出站缓冲区将被清除,除非入站缓冲区中的第一个命令是CMD_GETBUF,否则会导致(重新)传输出站缓冲区。
如果接收入站缓冲区导致入站缓冲区溢出,则在出站缓冲区中插入CMD_ERROR命令,其状态为RET_INBOUND_OVERRUN。入站缓冲区的其余内容将被忽略。
如果入站缓冲区的处理导致出站缓冲区溢出,则在状态为RET_OUTBOUND_OVERRUN的出站缓冲区中插入当前命令(如果是单字节命令)或CMD_ERROR命令。停止对当前命令的处理,并且停止对入站缓冲区的任何进一步命令处理。
入站也可能由于没有设备的1线条件(RET_NO_DEVICE)或1线总线(RET_ML_SHORTED)短路而停止。未知或不正确的命令将返回代码(ret_ret_overflow, RET_END_OF_INBOUND, RET_READ_ONLY, RET_WRITE_ONLY, RET_CMD_UNKNOWN, ret_outbound_overflow)并停止入站命令处理。任何停止入站命令处理的错误结果都将被视为最终错误消息。
中继器实现应确保在出站缓冲区中始终有一个最终错误消息(CMD_ERROR +错误状态)的位置。如上所述,在将最终错误消息放入出站缓冲区之后,允许中继器中的所有处理停止,直到传输或重置出站缓冲区为止。
如果中继器端检测到连续的错误事件,则在将最终错误消息放入出站缓冲区之后,应该忽略后面的任何错误事件。这种状态一直保持到传输后或通过CMD_ML_RESET命令重置出站缓冲区为止。这确保了错误信息以与从机中的错误信息相同的顺序提供给主机,并且不会丢失或覆盖缓冲区中的先前信息。
当入站缓冲区的处理因错误条件而停止时,将扫描入站缓冲区以查找CMD_GETBUF命令。如果找到,则将出站缓冲区的当前内容发送回主机。如果没有找到CMD_GETBUF,则在接收到另一个入站缓冲区之前不会进行进一步的命令处理。
当接收到CMD_GETBUF命令时,由中继器端传输出站缓冲区。
CMD_GETBUF可以看作是一个“令牌”。当中继器端从主机获得CMD_GETBUF“令牌”时,它被允许发送一次出站缓冲区。对于每个CMD_GETBUF令牌,出站缓冲区只传输一次,并且在收到(和处理)CMD_GETBUF令牌之前,不得开始任何传输。
如果中继器端很忙,CMD_GETBUF“令牌”将立即返回给主机。然后允许主机端尝试再次发送令牌(单总线轮询)或将其提供给其他地方运行的其他低级1线协议(多总线轮询)。
CMD_GETBUF应该始终是入站缓冲区中的最后一个命令(如果不是唯一的命令),因为对入站缓冲区的任何进一步命令解析都将停止。
图2 a。接收入站缓冲区。
图2 b。入站命令处理。
流变量 | 描述 |
cmd | 正在处理的当前命令代码 |
data_length | 如果当前命令是多字节命令,则显示数据字节数 |
data_bytes | 指向多字节命令中数据字节的起始位置的指针 |
返回 | 正在处理的命令的当前结果字节 |
入站 | 包含来自主机的传入命令列表的缓冲区 |
出站 | 缓冲区,其中包含由入站命令返回给主机的传出响应 |
马克斯 | 入站缓冲区的最大大小,例如DATA_INBOUND_MAX |
last_cmd | 最后计算的命令 |
last_cmd_return | 最后计算的命令的结果 |
图2 c。出站空间验证。
CMD_ML_RESET命令重置所有1-Wire设备,并检测是否至少存在一个设备。如果设备不存在,则将返回代码RET_NO_DEVICE放置在出站缓冲区中,并停止入站缓冲区处理。该命令使用DATA_MODE数据寄存器来表示复位信号发送到1-Wire的通信速度。
示例:复位1-Wire上的设备
出站CMD_ML_RESET <返回byte>
图3。处理命令CMD_ML_RESET。
CMD_ML_SEARCH命令使用中继器中的当前搜索状态执行搜索,以查找1-Wire上的“下一个”设备。该命令在搜索之前不做1线复位。在大多数情况下,CMD_ML_RESET命令应该在CMD_ML_SEARCH之前使用。该命令使用中继器数据寄存器DATA_SEARCH_STATE和DATA_ID中的搜索状态信息。要重置搜索以查找1-Wire上的“第一个”设备,请将DATA_SEARCH_STATE数据寄存器中的两个字节设置为0。请参阅DATA_SEARCH_STATE命令描述,了解有关其使用的更多详细信息。该命令使用DATA_MODE数据寄存器来表示在1-Wire上执行搜索时的通信速度。关于1线搜索算法的详细描述请参见附录。
示例:搜索1-Wire上的第一个设备。重置搜索状态,然后执行搜索。读取发现设备的ID。
2><0,0>CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节的ROM>
示例:在1-Wire上搜索后面两个设备,并返回这些设备的ID。
CMD_ML_SEARCH DATA_ID <0>CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节的ROM>CMD_ML_RESET;返回字节>data__id <8><8字节的ROM>
图3 b。处理命令CMD_ML_SEARCH。
CMD_ML_ACCESS命令选择ID号在数据寄存器DATA_ID中的设备。通过使用'Match ROM'命令来选择1-Wire设备。该命令首先使用CMD_ML_RESET命令重置行,发送55十六进制的'Match ROM'命令,然后从DATA_ID发送8字节的ID。
此时,1-Wire设备将被“访问”。然后准备好执行设备特定的命令。如果CMD_ML_RESET失败,该命令返回返回码RET_NO_DEVICE,如果检测到任何其他问题,则返回返回码RET_ML_SHORTED。如果成功,返回码是RET_SUCCESS。
该命令使用DATA_MODE数据寄存器中的Speed位来选择在1-Wire上执行访问的通信速度。
示例:设置当前设备ID并选择该设备
inbound DATA_ID <8><8字节的ID>CMD_ML_ACCESS <返回字节>
图3 c。处理命令CMD_ML_ACCESS。
CMD_ML_OVERDRIVE_ACCESS命令选择ID号在数据寄存器DATA_ID中的设备,同时将设备和中继器设置为Overdrive通信速度。这是通过首先清除DATA_MODE寄存器中的speed位来强制中继器进入正常速度来实现的。然后使用CMD_ML_RESET命令以正常速度重置1-Wire。
如果CMD_ML_RESET检测到设备存在,那么'Overdrive Match ROM'命令(69十六进制)也以正常速度发送。此时,设置DATA_MODE寄存器中的Speed位,迫使中继器进入Overdrive通信速度。DATA_ID中的8字节ID以Overdrive速度传输。该命令完成后,Speed位仍然设置在Overdrive中。如果CMD_ML_RESET失败,该命令返回返回码RET_NO_DEVICE,如果检测到任何其他问题,则返回返回码RET_ML_SHORTED。如果成功,返回码是RET_SUCCESS。
注意,要使该命令运行,中继器必须具有超速能力(参见DATA_CAPABILITY命令),并且当前ID为data__id的设备必须具有超速能力。如果中继器不支持超速模式,则使用此命令将导致RET_CMD_UNKNOWN。
示例:设置当前设备ID,然后选择该设备并将其和中继器放入Overdrive
inbound DATA_ID <8><8字节的ID>CMD_ML_OVERDRIVE_ACCESS DATA_MODE <00>输出CMD_ML_OVERDRIVE_ACCESS <DATA_MODE <01><01 (Overdrive)>
图3 d。处理命令CMD_ML_OVERDRIVE_ACCESS。
中继器重置重置中继器并使其处于默认状态。出站缓冲区中尚未被主机读取的任何数据内容将在CMD_RESET之后丢失。关于CMD_RESET设置的默认值,请参见表4。
示例:将中继器的状态恢复为缺省状态
入站CMD_RESET <出站CMD_RESET <
中继器状态 | 默认值 |
DATA_ID | 0, 0, 0, 0, 0, 0, 0, 0 |
DATA_SEARCH_STATE | 0,0 |
DATA_SEARCH_CMD | F0十六进制 |
DATA_MODE | 0(正常速度) |
DATA_CAPABILITY | 中继器的具体 |
DATA_OUTBOUND_MAX | 特定于中继器,最少49字节 |
DATA_INBOUND_MAX | 特定于中继器,最少49字节 |
DATA_PROTOCOL | 以“ML100”为规格 |
DATA_VENDOR | 中继器的具体 |
出站长度 | 0 |
last_cmd | CMD_ML_RESET (80hex) |
last_cmd_return | RET_SUCCESS (00 hex) |
LastDeviceFlag | 0 |
图3 e。处理命令CMD_RESET。
CMD_GETBUF命令将出站缓冲区的当前内容发送回主机。入站缓冲区中的任何其他命令都将被忽略。因此,CMD_GETBUF命令应该始终是入站缓冲区中的最后一个命令。
在处理CMD_GETBUF之后,出站缓冲区保持不变。因此,主机总是可以通过发送一个新的CMD_GETBUF命令请求重新传输出站缓冲区(如果在之前的传输过程中出现了错误)。
在处理CMD_GETBUF命令之后的入站缓冲区中的命令将在处理新命令之前重置出站缓冲区。CMD_GETBUF的详细信息请参见《命令处理描述》。
图3 f。处理命令CMD_GETBUF。
error命令仅在出站缓冲区中用作将错误传递回主机的一种方式。它通常是由处理多字节命令引起的错误。如果该命令发生在入站缓冲区中,则将其复制到出站缓冲区,返回状态为RET_CMD_UNKNOWN。
DATA_ID命令允许在中继器中读取和写入8字节的设备ID寄存器。这个寄存器包含在1-Wire上找到的最后一个设备的ID。该寄存器在当前搜索中用于查找1-Wire上的“下一个”设备,也是该搜索结果的位置。长度为8字节,默认值为全0。
图3g流程图显示读取或写入中继器寄存器的命令的一般流程。请注意,有些中继器寄存器只能读(只读,长度字节为零),有些只能写(只写,长度字节非零)。
图3 g。处理数据寄存器命令。
DATA_SEARCH_STATE命令允许对保存上次搜索计数的双字节寄存器进行重新读取和写入,并用于查找当前搜索中的“下一个”设备。这两个字节可以与DATA_ID一起设置,以实现对特定家族代码的目标搜索。默认值为全0。这个搜索状态中的第一个字节是LastDiscrepancy号。这表示上次搜索时采用的搜索路径。这个数字是需要的,以便在之前的搜索停止的地方继续搜索。第二个字节是lastfamilydifference,它指示在DATA_ID的键族代码字节内采取的最后搜索方向。搜索状态中的第三个字节是一个标志LastDeviceFlag,它表示最后一次搜索是1-Wire搜索中的最后一个设备。LastDeviceFlag位于中继器内部,在写入DATA_SEARCH_STATE时自动清除。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。关于1线搜索算法的详细描述请参见附录。
字节变量名 | 描述 | 字节数 |
LastDiscrepancy | DATA_ID寄存器的位索引。标识(下一个)搜索差异检查应从哪位开始。例如,值9是否会导致下一个搜索差异从DATA_ID寄存器中的第9位开始。因此,搜索仅限于由DATA_ID(设备族代码)的前8位标识的设备。默认值为0(搜索所有设备)。 | 0 |
LastFamilyDiscrepancy | DATA_ID寄存器的位索引。在搜索期间更新它以识别DATA_ID中的第一个位,其中在两个1-Wire设备之间进行了选择。它只在DATA_ID的前8位(设备族位)内更新。如果下一个搜索从这个位索引开始,那么搜索将是下一个设备族中的设备。有关搜索算法如何更新此值的描述,请参见附录。 | 1 |
通过使用CMD_ML_SEARCH命令和操纵DATA_SEARCH_STATE和DATA_ID寄存器值,可以执行五种类型的操作。这些操作涉及发现和验证1-Wire设备的ID。1线搜索算法的解释见应用说明187:1线搜索算法。
“FIRST”操作是在1-Wire上搜索第一个设备。这是通过将DATA_SEARCH_STATE的所有三个字节设置为零并调用CMD_ML_SEARCH来实现的。然后可以从DATA_ID寄存器中读取生成的ID号。如果1-Wire上没有设备,CMD_ML_RESET将返回RET_NO_DEVICE。如果在搜索过程中发生错误,那么CMD_ML_SEARCH将返回RET_END_SEARCH。
示例:找到1-Wire上的第一个设备并读取ID。
2><0,0>CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节ID>
“NEXT”操作是在1-Wire上搜索下一个设备。此搜索通常在“FIRST”操作或另一个“NEXT”操作之后执行。这是通过保持DATA_SEARCH_STATE的两个字节与之前的搜索保持不变并调用CMD_ML_SEARCH来实现的。然后可以从DATA_ID寄存器中读取生成的ID号。如果最后一次搜索是1-Wire上的最后一个设备,或者在搜索过程中发生了错误,那么CMD_ML_SEARCH命令将返回RET_END_SEARCH。
示例:找到1-Wire上的下一个设备并读取ID。
CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节内存>
“TARGET”操作是一种预先设置搜索状态的方法,以便首先查找特定的家族类型。每个1-Wire设备都有一个一个字节的“家族代码”嵌入在ID号中。这个“家族代码”允许1-Wire主人知道这个设备能够进行什么操作。如果1-Wire上有多个设备,通常的做法是只针对感兴趣的设备族进行搜索。将DATA_SEARCH_STATE设置为09,000(十六进制)。这将LastDiscrepancy设置为超出家族代码。然后将所需的族代码字节设置为DATA_ID寄存器的第一个字节。
现在调用CMD_ML_SEARCH函数,然后在DATA_ID寄存器中读取结果ID。请注意,如果当前1-Wire上没有所需系列的设备,则将找到另一种类型,因此应检查DATA_ID中的系列代码。
示例:以一个家庭类型为目标,在1-Wire上找到该类型的第一个设备,并读取其ID。
2>< 09000 >data__id <1><CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节的ROM>DATA_SEARCH_STATE <2><2字节搜索状态>
“SKIP”操作是跳过在1-Wire上先前搜索中发现的具有家族类型的所有设备。该操作必须经过查询后才能执行。这是通过将lastfamily不同点(字节1)复制到DATA_SEARCH_STATE的last不同点(字节0)中,然后使用CMD_ML_SEARCH执行另一次搜索来实现的。下面的示例假设我们已经执行了一次搜索,并且知道DATA_SEARCH_STATE的内容。
示例:跳过上次搜索中找到的具有家族类型的所有1-Wire设备,并找到下一个不同类型的设备并读取其ID。
lastfamilydescreancy, 00>CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节的ROM>
“验证”操作验证具有已知ID的设备当前是否连接到1-Wire。它是通过提供ID并对该ID进行目标搜索以验证它是否存在来完成的。首先,将DATA_ID寄存器设置为已知的ID。然后将DATA_SEARCH_STATE中的LastDiscrepancy(字节0)设置为64(40十六进制)。使用CMD_ML_SEARCH执行搜索操作,然后读取DATA_ID结果。如果搜索成功并且DATA_ID仍然是正在搜索的ID,则设备当前在1-Wire上。
示例:设置ID并验证该1-Wire设备当前是否连接。
2>< 40000 >DATA_ID <8><待验证设备的ID >CMD_ML_SEARCH DATA_ID <0>输出CMD_ML_RESET <返回字节>data__id <8><8字节的ROM>
DATA_SEARCH_CMD命令允许重写和写入包含搜索操作期间使用的命令的单字节寄存器。目前两个有效的命令是F0(十六进制),用于正常搜索和EC(十六进制),仅用于查找报警设备。长度为1字节,默认值为F0(十六进制)。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。
DATA_MODE命令允许对一个字节寄存器进行读取和写入,该寄存器包含中继器上1-Wire的当前速度和电平模式。表6描述了预定义的模式位标志。写入此寄存器将导致1-Wire状态的立即改变,以便可以在命令块的中间操作该模式。如果中继器不具备执行位标志中指定的操作的能力,则不会产生任何效果。请查阅data_capability数据寄存器。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。
模式位名 | 描述 | 一些数量 |
速度 | 0为正常速度,1为超速。 | 0 |
PowerDelivery | 正常5伏上拉0,强上拉1 | 1 |
ProgramVoltage | 12伏编程电压0时禁用,1时使能(PowerDelivery和PowerDown应禁用) | 2 |
PowerDown | 用于给1线总线下电的低阻抗零电压(应禁用PowerDelivery和ProgramVoltage) | 3. |
(保留) | 为将来对本协议规范的扩展保留。使用0,0作为默认值。 | 4、5 |
(特定于供应商的 | 供应商特定的模式标志。在设置这些位之前,主机应该使用DATA_VENDOR命令来确定所期望的中继器类型是否存在。这一预防措施将防止不同中继器供应商之间的功能冲突。使用0,0作为默认值。 | 6、7 |
DATA_CAPABILITY命令允许重新生成一个字节寄存器,其中包含用于1线通信的中继器的能力,功率传输和速度。表7描述了预定义的特征位标志。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。注意,DATA_CAPABILITY寄存器是只读的。
能力位名称 | 描述 | 一些数量 |
Overdrive_C | 超速速度为1,只有正常速度为0 | 0 |
PowerDelivery_C | 强5伏上拉电源交付可用,如果1,只有正常通信上拉可用,如果0 | 1 |
ProgramVoltage_C | 12伏编程电压1可用,0不可用 | 2 |
PowerDown_C | 低阻抗零电压1时可用,0时不可用 | 3. |
(保留) | 为将来对本协议规范的扩展保留 | 4、5 |
(特定于供应商的 | 厂商特定模式标志 | 6、7 |
DATA_OUTBOUND_MAX命令允许重新生成一个字节寄存器,其中包含出站缓冲区的预定义最大数据长度(以字节为单位)。出站缓冲区的最小大小是48字节,不包括长度字节。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。注意,DATA_OUTBOUND_MAX寄存器是只读的。
请注意,由于出站缓冲区中应该始终为最终错误消息(两个字节)留出空间,因此在1-Wire通信期间可以依赖的有效大小比DATA_OUTBOUND_MAX小两个字节。
DATA_INBOUND_MAX命令允许重新生成包含入站缓冲区预定义的最大数据长度(以字节为单位)的单字节寄存器。入站缓冲区的最小大小是48字节,不包括长度字节。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。注意,DATA_INBOUND_MAX寄存器是只读的。
DATA_PROTOCOL命令允许删除以零结尾的字符串,该字符串表示协议名称和版本。本规范描述了1.00版本,由DATA_PROTOCOL字符串“ML100”表示。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。注意,DATA_PROTOCOL寄存器是只读的。这个C-string的最大长度是20字节,包括0结束。
DATA_VENDOR命令允许重新生成代表供应商名称的以零结尾的字符串。这用于识别特定于供应商的命令和模式。图3g流程图显示读取或写入中继器寄存器的命令的一般流程。注意,DATA_VENDOR寄存器是只读的。这个C-string的最大长度是20字节,包括0结束。
CMD_ML_BIT提供与1线的位级通信。CMD_ML_BIT是一个多字节命令,因此它提供了一个大于0的长度字节和一个或多个数据字节。提供的每个数据字节代表一个通信位。每个数据字节的最低有效位被发送到1-Wire,该位通信的结果以多字节读取格式放入出站缓冲区中的一个字节中。该命令使用DATA_MODE数据寄存器来表示在1-Wire上执行位操作的通信速度。
示例:手动执行搜索算法的前两部分
CMD_ML_DATA <2><length=1><CMD_ML_BIT & lt; 2祝辞& lt; 01, 01祝辞输出CMD_ML_RESET <CMD_ML_DATA & lt; 1祝辞& lt; 0 f>CMD_ML_BIT <2><
图3 h。处理命令CMD_ML_BIT。
CMD_ML_DATA提供与1-Wire的块级通信。CMD_ML_BLOCK是一个多字节命令,因此它提供了一个大于0的长度字节和一个或多个数据字节。第一个数据字节以字节为单位定义了1-Wire块的总长度。块长度之后的数据字节被发送到1-Wire,该字节通信的结果以多字节读格式放入出站缓冲区中的一个字节中。如果块长度大于所提供的数据字节数,则块长度的其余部分作为FF十六进制字节处理。这通常是来自1-Wire设备的读取操作。该命令使用DATA_MODE数据寄存器来表示在1-Wire上执行块操作的通信速度。
示例:从ID号为DATA_ID的1-Wire内存设备中读取前32个字节的内存。
CMD_ML_DATA;3><length=34><输出CMD_ML_ACCESS <返回字节>CMD_ML_DATA <34><2字节写数据回显和32字节读数据回显>
图3。处理命令CMD_ML_DATA。
CMD_DELAY命令根据所提供的一个数据字节中指定的时间暂停入站缓冲区解析的执行。延迟命令至少应当延迟规定的数额。然而,它可能会持续更长时间。该命令通常与DATA_MODE命令一起用于计时编程和1-Wire类型的电源交付功能。这个单字节值通过向位值提供以下含义来提供广泛的延迟时间范围。最高有效位是一个标志,当设置时表示值将以毫秒为单位,当不设置时表示值以微秒为单位。下面的公式2^(5+X)将使用X表示的低3位来给出表8中显示的值。
示例:在1线上发送EPROM编程脉冲。
入站DATA_MODE <04(十六进制)(12伏脉冲开)>CMD_DELAY <1><04 (hex) 512微秒)>DATA_MODE <00 (hex) (12 colt脉冲关闭)>出站
延迟字节 | 时间 |
00(十六进制) | 32个微秒 |
01 | 64 |
02 | 128 |
03 | 256 |
04 | 512 |
05 | 1024 |
06 | 2048 |
07 | 4096 |
80 | 32个毫秒 |
81 | 64 |
82 | 128 |
83 | 256 |
84 | 512 |
85 | 1024 |
86 | 2048 |
87 | 4096 |
图3 j。处理命令CMD_DELAY。
(1)“与达拉斯半导体MicroLAN设备在远程位置传感器的通信”。David Smiczek和Jan Kristoffersen, J D0 rgen Bække, 1998年8月;IEEE 1451.4
(2)该协议的示例'C'实现:在这里下载
(3) DS2430A不再推荐用于新设计。
社群二维码
关注“华强商城“微信公众号
Copyright 2010-2023 hqbuy.com,Inc.All right reserved. 服务热线:400-830-6691 粤ICP备05106676号 经营许可证:粤B2-20210308