首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

单总线协议-以DS18B20举例(2)

单总线协议-以DS18B20举例(2)

3.2.1 搜索ROM[F0h]         当系统初始上电时,主机必须找出总线上所有从机设备的 ROM代码,这样主机就能够判断出从机的数目和类型。主机通过重复执行搜索 ROM循环(搜索ROM命令跟随着位数据交换),以找出总线上所有的从机设备。如果总线只有一个从机设备,则可以采用读 ROM命令来替代搜索 ROM命令。关于搜索 ROM命令的详细解释,请参见附录 A。 在每次执行完搜索ROM循环后,主机必须返回至命令序列的第一步(初始化) 。

     3.2.2 读ROM[33h]( 仅适合于单节点)     该命令仅适用于总线上只有一个从机设备。它允许主机直接读出从机的 64位ROM代码,而无须执行搜索 ROM过程。如果该命令用于多节点系统,则必然发生数据冲突,因为每个从机设备都会响应该命令。

    3.2.3 匹配ROM[55h]       匹配ROM命令跟随 64位ROM代码,从而允许主机访问多节点系统中某个指定的从机设备。仅当从机完全匹配 64位ROM代码时,才会响应主机随后发出的功能命令;其它
设备将处于等待复位脉冲状态。  

    3.2.4 跳越ROM[CCh] (仅适合于单节点)      主机能够采用该命令同时访问总线上的所有从机设备,而无须发出任何ROM 代码信息。例如,主机通过在发出跳越 ROM命令后跟随转换温度命令[44h] ,就可以同时命令总线上所有的 DS18B20 开始转换温度,这样大大节省了主机的时间。值得注意,如果跳越 ROM命令跟随的是读暂存器[BEh] 的命令(包括其它读操作命令)则该命令只能应用于单节点系统,否则将由于多个节点都响应该命令而引起数据冲突  。

    3.2.5 报警搜索[ECh]( 仅少数1-wire 器件支持)      除那些设置了报警标志的从机响应外,该命令的工作方式完全等同于搜索 ROM命令。该命令允许主机设备判断那些从机设备发生了报警(如最近的测量温度过高或过低等 )。同搜索ROM命令一样,在完成报警搜索循环后,主机必须返回至命令序列的第一步  。

    3 3  功能命令(以DS18B20 为例)    在主机发出 ROM命令,以访问某个指定的 DS18B20 接着就可以发出 DS18B20, 支持的某个功能命令。这些命令允许主机写入或读出 DS18B20 暂存器,启动温度转换以及判断从机的供电方式。 DS18B20 的功能命令总结于表1中,并在图3 流程图中作了说明

表1 DS18B20 功能命令集


       1、在温度转换和复制暂存器数据至 EEPROM期间,主机必须在单总线上允许强上拉。并且在此期间,总线上不能进行其它数据传输 ;
       2、通过发出复位脉冲,主机能够在任何时候中断数据传输;
       3、在复位脉冲发出前,必须写入全部的三个字节 。


四、信号方式       所有的单总线器件要求采用严格的通信协议, 以保证数据的完整性。该协议定义了几种信号类型:复位脉冲、 应答脉冲、 写0、写1、 读0和读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前,这一点与多数串行通信格式不同(多数为字节的高位在前)。

    4.1初始化序列:复位和应答脉冲       单总线上的所有通信都是以初始化序列开始,包括:主机发出的复位脉冲及从机的应答脉冲 ,如图4 所示。


     当从机发出响应主机的应答脉冲时,即向主机表明它处于总线上,且工作准备就绪。在主机初始化过程,主机通过拉低单总线至少 480us, 以产生(Tx) 复位脉冲。接着,主机释放总线,并进入接收模式(Rx)。 当总线被释放后,5k上拉电阻将单总线拉高。在单总线器件检测到上升沿后,延时 15-60us,接着通过拉低总线 60-240 us, 以产生应答脉冲 。

   4.2  读/写时隙      在写时隙期间,主机向单总线器件写入数据;而在读时隙期间,主机读入来自从机的数据。在每一个时隙,总线只能传输一位数据。  

    4.2.1  写时隙          存在两种写时隙:"写1" 和"写0" 。主机采用写 1 时隙向从机写入 1,而采用写 0 时隙向从机写入 0。 所有写时隙至少需要 60 us,且在两次独立的写时隙之间至少需要 1u s 的恢复时间。两种写时隙均起始于主机拉低总线(图5 所示)。 产生写 1 时隙的方式:主机在拉低总线后 ,接着必须在 15u s 之内释放总线,由5k 上拉电阻将总线拉至高电平; 而产生写0 时隙的方式:在主机拉低总线后,只需在整个时隙期间保持低电平即可( 至少60 us)。
        在写时隙起始后 15-60 us 期间,单总线器件采样总线电平状态。如果在此期间采样为高电平,则逻辑1 被写入该器件;如果为0 ,则写入逻辑0  。

      4.2.2  读时隙       单总线器件仅在主机发出读时隙时,才向主机传输数, 所以, 在主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。所有读时隙至少需要 60us, 且在两次独立的读时隙之间至少需要 1us的恢复时间,每个读时隙都由主机发起, 至少拉低总线 1us (图5 所示)。在主机发起读时隙之后,单总线器件才开始在总线上发送 0 或1。 若从机发送1,则保持总线为高电平;若发送 0, 则拉低总线 。当发送 0 时,从机在该时隙结束后释放总线 。由上拉电阻将总线拉回至空闲高电平状态。从机发出的数据在起始时隙之后,保持有效时间 15us ,因而,主机在读时隙期间必须释放总线 ,并且在时隙起始后的 15 us 之内采样总线状态。


