应用笔记 159

iButton®应用中通过软件方法实现可靠的1-Wire®通信


摘要 : 1-Wire器件利用一条数据线和地参考端进行通信。使用不锈钢iButton封装的1-Wire器件时,协议还对处理断续连接(“接触”)方式做出了特殊规定。该应用笔记讨论了在实现高度可靠的iButton设计中可以采用的技术和注意事项,以保证数据完整性。读者应首先熟悉1-Wire总线的通信协议和利用微控制器产生1-Wire通信时序的方法。本文讨论的内容主要关注的是在连接不可靠的环境下的应用,但也提出了几种改善1-Wire硬件可靠性设计的方案。

引言

1-Wire器件利用一条数据线和地参考端进行通信。1-Wire协议配合一些附加的内嵌功能使得iButton非常适合处理需要断续连接(“接触”)的应用。当iButton用于高度安全的认证或支付交易时,高可靠性通信非常重要。

通用的1-Wire器件通信通常包括:搜索(识别总线上的器件)、读器件识别码(网络地址、注册码、64位唯一ID、64位光刻ROM)、读器件数据或状态、写存储器或控制数据等功能。有些情况下,软件很容易检测到通信失败并加以修正。比如,读取时发生错误时,软件会尝试重新读取iButton,或者由用户移走并重新加载iButton启动一次新的交易。这些修正操作通常只会引起小的延时或给用户带来稍许麻烦。

但是,向iButton器件写数据时情况要复杂得多。如果在回读数据进行验证之前iButton发生故障,用户甚至不知道数据出现写错误。如果写数据时发生错误,可能将没有机会重新写入。因此,失败的写操作会导致非常严重的后果。例如,当iButton内部存储货币数据时,借方(买方)在每次购买时都要向iButton中写入改变后的货币数量。如果数据更新时发生任何错误,都会破坏iButton的数据,用户可能丢失他们全部的货币余额。

通过断续连接实现1-Wire通信的软件设计必须经过周密的设计,以便在发生故障时能够重新操作。软件开发人员必须考虑在操作失败时可能发生的任何状况。快速检测到故障要比在随后作出快速的系统响应更重要,能够降低错误地更新(覆盖) iButton数据的危险。这种快速检测能够在技术上提高用户的信心。任何情况下,客户的满意度都至关重要,建议通过一些附加步骤提高1-Wire通信的可靠性。

故障机制

1-Wire总线采取线或配置,总线的空闲状态为逻辑高电平。通信时,1-Wire总线被主机或从机器件(iButton)的低阻驱动器拉低,然后通过主机提供的弱上拉电流返回高电平。除了由主机启动通信外,总线上的iButton器件产生的在线脉冲以及iButton与探头的错误连接造成的短路也会将总线拉低。

外部干扰源可能通过总线短路将总线状态从逻辑1变为逻辑0;如果干扰源有足够的能量克服产生0位的低阻驱动,则可将总线上的逻辑0变为逻辑1。由此可见,大多数错误会将数据从逻辑1变为逻辑0。当从机返回0时如果断开触点,主机将读到逻辑1。而且,从机器件可能将注入到1-Wire总线的任意极性的噪声脉冲当作一个新的时隙,造成后续的数据位与主机不同步。程序开发人员应该预料到所有可能发生的错误位,如位反相、位丢失、增加位以及短路。在iButton应用中,应该时钟假设总线不可靠,采取一切预防措施确保有效的数据通信。

iButton提供的故障检测/预防措施

循环冗余校验(CRC)是所有1-Wire和iButton器件的故障检测方法之一。8位CRC作为每个器件认证码的一部分,用于验证无差错传输。存储器iButton通常内置16位CRC发生器,用于从器件读操作中的数据保护。1-Wire文件系统(见应用笔记114:“1-Wire File Structure”)在每个数据记录的最后都附带16位CRC。计算CRC时,CRC发生器预先加载页码。如果选定的存储器页地址在传输过程中出现错误,访问错误的页码时CRC校验失败。

尽管CRC是检查位错误的强大工具,它们仍然存在一些缺陷:全0的CRC计算结果为0。这意味着总线短路(返回全0)时会给出一个有效的CRC结果,而该数据实际是完全错误的。因此,必须采用其它检测或冗余机制,例如验证识别码中第一字节家族码的有效性。为了避免全0 CRC校验问题,在iButton器件和数据结构中通常采用位取反的CRC校验。

