一、什么是单总线协议?

1、单总线协议概念及特点

单总线(1-wire)是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线传输。 这种协议由一个总线主节点、或多个从节点组成系统,通过根信号线对从芯片进行数据的读取。每一个符合单总线协议的从芯片都有一个唯一的地址,包括48位的序列号、8位的家族代码和8位的CRC代码。主芯片根据64位寻址对各个芯片进行双向通信,因此其协议对时序的要求较严格,初始化、写bit或读bit都有严格的时序要求,但是位于位之间没有严格要求。

单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。主设备I/O口可直接驱动200m范围内的从设备,经过扩展后可达1km范围。

这种传输方式信号线上既传输时钟又传输数据,而且数据传输是双向的,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。

2、硬件结构

单总线只有一根数据线,设备(主机或从机)通过一个漏极开路或三态端口,连接至该数据线,这样允许设备在不发送数据时释放数据总线,以便总线被其它设各所使用。单总线端口为漏极开路,其内部等效电路下图所示:
在这里插入图片描述

单总线电路外接一个约5K的上拉电阻,当单总线处于空闲状态时为高电平,如果总线保持低电平超过480us,总线上的所有器件将复位。另外,在寄生方式供电时,为了保证单总线器件在某些工作状态下(如温度转换期间、EEPROM写入等)具有足够的电源电流,必须在总线上提供强上拉。

3、单总线协议应用

单总线器件主要有数字温度传感器(如DS18B20)、DHT11、A/D转换器(如DS2450)、门标、身份识别器(如DS1990A)、单总线控制器(如DS1WM)等。

二、单总线协议时序(以DS18B20为例)

DS18B20 需要严格的单总线协议以确保数据的完整性。协议包括集中单总线信号类型:复位脉冲、存在脉冲、写 0、写 1、读 0 和读 1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。

由于单总线是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线命令序列,即初始化、ROM命令和功能命令。如果出现序列混乱,器件将不响应主机(搜索ROM命令、报警搜索命令除外)。

1、初始化(复位脉冲 + 存在脉冲)

复位序列:复位脉冲和存在脉冲
在初始化序列期间,总线控制器拉低总线并保持 480us 以发出(TX)一个复位脉冲,然后释放总线,进入接收状态(RX)。单总线由 5K 上拉电阻拉到高电平。当DS18B20 探测到 I/O 引脚上的上升沿后,等待 15-60us,然后发出一个由 60-240us低电平信号构成的存在脉冲。
在这里插入图片描述

2、读/写时序

(1)写时序

写时序分为写 1 时序和写 0 时序,总线控制器通过写 1 时序写逻辑 1 到
DS18B20,写 0 时序写逻辑 0 到 DS18B20。所有写时序必须最少持续 60us,包括两个写周期之间至少 1us 的恢复时间。当总线控制器把数据线从逻辑高电平拉到低电平的时候,写时序开始,如下图所示:
在这里插入图片描述
总线控制器要生产一个写时序,必须把数据线拉到低电平然后释放,在写时序开始后的 15us 释放总线。当总线被释放的时候,5K 的上拉电阻将拉高总线。总控制器要生成一个写 0 时序,必须把数据线拉到低电平并持续保持(至少 60us)。

总线控制器初始化写时序后,DS18B20 在一个 15us 到 60us 的窗口内对 I/O 线采样。如果线上是高电平,就是写 1。如果线上是低电平,就是写 0。

(2)读时序

总线控制器发起读时序时,DS18B20 仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[BEh]或读电源模式指令[B4H]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[44h]或召回 EEPROM 指令[B8h]之后读时序。

所有读时序必须最少 60us,包括两个读周期间至少 1us 的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持 1us,然后总线被释放。在总线控制器发出读时序后,DS18B20 通过拉高或拉低总线上来传输 1 或 0。当传输逻辑 0 结束后,总线将被释放,通过上拉电阻回到上升沿状态。从 DS18B20 输出的数据在读时序的下降沿出现后 15us 内有效。因此,总线控制器在读时序开始后必须停止把 I/O 脚驱动为低电平 15us,以读取I/O 脚状态。
在这里插入图片描述

三、DS18B20访问执行步骤

每一次 DS18B20 的操作都必须满足以下步骤,若是缺少步骤或是顺序混乱,器件将不会返回值。例如这样的顺序:发起 ROM 搜索指令[F0h]和报警搜索指令[ECh]之后,总线控制器必须返回步骤 1。

1、初始化

通过单总线的所有执行操作处理都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和其后由从机发出的存在脉冲。存在脉冲让总线控制器知道 DS18B20 在总线上且已准备好操作。

2、ROM操作指令

一旦总线控制器探测到一个存在脉冲,它就发出一条 ROM 指令。如果总线上挂有多只 DS18B20,这些指令将基于器件独有的 64 位 ROM 片序列码使得总线控制器选出特定要进行操作的器件。这些指令同样也可以使总线控制器识别有多少只,什么型号的器件挂在总线上,同样,它们也可以识别哪些器件已经符合报警条件。ROM 指令有 5 条,都是 8 位长度。总线控制器在发起一条 DS18B20 功能指令之前必须先发出一条 ROM 指令。ROM指令流程图如下:
在这里插入图片描述
在这里插入图片描述

