目前常用的微机与外设之间进行数据传输的串行总线主要有I2C总线、SPI总线和SCI总线。其中I2C总线以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线),而SCI总线是以异步方式进行通信(一条数据输入线,一条数据输出线)的。这些总线至少需要两条或两条以上的信号线。本文要介绍的总线协议和以上总线都不同,只有一根线,也就是单总线。
单总线技术(1-Wire Bus)是美国的达拉斯半导体公司(Maxim全资子公司Dallas)推出了一项特有的技术,它采用单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。
单总线适用于单个主机系统,能够控制一个或多个从机设备。当只有一个从机位于总线上时,系统可按照单节点系统操作;而当多个从机位于总线上时,则系统按照多节点系统操作。主机可以是微控制器,从机可以是单总线器件,如下图所示。
图 1 单总线多节点示意图
本文将从三个方面介绍单总线:硬件结构、时序控制、实际应用。2 单总线硬件结构
单总线只有一根数据线系统中的数据交换、控制都在这根线上完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,这样允许设备不发送数据时释放总线,以便其他设备使用总线,其内部等效电路如图所示。
图 2 单总线硬件接口图
单总线要求外接一个约4.7K的上拉电阻,这样当总线闲置时,状态为高电平。主机和从机之间的通信通过以下三个步骤完成:初始化1-wire器件,识别1-wire器件,交换数据。另外,在寄生方式供电时,为了保证单总线器件在某些工作状态下(如温度转换期间、EEPROM写入等)具有足够的电源电流,必须在总线上提供强上拉,也就是在处理器与总线之间增加一个MOS管。
3 单总线时序控制
由于单总线是主从结构,只有主机呼叫从机时,从机才能答应,因此主机访问1-wire器件都必须严格遵循单总线命令序列:初始化、ROM命令、功能命令。如果出现序列混乱,1-wire器件不会响应主机(搜索ROM命令,报警搜索命令除外)。因此,器件需要要求遵循严格的通信协议,以保证数据的完整性。
根据单总线的协议要求,需严格遵循以下命令序列:
(1)初始化:单总线上所有传输过程都需要以初始化开始
(2)ROM命令:在主机检测到从机的应答脉冲后,就可以发出ROM命令
(3)功能命令:每个单总线器件都有自己的专用指令,需要参照各自的数据手册这些信号,
初始化时序包括主机发送的复位脉冲和从机发出的应答脉冲。主机通过拉低单总线至少480us,以产生TX复位脉冲;然后主机释放总线,并进入RX接收模式,当主机释放总线时,总线由低电平跳变为高电平时产生一上升沿,单总线器件检测到这上升沿后,延时15~60us,接着单总线器件通过拉低总线60~240us,以产生应答脉冲。主机接收到从机应答脉冲后,说明有单总线器件在线,然后主机就开始对从机进行ROM命令和功能命令操作。
写1、写0和读时序。在每一个时序中,总线只能传输一位数据。所有的读写时序至少需要60us,且每两个独立的时序之间至少需要1us的恢复时间。读写时序均起始于主机拉低总线。在写时序中,主机拉低总线后保持至少60us的低电平则向单总线器件写0。单总线器件又在主机发发出读时序时才向主机传送数据,所以当主机向单总线器件发出数据命令后,必须马上产生读时序,以便单总线能传输数据。在主机发出读时序之后,单总线器件才开始在总线上发送0或1,若单总线器件发送1,则保持总线高电平,若发送0,则拉低总线。单总线器件发送之后,保持有效时间,因而,主机在读时序期间必须释放总线,并且必须在15us之中采样总线状态,从而接收到从机发送的数据。
除了应答脉冲外都是由主机发出同步信号,并且发出的所有命令和数据都是字节的低位在前。
【注】不管是ROM命令还是功能命令,最终都是通过控制时序来完成的,换句话说,命令只是对一些列时序控制分别命名罢了。
4 单总线应用(DS18B20)
目前,单总线器件的主要有数字温度传感器(如DS18B20));A/D转换器(如DS2450)门禁、身份识别器(如DS1990A);单总线控制器(如DSIWM)等等。
前面讲解了单总线的时序控制,下面将结合DS18B20来具体讲解单总线的指令操作与时序控制过程。
4.1 DS18B20的硬件连接方式
DS18B20有两种连接方式:外部电源供电和寄生电源供电。
1.外电电源供电方式
在外部电源供电方式下,DS18B20的工作电源由VCC引脚引入,不存在电源电流不足的问题,可以保证转换的精度,在单总线上还可以挂在任意多个设备。值得注意的是,在外部供电的方式下,GND引脚不能悬空,悬空会导致温度读取失败。
采用外部电源供电是DS18B20的最佳方式,工作稳定,抗干扰强,电路简单,可以开发多点测温系统。
图3外部供电方式
2.寄生电源供电方式
在寄生电源供电方式下,DS18B20只需要一个线就可正常工作,无需外部供电,值得注意的,此种供电方式,需要使用一个MOS管将单总线强上拉以此提供充足的电流,在发出任何涉及到拷贝EEPROM存储器或启动温度转换的指令后,必须最多10us把I/O强上拉。
这种供电方式也可适用于多点测温,但需要多一根I/O线来进行强上拉切换。
图 4 寄生电源供电方式
另外,如果只有一个从机设备,也可不需要增加MOS管,但是当I/O提供的电能不够,则会导致无法转换温度或温度误差大。4.2 DS18B20的指令
DS18B20的指令整体上分为两类:ROM指令和存储器操作指令。
1.ROM指令
在主机检测到应答脉冲后,就可以发出 ROM 命令。这些命令与各个从机设备的唯一64位 ROM代码相关,允许主机在单总线上连接多个从机设备时,指定操作某个从机设备。这些命令还允许主机能够检测到总线上有多少个从机设备以及其设备类型,或者有没有设备处于报警状态。
从机设备可能支持5种 ROM 命令(实际情况与具体型号有关),每种命令长度为8位。主机在发出功能命令之前,必须送出合适的 ROM 命令。ROM命令的操作流程图如下图所示。
图 5 DS18B20 ROM指令流程
下面将简要地介绍各个 ROM 指令的功能,以及在何种情况下使用。(1) READ ROM [33h](仅适合于单节点)
这条指令用于读取DS18B20的64位序列号。值得注意的是,该指令仅适用于总线上只有一个从机设备。它允许主机直接读出从机的64位 ROM 代码,无须执行搜索 ROM 过程。如果该命令用于多节点系统,则必然发生数据冲突,因为每个从机设备都会响应该命令。
(2) MATCH ROM [55h]
匹配 ROM 指令,后跟随64位 ROM序列号,从而允许主机访问多节点系统中某个指定的从机设备。仅当从机完全匹配64位 ROM 代码时,才会响应主机随后发出的功能命令;其它设备将处于等待复位脉冲状态。这条指令适用于单个或者多个DS18B20。(3) SKIP ROM [CCh](仅适合于单节点)
主机通过执行该指令,访问总线上的从机设备,而无须发出任何 ROM 指令信息。例如,主机通过在发出跳越 ROM 指令后跟随转换温度指令 [44h] ,就可以同时命令总线上所有的 DS18B20 开始转换温度,这样大大节省了主机的时间。值得注意,如果跳越 ROM指令跟随的是读暂存器 [BEh] 的指令(包括其它读操作命令),则该命令只能应用于单节点系统,否则将由于多个节点都响应该命令而引起数据冲突。
(4) SEARCH ROM [F0h]
当系统初始上电时,主机必须找出总线上所有从机设备,即采用搜索指令来识别总线上的所有的从机64位序列号,这样主机就能够判断出从机的数目和类型。主机通过重复执行搜索 ROM 循环(搜索ROM指令跟随着位数据交换),以找出总线上所有的从机设备。如果总线只有一个从机设备,则可以采用读 ROM 指令来替代搜索 ROM 指令。在每次执行完搜索 ROM 循环后,主机必须返回至指令序列的第一步(初始化)。(5) ALARM SEARCH ROM [ECh]
除那些设置了报警标志的从机响应外,该命令的工作方式完全等同于搜索 ROM 指令。该指令允许主机设备判断那些从机设备发生了报警(如最近的测量温度过高或过低等)。同搜索 ROM 指令一样,在完成报警搜索循环后,主机必须返回至指令序列第一步。【注】在温度转换和复制暂存器数据至 EEPROM 期间,主机必须在单总线上允许强上拉。并且在此期间,总线上不能进行其它数据传输。
2.存储器操作指令
在主机发出 ROM 命令,以访问某个指定的 DS18B20,接着就可以发出 DS18B20 支持的某个功能命令。这些命令允许主机写入或读出DS18B20暂存器、启动温度转换以及判断从机的供电方式。DS18B20的功能命令流程如下图所示。
图 6 DS18B20 功能指令流程
(1) CONVERT T [44h]
启动温度转换指令,温度转换后存放在Byte0和Byte1中,如果使用寄生电源,总线控制必须在发出该条指令后的10us内强制上拉,以保证DS18B20的供电充足。(2) WRITE SCRATCHPAD [4Eh]
在写暂存器指令后可向DS18B20的暂存器TH和TL以及配置寄存器中写入数据。(3) READ SCRATCHPAD [BEh]
读暂存器指令,发送该指令后DS18B20将从第一个字节开始,依次送出9个字节的内容,如果不想读完所有的字节,控制器可以在任意时间发出复位指令来终止读取数据。(4) COPY SCRATCHPAD [48h]
复制暂存器指令将TH和TL与配置寄存器的中的内容拷贝到EEPROM中。如果使用寄生电源。总线控制器必须在这条指令发出后的10us内启动强上拉,并保持至少10ms的时间。(5) RECALL E2 [B8h]
复制EEPROM指令把TH和TL与配置寄存器的值拷贝会暂存器中,这种拷贝操作在DS18B20上电后自动执行,上电后,暂存器中就存在有效的数据。(6) READ POWER SUPPLY [B4h]
读电源模式指令,发给DS18B20后,再发出读时间隙,返回电源模式,0位寄生电源,1位外部电源。4.3 DS18B20时序控制
单总线协议定义了几种信号类型:复位脉冲、答应脉冲、写0、写1、读0和读1时序。下面针对DS18B20介绍其相应的时序控制图。
1.初始化序列:复位和应答脉冲
单总线上的所有通信都是以初始化序列开始,包括:主机发出的复位脉冲及从机的应答脉冲,如下图所示。
图 7 初始化时序图
在主机初始化过程,主机通过拉低单总线至少480us,当然在480~960us的低电平都是可以的,以产生 (Tx) 复位脉冲。接着,主机释放总线变为高电平,并进入接收模式 (Rx)在,随后的480us内,对总线进行检测,如果有低电平,则说明总线上有期间作出应答,否则说明无设备在总线上。作为从机的DS18B20会一直检测总线上是否有480~960us的低电平信号,如果检测到复位脉冲,则延时15-60us,接着通过拉低总线60-240us,以产生应答脉冲。当从机发出响应主机的应答脉冲时,即向主机表明它处于总线上,且工作准备就绪。若检测不到复位脉冲则一直处于检测等待中。
2.主机读写时序
在写时序期间,主机向单总线器件写入数据;而在读时序期间,主机读入来自从机的数据。在每一个时序,总线只能传输一位数据。
图 8 读写时序图
- 写时序
写0时序的过程:在主机拉低总线后,只需在整个时序期间保持低电平即可(至少60us)。
写1时序的过程:主机在拉低总线后,接着必须在15us之内释放总线,由5k上拉电阻将总线拉至高电平。一直到写周期结束。
总的来说,在写时序起始后15-60us期间,单总线器件采样总线电平状态。如果在此期间采样为高电平,则逻辑1被写入该器件:如果为低电平,则写入逻辑0。
- 读时序
所有读时序至少需要60us,且在两次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。在主机发起读时序之后,单总线器件才开始在总线上发送0或1。
若从机发送1,则保持总线为高电平;若发送0,则拉低总线。当发送0时,从机在该时序结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态。从机发出的数据在起始时隙之后,保持有效时间15us,因而,主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。
【注】无论是读是写,都是以主机把总线至少拉低1us开始,无论是读0还是写0,都是以总线拉高至少1us结束。
4.4 DS18B20温度读取流程
当主机对多个DS18B20的某一设备进行操作时,主机首先逐个与挂在总线设备挂接,使用搜索ROM(FOh)指令,读出其序列号(33H),然后发送匹配指令(55h),紧接着提供64位序列号,之后就是操作该DS18B20了。
如果只有一个DS18B20测温,就不需要搜索ROM、读ROM以及匹配ROM操作了,只需要指令跳过ROM(CCh)指令,就可指令温度转换(44h)和读取温度(BEh)操作了。
图 9 DS18B20温度获取流程
总的来说,单线接口访问DS18B20的流程如下:
1.ROM操作
A.主机复位操作,即对DS18B20初始化;
B.主机对DS18B20写跳过ROM指令(CCh),单设备不需要其他操作;
C主机对DS18B20写启动温度转换(44h),启动温度转换;
D.时等待温度转换值,当然延时大小还由分辨率决定。
【注】每个指令在写的时候都是低位在前,高位在后。
2.存储器操作
A.主机复位操作;
B.主机对DS18B20写跳过ROM指令(CCh);
C.主机发出读取RAM指令(BEh),DS18B20依次发送9个字节数据,在字节在前,高字节在后。如果只想读取温度值,在读完前两个字节就不在读取后面的数据。
5 总结
单总线技术以其线路简单、硬件开销少、成本低廉、软件设计简单优势而有着无可比拟的应用前景。基于单总线技术能较好地解决传统识别器普遍存在的携带不便、易损坏、易受腐馈、易受电磁干扰等不足,可应用于高度安全的门禁、身份识别等领域。其通信可靠简单,很容易实现。因此单总线技术有着广阔的应用前景,是值得产注的一个发展领域。
来源:嵌入式实验楼