为了避免写存储器时数据遭到破坏,iButton存储器有一个暂存器用作临时存储区。一旦数据写入暂存器并对读回的数据校验后确认没有错误,数据可以不间断地转移到目标地址。从暂存器到目标地址的数据转移安全性依赖于存储器技术,详细情况请参考下述NVSRAM的可靠写操作EEPROM的可靠写操作部分。

通信过程

iButton的写操作过程可以划分成以下几个阶段:

Communication Stage Challenges to Address
Initial contact of iButton and probe Contact bounce
Generating time slots to read device identification number(s) Shorts and intermittent contact
Maintaining a list of devices present on the bus Contact bounce; multiple devices on the bus; devices coming and going
Selecting (addressing) a particular device Devices coming and going
Reading from the selected device The device may no longer be on the bus
Writing to the selected device Verification of write success; the device may no longer be on the bus

软件开发人员可以利用以下工具和方法提高数据传输的可靠性:
  • 写时隙读回(总是)
  • 器件识别码的CRC校验(总是)
  • 验证家族码的有效性(总是)
  • 对写入数据进行多次(冗余)读取和回读验证(总是)
  • 内嵌在数据记录器中的CRC-16校验(iButton存储器)
  • 器件产生CRC-16校验(某些iButton存储器)
  • 货币交易中对数据和器件识别码进行加密认证

以下内容详细说明在不同通信阶段如何使用这些工具。

提高通信可靠性

系统中断

为消除内部故障(例如:系统软件设计引起的偶然错误),正确地处理系统中断非常关键。对建立低电平1-Wire的子程序进行仔细检查,以确保在关键时隙的操作中不会发生中断。如果在探头上使用了iButton固定器进行测试(例如:消除了所有外部故障源),应用软件不需要重试操作。只有证实了这一点,软件开发人员才能将注意力转向故障处理的方法。

触点抖动

为了测量触点抖动,在1-Wire读取探头(通过1kΩ电阻上拉到5V)插入iButton进行实验。图1为示波器对重复接触100次进行采样并对采样值取平均的结果。从图中可以看出,探头和iButton的电接触在最初大约12ms内不稳定。本次试验中,40%以上的iButton在建立接触后的6ms内连接仍不稳定。图2所示波形为一次iButton与探头接触的触点抖动情况。注意,本例中触点抖动在接触后的最初4ms至6ms非常严重。

图1. 将iButton与探头接触100次,然后对采样值取平均的抖动结果。
图1. 将iButton与探头接触100次,然后对采样值取平均的抖动结果。

图2. 一次iButton接触的抖动测试结果
图2. 一次iButton接触的抖动测试结果

iButton连接到读取器(探头)时,将产生一个60µs至240µs的在线脉冲。读取器以每秒17000次(大约60µs一次)或更高的采样速率测试1-Wire总线的状态,以检测有效的在线脉冲。一旦读取器检测到iButton与探头的连接,它通常会尝试读取器件的识别码。在标准速率下完成ROM序列号的读操作需要大约6ms。程序在检测到iButton后如果立即读取识别码可够会导致操作失败,为了保证操作的成功,最好等待10ms,然后进行多次复位/在线检测,随后重复读ROM时序,这些操作对于可靠读取识别码非常必要。

短路和开路

除了使用硬币或金属条蓄意破坏外,典型的短路故障发生在iButton置于iButton探头的过程中,iButton的数据线触点误将探头的数据线连接到地触点。这种短路的持续时间通常在几毫秒到一秒,甚至更长时间。虽然短路不会损坏总线上的1-Wire器件,但会造成通信复位,因此,将1-Wire总线的数据速率复位到标准速率。如果主机运行在高速速率,而且没有意识到发生短路,随后的高速通信就会失败。对iButton而言,失效的连接相当于短路;任何情况下,数据和GND之间都不存在电压。由此可见,iButton和探头断开时也有可能复位到标准速率。

