时间:2024-07-28
李 多,陈 军
(东南大学 自动化学院,江苏 南京 211189)
1-Wire总线是Dallas半导体公司推出的一种半双工串行总线,它采用单根信号线实现微控制器(主机)与接口器件(从机)之间的双向通信,每个从机具有唯一的工厂光刻ID作为地址。
1-Wire总线的优势在于结构简单、便于总线扩展,可以通过总线为器件供电。1-Wire器件种类丰富,典型器件包括温度传感器、存储器、实时时钟、电池管理等。在低功耗仪表、工业控制及家庭监控网络等领域,1-Wire总线获得了广泛应用。
1-Wire总线协议通常采用软件延时实现,对于实时性高且无操作系统的单片机,该方式难以提高单片机效率,同时极大地降低了系统实时性。本文提出了一种基于单片机串口的1-Wire总线协议的软硬件设计,该设计实现了1-Wire总线通信和单片机效率、实时性的兼顾。
1-Wire总线的单根信号线兼有地址总线、数据总线和控制总线的功能,因此,访问1-Wire器件要严格遵循总线协议以保证数据完整性。
1-Wire总线协议定义了初始化脉冲、写脉冲和读脉冲3类总线信号,其主要区别在于,总线上高低电平时间不同,下面分别对它们进行简析。
1-Wire总线协议规定任何与1-Wire器件的通信需要以初始化脉冲作为同步。初始化脉冲包括复位信号和应答信号,主机输出低电平并维持 480 μs,然后 释 放 总 线 , 完 成 复 位 。 等 待 15 μs~60 μs, 如 果 存在 1-Wire 器件, 则总线上出现维持 60 μs~240 μs低电平应答信号。初始化脉冲信号波型如图1所示。
图1 初始化脉冲信号波形
每个写脉冲主机可向从机传送1 bit数据,通常为从机控制命令。1-Wire总线协议规定其典型长度为60 μs,以保证从机接收数据的完整性。主机输出低电平并维持60 μs后释放总线,为写0时序;主机输出低电平并维持15 μs内释放总线,为写1时序。写脉冲信号波形如图2所示。
图2 写脉冲信号波形
每个读脉冲从机可向主机传送1 bit数据,通常为从机数据信息。只有主机发出读脉冲时序,1-Wire器件才在总线上发送数据。1-Wire总线协议规定主机必须在15 μs内采样总线,才能正确读取从机数据。读脉冲信号波形如图3所示。
图3 读脉冲信号波形
1-Wire总线协议规定主机和从机必须通过集电极开路或漏极开路结构才能连接到总线,以允许器件在空闲时释放总线,并且总线需要外接上拉电阻才能正常通信。
1-Wire器件一般具有漏极开路结构,可直接连接至总线。但单片机的串口引脚一般具有内部上拉电阻,采用单片机串口实现1-Wire通信时,不能直接连接至总线。
鉴于上述原因,本文设计了一种基于分立元件的单片机串口与 1-Wire器件(以 DS18B20[2]为例)的硬件接口电路,如图4所示。该接口电路简单,并且经实验测试证明其性能可靠,实现了单片机串口与1-Wire总线的电气连接。
图4 1-Wire总线硬件接口原理图
单片机串口采用1 bit起始位、8 bit数据位、1 bit停止位的工作方式,发送时由LSB至MSB逐位发送。
(1)初始化脉冲
设置波特率为9600b/s,即每1 bit的宽度为104.2 μs,发送数据0xf0,则起始位和低4 bit构成复位信号,高4 bit为1,即释放总线。如总线上无应答信号,则串口接收的数据等于0xf0,否则说明总线上有应答信号。
(2)读写脉冲
设置波特率为115200b/s,即每1 bit的宽度为8.7 μs,完整的发送过程持续 87 μs,满足读写脉冲至少 60 μs的协议要求。起始位、停止位分别用来启动、终止读写脉冲。写脉冲中,根据串口发送不同数据区分别实现写0时序和写1时序;读脉冲中,串口发送数据0xff,起始位实现读脉冲时序的启动,LSB为1,此时,主机释放并采样总线,起始位与LSB共维持17.4 μs,满足协议对读时序的要求。根据串口接收的数据最低位即可区分从机发送至总线的数据。
采用串口实现1-Wire总线通信的本质在于将3类总线信号与不同波特率下不同数据的串口收发过程建立联系,初始化脉冲对应2次串口收发的过程,读写脉冲则对应1次串口收发的过程[4]。具体对应关系如表1所示。
表1 通信协议接口映射表
DS18B20是1-Wire总线的集成数字温度传感器,其精度高、体积小,在智能仪器仪表、工业控制等领域中广泛应用。
传统应用方式是采用一根I/O引脚配合软件延时的方式实现相关协议,1-Wire总线协议需要微秒级时间分辨率,在通信过程中必须关闭系统所有中断,否则极容易因为中断服务程序的执行而造成通信数据错误。但是关闭中断降低了系统实时性,使得系统不能及时响应外部请求。对于任务少、实时性要求不高的系统,这种做法是可行的,但是对于任务多且无操作系统的单片机,以初始化脉冲为例,在至少 960 μs的时间内,单片机都会被1-Wire总线占用,效率大为降低,实时性难以保证。
基于单片机串口中断实现1-Wire协议,并配合状态机实现与DS18B20通信,为上述问题提出了解决方案。由于串口的收发都是通过硬件完成,因此数据收发过程中单片机可以处理其他任务,在实现1-Wire通信的同时,兼顾了实时性和效率。
通信程序包括中断服务程序和通信状态机。中断服务程序为物理层,完成数据缓冲区中的数据收发,并通过全局变量标识总线的状态;通信状态机为DS18B20协议层,将对DS18B20的访问划分为子状态,根据表1将对DS18B20的不同操作转化为相应数据并存入数据缓冲区,在总线处于空闲状态时,依次完成状态转移。通信状态转换图如图5所示[4]。
图5 通信状态转换图
本文提出了一种基于单片机串口的1-Wire总线通信方式,结合1-Wire器件DS18B20详细介绍了其软硬件设计。相比于传统1-Wire通信方式,本文提出的方式提高了单片机效率,兼顾了1-Wire通信和系统的实时性,为多任务且无操作系统的单片机应用1-Wire器件提供了新的解决方案。
[1]马潮.AVR单片机嵌入式系统原理与应用实践 (第二版)[M].北京:北京航空航天大学出版社,2011.
[2]Maxim.DS18B20 datasheet[Z].2008.
[3]Maxim.Application note 214:using a UART to implement a 1-Wire bus master[Z].2002.
[4]ATMEL.AVR318:Dallas 1-Wire master[Z].2004.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!