(1)Search ROM [F0h] (搜索 ROM 指令)

当系统上电初始化的时候,总线控制器必须通过识别总线上所有 ROM 片序列码去得到从机的数目和型号。总线控制器通过搜索 ROM 指令多次循环搜索 ROM 编码,以确认所有从机器件。如果总线上只有一只从机,那么可以用较为简单的读取ROM 指令代替搜索 ROM 指令。在每次搜索 ROM 指令之后,总线控制器必须返回步骤 1。

(2)READ ROM [33h] (读取 ROM 指令)

只有在总线上存在单只 DS18B20 的时候才能使用这条命令。该命令允许总线控制器在不使用搜索 ROM 指令的情况下读取从机的 64 位片序列码。如果总线上有不止一只从机,当所有从机试图同时传送信号时就会发生数据冲突。

(3)MATH ROM [55h] (匹配 ROM 指令)

匹配 ROM 指令,后跟 64 位 ROM 编码序列,让总线控制器在多点总线上定位一只特定的 DS18B20。只有和 64 位 ROM 片序列码完全匹配的 DS18B20 才能响应随后的存储器操作指令;所有和 64 位 ROM 片序列码不匹配的从机都将等待复位脉冲。

(4)SKIP ROM [CCh] (忽略 ROM 指令)

这条指令允许总线控制器不用提供 64 位 ROM 编码就使用功能指令。例如,总线控制器可以先发出一条忽略 ROM 指令,然后发出温度转换指令[44h],从而完成温度转换操作。注意:当只有一只从机在总线上时,无论如何,忽略 ROM 指令之后只能跟着发出一条读取暂存器指令[BEh]。在单点总线情况下使用该命令,器件无需发回 64 位 ROM 编码,从而节省了时间。如果总线上有不止一只从机,若发出忽略 ROM 指令,由于多只从机同时传送信号,总线上就会发生数据冲突。

(5)ALARM SEARCH [ECH] (报警搜索指令)

这条命令的流程和搜索 ROM 指令相同,然而,只有满足报警条件的从机才对该命令作出响应。只有在最近一次测温后遇到符合报警条件的情,DS18B20 才会响应这条命令。在每次报警搜索指令周期之后,总线控制器必须返回步骤 1。

3、DS18B20功能指令

在总线控制器发给欲连接的DS18B20一条ROM命令后,跟着可以发送一条DS18B20功能指令。这些命令允许总线控制器读写 DS18B20 的暂存器,发起温度转换和识别电源模式。功能指令流程图如下:
在这里插入图片描述
在这里插入图片描述

(1)CONVERT T [44h] (温度转换指令)

这条命令用以启动一次温度转换。温度转换指令被执行,产生的温度转换结果数据以 2 个字节的形式被存储在高速暂存器中,而后 DS18B20 保持等待状态。如果寄生电源模式下发出该命令后,在温度转换期间(tconv),必须在 10us(最多),内给单总线一个强上拉,见 DS18B20 供电节。如果DS18B20 以外部电源供电,总线控制器在发出该命令后跟着发出读时序,DS18B20 如处于转换中,将在总线上返回 0,若温度转换完成,则返回 1。

(2)WRITE SCRATCHPAD [4Eh] (写暂存器指令)

这条命令向 DS18B20 的暂存器写入数据,开始位置在 TH 寄存器(暂存器的第 2个字节),接下来写入 TL 寄存器(暂存器的第 3 个字节),最后写入配置寄存器(暂存器的第 4 个字节)。数据以最低有效位开始传送。上述三个字节的写入必须发生在总线控制器发出复位命令前,否则会中止写入。

(3)READ SCRATCHPAD [BEh] (读暂存器指令)

这条命令读取暂存器的内容。读取将从字节 0 开始,一只进行下去,知道第 9 字节(字节 8,CRC)读完,如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。

(4)COPY SCRATCHPAD [48h] (拷贝暂存器指令)

这条命令把 TH,TL 和配置寄存器(第 2、3、4 字节)的内容拷贝到 EEPROM 中。如果使用寄生电源总线控制器必须在发出这条命令的 10us 内启动强上拉并最少保持 10ms。

(5)RECALL E2 [B8H] (召回 EEPROM 指令)

这条命令把报警触发器的值(TH 和 TL)以及配置数据从 EEPROM 拷回暂存器。总线控制器在发出该命令后读时序,DS18B20 会输出拷回标识:0 标识正在拷回,1标识拷回结束。这种拷回操作在 DS18B20 上电时自动执行,这样器件一上电暂存器里马上就存在有效的数据了。

(6)READ POWER SUPPLY [B4h] (读电源模式指令)

总线控制器在这条命令发给 DS18B20 后发出读时序,若是寄生电源模式,DS18B20将拉低总线,若是外部电源模式,DS18B20 将会把总线拉高。

注意:
1.对于寄生电源模式下的 DS18B20,在温度转换和拷贝数据到 EEPROM 期间,必须给单总线一个强上拉。总线上在这段时间内不能有其它活动。
2.总线控制器在任何时刻都可以通过发出复位信号中止数据传输。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