执行短路检测的最佳时机是总线复位或者是在产生时隙的子程序中。检测短路应该在总线初始化复位或时隙操作将总线驱动至低电平之前完成,例如,在总线有足够时间从前期的低电平脉冲恢复时。如果总线从低电平释放后马上进行短路检测,由于电缆、探头以及iButton的总线电容的影响,电压可能还没上升到有效的高电平。极端情况下,几微秒的上升时间是允许的,需要特别注意总线复位子程序。为了区别短路与在线脉冲,在线检测窗口期间必须多次检测总线的逻辑电平。在60µs到240µs有效在线脉冲之后,总线会返回逻辑高电平;如果短路,总线将在很长时间内保持逻辑0。

产生时隙

1-Wire是依据时隙进行通信的,时隙包括写时隙和读时隙,每个时隙传输一位。对于多数器件,读时隙恰好也是写1时隙,响应为0时从机器件将1转变为0。典型的产生时隙的子程序同时执行读、写功能。这样的时隙子程序(见图3)包括以下九个步骤,时间值参考标准速率。
  1. 将总线拉低,启动一次时隙。
  2. 等待6µs。
  3. 输出将要写入总线的位。如果是1,则释放总线,允许返回高电平;如果是0,则继续使保持总线为低电平。
  4. 等待9µs。
  5. 时隙开始后的15µs采样总线电平(低电平 = 0,高电平 = 1)。
  6. 等待45µs。
  7. 时隙开始后的60µs允许总线浮空,在进程中终止任何写0操作。
  8. 等待10µs总线恢复时间。
  9. 返回采样位。
图3. 创建1-Wire时隙,数字对应于上述步骤。
图3. 创建1-Wire时隙,数字对应于上述步骤。

每次向总线写入一位,总线状态也被读回并返回给调用的子程序。通过写一个1并根据需要允许从机将1更改为0,可以实现读操作。因此,使用一个子程序即可很好地进行读、写操作。字节操作子程序只是简单地调用八次位操作,将字节作为返回结果。

写操作期间读回数据还有另外一个益处:它能反映故障状态,例如:总线短路、新增器件产生的所不希望的在线脉冲、噪声脉冲或者是与主机失去同步的从机发出的0位。因此,利用软件比较写入总线的数据和返回数据有助于改善通信的可靠性。这种比较仅适用于对1-Wire从机(iButton)的写操作。读操作期间,读取数据可以自然地区分出全1状态。

集成1-Wire主机DS2480BDS2490DS2482同样支持写操作期间的读功能。PC应用中可能受端口驱动器的限制,可能在全部命令传输完成后才能对故障作出响应。

获取器件识别码

由于iButton触点的连接不可靠,监测通信错误并尽可能早地发现故障非常重要。这种条件下能够允许软件及时启动重试功能,节约时间并改善系统性能。

iButton器件接入探头并随后接收到一次总线复位时,器件产生在线应答脉冲。1-Wire主机(微控制器)可以利用在线脉冲或总线短路等方式产生一次中断,调用适当的程序处理iButton接入网络的状况。在电池供电应用中,在线脉冲可以首先唤醒处于休眠模式的微处理器,然后调用器件接入子程序。另外,读取器可能只进行简单的轮询操作,或重复发送复位脉冲并监测在线应答脉冲的出现,获取器件挂接到总线上的信息。然而,轮询方式只适合总线上仅挂接一个iButton的系统。如果不满足这一条件,需要采用更细致的操作,详细信息请参考总线挂接多器件情况下的系统维护部分。

如果主机已经检测到探头上iButton的在线脉冲,有两种方法可以获得器件的识别码:读ROM和搜索ROM操作。

读ROM采用Read ROM命令。当总线上只有一个器件时这种方法可以得到有效结果。验证是否正确读取数据的关键是识别码之后的CRC。由于临时的接触不上或短路造成误码,读取的CRC数据与主机计算的CRC不一致,表明读操作不成功。当探头上没有iButton时执行Read ROM命令将返回八个字节的FFh作为识别码,CRC可以检查出这种错误。当探头短路时执行Read ROM命令将得到8个字节的00h作为识别码。这种情况下,CRC检测失效。然而,由于已经知道没有指定00h的家族码,可认为数据无效。由于出现误码时有1/256的概率得到有效的CRC,建议再次读取识别码,并对两次读取结果进行比较,判断它们是否一致。这样就能确保读数据时不发生错误。