附录A ROM搜索实例
      ROM搜索过程只是一个简单的三步循环程序:读一位、读该位的补码 、写入一个期望的数据位。总线主机在 ROM的每一位上都重复这样的三步循环程序。 当完成某个器件后,主机就能够知晓该器件的 ROM信息。剩下的设备数量及其 ROM代码通过相同的过即可获得。
      下面的ROM搜索过程实例假设四个不同的器件被连接至同一条总线上,它们的 ROM代码如下所示:
         ROM1    00110101…
         ROM2    10101010…
         ROM3    11110101…
         ROM4    00010001…
       具体搜索过程如下:
1 、主机发出复位脉冲,启动初始化序列。从机设备发出响应的应答脉冲;
2 、接着主机在总线上发出ROM搜索命令 ;
3 、 主机从总线上准备读入一个数据位,这时,每个响应设备分别将 ROM代码的第一位输出到单总线上。ROM1 和ROM4 输出 0 至总线,而ROM2 和ROM3 输出 1 至总线。线上的输出结果将是所有器件的逻辑”与“ ,所以,主机从总线上读到的将是 0 。接着, 主机开始读另一位,即每个器件分别输出 ROM代码中第一位的补码,此时,ROM1 ROM4 输出 1至总线,而ROM2 和ROM3 输出 0 至总线 。这样,主机读到的该位补码还是 0 。主机由此判定,总线上有些器件的ROM代码第一位为0, 有些则为1;

     两次读到的数据位具有以下含义:

     00  在该位处存在设备冲突;
     01  在该位处所有器件为0;
     10  在该位处所有器件为1;
     11  单总线不存在任何设备;
4、  主机写入 0,从而禁止了 ROM2 和ROM3 响应余下的搜索命令 ,仅在总线上留下了 ROM1和ROM4;  
5 、主机再执行两次读操作 ,依次收到 0 和1,这表明 ROM1 和ROM4 在ROM代码的第二位都是0  ;
6 、接着主机写入0,在总线上继续保持ROM1 和ROM4 ;
7 、主机又执行两次读操作,收到两个 0, 表明所连接的设备的 ROM代码在第三位既有 0,也有1;
8 、主机再次写入 0 ,从而禁止了 ROM1 响应余下的搜索命令,仅在总线上留下了 ROM2;
9 、主机读完 ROM4 余下的 ROM数据位。这样就完成了第一次搜索,并找到了位于总线上的第一个设备;
10、重复执行第1 至第7 步,开始新一轮的ROM搜索命令;
11、 主机写入1 ,使ROM4 离线,仅在总线上留下ROM1;
12 、主机读完 ROM1 余下的 ROM数据,这样就完成了第二次的 ROM搜索,找到了第二个ROM代码 ;
13 、重复执行第1 至第3 步开始新一轮的ROM搜索命令
14、主机写入 1 这次禁止了 ROM1 和ROM4 响应余下的搜索命令 仅在总线上留下了 ROM2和ROM3 ;
15 、主机又执行两次读操作时隙读到两个0 ;
16、 主机写入0 ,这样禁止了ROM3 ,而留下了ROM2;
17 、主机读完 ROM2 余下的 ROM数据,这样就完成了第三次的 ROM搜索,找到了第三个ROM代码;
18、 重复执行第13至第15步,开始新一轮的ROM搜索命令;
19 、主机写入1 这次禁止了ROM2 而留下了ROM3;
20 、主机读完 ROM3 余下的 ROM数据,这样就完成了第四次的 ROM搜索,找到了第四个ROM代码;
说明 :
每次搜索 ROM操作,主机只能找到某一个单总线器件的 ROM代码,所需要的最短时间为:
      960 us+(8+3 64)  61 us=13.16ms ;
所以主机能够在1秒之内读出75个单总线的ROM 代码。
继承事业,薪火相传
返回列表