搜索ROM采用Search ROM命令,该命令通过交互过程读取识别码。Search ROM采用二元搜索技术,iButton需要进行超过192个时隙的双向通信。采用这种方法,断路、短路以及同步丢失等造成的位错误可以很容易地检测出来。一次Search ROM花费的时间比两次Read ROM 花费的时间稍长。即使没有进行CRC校验,成功地执行一次Search ROM可以更可靠地证明器件的存在并为后续的通信做好准备。关于使用Search ROM技术的详细信息,请参考应用笔记187:“1-Wire搜索算法”。

总线挂接多器件情况下的系统维护

许多应用需要可靠检测iButton连接总线或脱离总线。为了检测器件的连接和脱离,需要一个列表记录已经连接到总线上的器件和一些管理信息。器件管理信息之一称为“年龄”。年龄信息用于去抖并判断器件是否已经脱离总线。去抖能够减少由于读错误造成的连接/脱离总线的错误报告。检测连接和脱离总线可以采用以下算法:
  1. 总线利用Search ROM连续扫描以便发现每个器件的识别码。如果没有任何错误,一次扫描周期需要的Search ROM操作与总线上挂接的器件数相同。
  2. 检测到器件后,参考器件列表可确定器件以前是否被查找到。如果器件并不在列表中,则断定为新增加到总线上的器件,在表格中增加一个器件,对这个器件报告为新连接的器件。
  3. 当向表中增加一个新器件或刚发现器件已经处于列表时,该器件的“年龄”数据被置为“n” (n为一个数字,例如5)。
  4. 在新的扫描周期开始之前,表格中的所有年龄信息被递减。如果年龄值递减到零,说明在n次扫描中没有被发现,从表格中删除相应记录,报告器件脱离总线。
采用这种方案时,每个器件需要9个字节的记录表。该表格必须足够大,以便存储总线可容纳的所有器件的记录。

为了提高连接/脱离总线检测的可靠性,测试家族码的有效性、检测有效的CRC 、标记新的暂时连接都是必要步骤,扩展算法类似于以下操作:

  1. 总线利用Search ROM连续扫描以便发现每个器件的识别码。如果没有任何错误,一次扫描周期需要的Search ROM操作与总线上挂接的器件数相同。
  2. 检测到器件后,检测识别码为非零的家族码和CRC校验的有效性。
  3. 通过在器件表中查找家族码有效、CRC校验有效的识别码,确定该器件在之前的扫描周期中是否已经被发现。
  4. 如果列表中没有该器件,则为新的连接,将器件添加到器件列表内。年龄数据设置为3,标记为新的暂时连接。
  5. 如果器件已经存在于列表,并标志为暂时连接,则年龄值加2。如果年龄值大于3,则将年龄字节设置为n;清除暂时连接标志;报告连接事件。
  6. 如果器件已经存在于列表中并且没有暂时连接标志,则年龄值递增1,但不能超过n。
  7. 在新的扫描周期开始前,总线没有短路,表中所有器件的年龄信息减1。如果年龄值为零,说明在n个扫描周期内没有发现该器件,从表中移除该器件;如果器件没有暂时连接标志,则报告为脱离总线。
当报告一次连接时,在两次连续扫描中都必须发现该器件。报告一次脱离总线时,在n个连续扫描周期内必须都没有发现该器件。如果总线运行良好,没有记录暂时连接标志,年龄值都等于n。如果某个周期偶尔丢失器件,其年龄值小于n。该算法已经过验证,是最为可靠的报告1-Wire总线连接、脱离状态的方法。如果检测到1-Wire总线短路,则暂停连接/脱离总线算法,直到短路故障解除。除了这种情况,所有器件在检测到短路现象时都将标示为脱离总线。

对器件的可靠寻址

一旦新连接到探头的器件识别码通过正确验证,该数据将用于器件选择,参与后续的通信操作。如果只有一个器件挂接在总线上,可以执行Skip ROM命令来代替Match ROM命令。并不建议这种做法,因为之前确认的器件可能只是脱离了总线,也可能不同器件正在连接到总线上。因此,在开始每个事务之前至少使用Match ROM命令非常必要。

除了Match ROM,还可以使用另一种称为“Strong Access”的命令寻址1-Wire 器件。Strong Access利用Search ROM功能,整个过程中的每一位都预先定向。换句话说,如果搜索中检测到的器件恰好是预计查找的器件。最终结果与执行Match ROM命令的结果相同,但Search ROM过程要求从器件获得128个正确的反馈位,确保寻址器件可靠存在。由于丢失器件不能返回正确的响应,Search ROM算法在经过几位时间即可发现器件丢失。

对于具体应用,判断Match ROM或Search ROM是否为正确的选择,必须知道系统对这两种操作的响应。标准速度下执行Match ROM命令大约花费5.6ms (高速模式下为0.7ms);执行Search ROM大约需要14ms (高速模式下为1.7ms)。对于需要10次访问处理一项事务的系统—例如,在标准速度下,Strong Access会达到84ms—用户可能无法接受这么长的时间。新的1-Wire器件支持称为“Resume”的ROM功能命令。该命令和Skip ROM占用的时间相同。但是能够最大程度地保证器件响应后续的存储器命令或控制功能命令。能够降低目标器件脱离总线时意外地删除数据的风险。通常,如果用户对系统响应时间要求非常严格,可以考虑采用高速模式,详细信息请参考1-Wire速度考虑部分。

从器件可靠读取

一旦器件被可靠寻址,主机发出:Read Memory命令、存储器目标地址以及需要读取存储器数据需要的读时隙。如果准确地接收到Read Memory命令,仍然可能出现存储器目标地址的传输错误并且影响发送到主机的存储器数据。如果没有正确接收到Read Memory命令,iButton很有可能忽略该命令。

iButton存储器以32或64个字节分页排列。DS1920DS1971DS1990DS1991除外,iButton符合1-Wire文件结构,该结构在应用笔记114中进行了详细介绍。文件系统在每页开头放置一个长度字节,在数据字段的最尾添加了一个附加的连续指针和CRC16反码。读取iButton存储器数据时,系统提供高级错误控制。由于预先装载了CRC发生器和存储器页码,1-Wire的文件结构不仅能够保护数据流的误码,而且能够发现目标地址错误。当使用DS1971或DS1991时,应将数据包格式化,与应用笔记114介绍的格式相同。

除了与1-Wire文件结构的兼容性,以下iButton内置了CRC发生器,保护存储器的读取:DS1921DS1922DS1923DS196x系列、DS1977DS198x。除了DS1982,器件产生的CRC为16位。内置CRC发生器通常需要额外的读命令激活,在存储器页的最后一个字节发送后插入一个CRC。由于内部CRC发生器,数据页不需要格式化(按照应用笔记114中的格式,每页保存4个字节),如果页数据被格式化,器件产生的CRC将提供另一层验证数据的完整性。

如果没有发现读错误,标准的补救措施是重新读一次相同的数据(或页)。如果存储器数据没有格式化并且iButton没有产生CRC,建议进行多次读取。

一些应用需要数据加密或在页中嵌入信息验证码(例如:SHA-1 MAC)。人们可能质疑解密失败或MAC无效是由于读取错误造成的。即便读错误客观存在,也以这种方式设置系统,因为无法区分读错误和有意的篡改操作。因此,应该首先用上述方法检查数据的完整性,在第二步,应该采用密码验证。只有这样才能尽可能做出正确判断,收集有效的统计数据。

NVSRAM的可靠写操作

基于NVSRAM存储器的iButton具有内置电池,支持暂存器数据备份以及完成目标存储器数据传输的供电,无论在传输过程中1-Wire总线是否有效。为了确保通信成功,必须:1) 验证暂存器数据;2) 读取更新后的存储器页;3) 与预期的数据进行比较。

可以通过一个例子很好地解释整个过程,例如,在自动售货机上采购。这种情况下,为了保证数据安全需要进行加密。下列步骤说明了上述内容,详细信息请参考eCash评估板(型号:DSECASH)。
  1. 检测iButton的连接。
  2. 获取iButton识别码并检测其完整性(家族码、CRC)。
  3. 可靠寻址iButton,如果寻址失败则结束(失败)。
  4. 可靠读取存储货币余额的页,包括验证数据完整性(利用1-Wire数据结构,该步可能需要顺序或随机读取多页)。如果多次尝试后不成功,则等待iButton脱离总线,结束(失败)。
  5. 验证页数据密码,核查资金是否充足。如果发生错误,则显示故障信息,等待iButton脱离总线,结束(失败)。
  6. 可靠寻址iButton,如果寻址失败,结束(失败)。
  7. 将新的加密余额写入暂存器,根据iButton类型、字节偏移量以及所要写入的字节数,Write Scratchpad命令可能返回验证传输完整性的CRC校验。这种情况下,可以相应地使用该CRC。
  8. 可靠寻址iButton,如果寻址失败,结束(失败)。
  9. 读暂存器;比较地址和数据是否与写入暂存器的数据匹配。如果不匹配,则转向6)。
  10. 可靠寻址iButton,如果寻址失败,结束(失败)。
  11. 发送Copy Scratchpad命令,等待32µs。
  12. 可靠寻址iButton,如果寻址失败,结束(失败)。
  13. 读取更新页,并与预期的数据进行比较。如果数据匹配,则发放产品;结束(完成);如果不匹配,则转向步骤8。
该示例中,假定iButton没有特殊的安全功能。DS1963S具有几个写周期计数器,在每次对相关寄存器页进行写操作时递增计数。计数值可以包含在加密区域,用于产生一次唯一的币值,可以以此防止重复性的攻击。另一方面,从故障状态下恢复将更加复杂,例如,两次写入相同数据。从失败的写操作中试图恢复时,必须后退几步,以便在加密数据中包含正确的计数值。

EEPROM的可靠写操作

EEPROM iButton也采用暂存器临时存储中间结果并验证新数据。然而,由于它们没有电池作为备份电源,其暂存器是易失的。如果在10ms复制暂存器命令的写周期完成之前断开连接,目标存储器的内容可能被擦除。如果EEPROM iButton用于需要写存储器的应用,采用两次写操作很有必要,以便在更新过程无法完成时保持旧的数据。必须验证暂存器中的数据并读取更新寄存器页,以便与所期望的数据进行比较。对于EEPROM iButton,强烈推荐采用应用笔记114介绍的1-Wire文件结构,由于这种架构提供了验证存储器数据完整性的唯一方法。可能的话,器件可以进行CRC校验,以防止通信错误。EEPROM iButton比较复杂的设计因素是暂存器的尺寸,DS1961S和DS1972中只有¼存储器页。以下示例中所使用的器件的暂存器大小与每页存储器的大小相同。

启动条件举例

器件(例如:DS1973或DS1977)按照应用笔记114进行格式化,例如,第0页存储器件目录。单页数据文件可以在第1页和第2页交替。文件目录入口注明第1页或第2页是否有效。在数据文件中为应用软件保留一个字节用作计数器,文件更新时数值递增。

任务:安全更新数据文件。根据功能进一步说明上述内容,步骤如下:
  1. 检测iButton的连接。
  2. 获取iButton识别码并验证其完整性(家族码、CRC)。
  3. 可靠寻址iButton,如果寻址失败,结束(失败)。
  4. 可靠读取目录页,包括验证数据完整性并存储目录数据到暂存区。如果多次尝试后不成功,等待iButton脱离总线,结束(失败)。
  5. 可靠寻址iButton,如果寻址失败,结束(失败)。
  6. 可靠读取文件数据,包括验证数据完整性。如果多次尝试后不成功,等待iButton脱离总线,结束(失败)。
  7. 可靠寻址iButton,如果寻址失败,结束(失败)。
  8. 通过替换存储器页将新的文件数据写入暂存器,根据iButton类型、字节偏移以及要写入的字节数,Write Scratchpad命令将返回传输完整性校验的CRC。此时,采用相应的CRC校验。
  9. 可靠寻址iButton,如果寻址失败,结束(失败)。
  10. 读暂存器;比较地址和数据检查是否与写入缓存区的数据一致。如果不匹配,则转向步骤7。
  11. 可靠寻址iButton,如果寻址失败,结束(失败)。
  12. 发送Copy Scratchpad命令,等待10ms (tPROG)。
  13. 可靠寻址iButton,如果寻址失败,结束(失败)。
  14. 读更新页,与预期的数据进行比较。如果不一致,则转向步骤7。
  15. 替代存储器页更新缓存区中目录信息;包括更新使用页的位图以及在目录数据最后新的CRC16。
  16. 可靠寻址iButton,如果寻址失败,结束(失败)。
  17. 将已经更新的目录信息从缓存区写入暂存器(第0页) ,如果Write Scratchpad命令返回用于传输完整性校验的CRC,相应地使用该CRC。
  18. 可靠寻址iButton,如果寻址失败,结束(失败)。
  19. 读暂存器;比较地址和数据检查是否与缓存区中的数据一致。如果不匹配,则转向步骤16。
  20. 可靠寻址iButton,如果寻址失败,结束(失败)。
  21. 发送Copy Scratchpad命令,等待10ms (tPROG)。
  22. 可靠寻址iButton,如果寻址失败,结束(失败)。
  23. 读目录页,并与缓冲区的数据进行比较。如果不匹配,则转向步骤16。
  24. 如果数据匹配,结束(成功)。
第一次更新(文件数据)失败,不会丢失信息并且以后可以重试更新。如果目录更新失败,iButton中的数据设置和目录都将不是最新数据。需要了解两个数据文件可能存在的位置(系统知识)并读取两个版本的数据,从数据文件的计数值可以了解哪个是最新版本。当iButton连接到探头时,利用这种方法在下次操作之前修正目录数据。

暂存器空间为¼存储器页时,需要改进方案。这种情况下,交换位置是文件数据页的第二和第三个¼页。管理数据(连续指针、CRC16)为数据和更新计数保留5个字节。存储器页的第一个¼只保存长度字节,表示第二或第三个¼页是否有效。第一个更新周期,新的数据被写入替换区;第二个周期,更新长度字节。应用笔记1820:“White Paper 1: SHA Devices Used in Small Cash Systems”中的表3以及相关内容(第6页至第7页)以及步骤BF3 (第58页至第60页)提供了一个“A-B”架构的应用实例,利用DS1961S构建。

1-Wire的速度考虑

在多种iButton应用中,受电缆长度和负载限制,不能使用过驱动(高速)模式。而在嵌入电子设备靠近iButton探头的应用中,高速通信模式能够大大减少处理时间。

可通过两种方式将具备高速能力的iButton置于高速模式。一种是采用Overdrive Skip命令,该命令使总线上挂接的所有器件进入高速模式;另一种方法是采用Overdrive Match命令,该命令将识别码匹配的器件置于高速模式。在器件收到标准速度的1-Wire复位信号或脱离总线之前都将保持高速模式。连接到探头的器件开始时始终处于标准速度。

从以下示例可以看出执行Read ROM功能时节省的时间。

Step Explanation Time at STD speed Time at OD speed
1-Wire Reset/Presence Detect Cycle at Standard Speed   960µs 960µs
Command Overdrive Skip ROM 8 time slots N/A 8 × 65µs
1-Wire Reset/Presence Detect Cycle at Overdrive Speed   N/A 96µs
Command Read ROM 8 time slots 8 × 65µs 8 × 8µs
Read Device Identification Number 64 time slots 64 × 65µs 64 × 8µs
Total time 5640µs 2152µs

除了将器件置于高速模式所需的额外命令和复位周期外,高速模式下获取器件识别码需要2152µs,而标准速度下需要5640µs。高速模式下进行的数据传输越多,节省的时间也越长。高速模式的缺陷是需要谨慎处理短路或接触不良的情况,详细内容请参考短路和开路部分。

上述计算中,标准速度下时隙的持续时间为65µs,而高速模式下的持续时间为8µs,与新器件的数据资料一致。如果时隙由微控制器实时产生,时间将与数据资料中的规格有偏差。例如,产生时隙部分说明70µs的时隙是允许的,只要读回数据被及时采样(#5,图3)并且有足够的恢复时间(#8,图3)。

总结

iButton间断连接(接触)的应用中为了保证可靠通信必须仔细地设计系统,需要一些专用算法和详尽的测试。程序流程的设计必须能够尽早地检测到错误信息,并需要进行必要的重试、故障恢复功能,而且不能无视系统的响应时间。如果采取了正确的预防措施,即使间断地接触也能保证高度可靠的iButton通信。