用并行方式实现快速读写多只单总线器件

2010-09-13 02:20
科技传播 2010年15期
关键词:温度传感器器件总线

方 凯

山东艺术学院,山东济南 250014

用并行方式实现快速读写多只单总线器件

方 凯

山东艺术学院,山东济南 250014

本文简单的介绍了单总线串行总线信号传输方式,并提出一种利用MCU的并口进行字节寻址的方式,同时对多个单总线器件进行并行读写的方法及其具体的算法实现。

单片机;MCU;单总线;1-Wire Bus

目前,常用的MCU与外接的元器件进行数据通信的串行总线主要有I2C总线、SPI总线和SCI总线。其中I2C总线以2线连接(一条时钟线,一条数据线)进行同步串行通信;SPI总线则以3线连接(一条时钟线,一条数据输入线,一条数据输出线)进行同步通信;SCI总线是以两线连接(一条数据输入线,一条数据输出线)进行异步串行进行通信的。这些总线至少需要两条或两条以上的信号线。而美国的DALLASS半导体公司推出的单总线(1-Wire Bus)技术采用了单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。 目前,常见的单总线器件主要有数字温度传感器DS18B20、A/D转换器如DS2450、电源管理芯片DS2438等。

对于单总线器件,每一个器件内都有一个64位的ROM,包含有8位的产品系列编码和48位的ID号。这些ID号对每个单总线器件都是唯一的,因此我们可以在一条单总线上挂接多个单总线器件,然后使用单总线传输协议规定的ReadROM和SearchROM的操作命令来搜索这些器件的ID号,并用MatchROM命令选择各个特定ID号的单总线器件分别对其进行读写。

但是,在实际应用中,尤其是在一个MCU上连接有多个同类型的单总线器件的情况下,这种通过搜索和指定ID号来读写单总线器件的方式并不方便。我们虽然可以用ID号来区分各个器件并且分别对其读写而互不干扰,但是没有很简单的办法把每一个ID号和某个具体的单总线器件对应起来,因为每个单总线器件的ID号都是随机的,而且这个ID号并没有标示在元件上面。比方说,要在一条单总线上连接两个DS18B20温度传感器,分别测量室内和室外的温度,可以用程序搜索到两个不同的ID号,得到两个温度值,但是我们并不知道读出来的两个值哪个是室内的,哪个是室外的。虽然,对于上面的实例我们可以通过手动屏蔽掉一个器件的方式确认哪个ID对应哪个器件,并修改MCU的程序使之分别显示室内外温度,但是如果用于大批量生产的实际产品时,我们不可能对每一个产品的ID号和实际所在的位置进行手动对应。

因此,可以考虑换一种方式来对多个单总线进行操作:利用MCU的并口同时对多个单总线器件进行读写。我们将多个单总线器件分别挂到MCU一个并口的多个IO端上,这样对于常用的如51系列PIC系列或者AVR系列等8位MCU,一个单总线读写周期内就能同时读写8个单总线器件,而且每个单总线器件的位置和MCU并口IO端的位置都是对应的。

本文以最常用的单总线器件温度传感器DS18B20和最常用的51系列MCU为例,阐述了这种操作方式的实现。

电路的连接如下:将8只DS18B20温度传感器各自的DQ端分别与89C51单片机的并口P1的8个IO端相连,然后各传感器的VCC和GND脚分别接电源和地。

根据单总线通信协议规定,在每一个单总线读写时序中,一条总线只能传输一位数据。MCU向单总线器件写数据时,MCU在拉低总线10~15uS后释放总线,即向单总线器件写1;若MCU拉低总线后保持60uS的低电平,则向单总线器件写0。

MCU从单总线单总线器件读取数据时,MCU将总线下拉为低电平1uS左右后释放总线,单总线器件在检测到总线电平被拉低后15uS后向MCU传输数据,若单总线器件发送1,则总线保持高电平,若发送0,则拉低总线。

具体对于一个DS18B20,我们要输出或输入各类数据时,可以采用位寻址方式,直接对连接单总线器件的IO端口进行位操作,产生上述时序以对单总线器件进行读写。但是,对于并行连接的多个DS18B20,如果还采用上述方法,程序就会变得比较复杂,而且速度也会很大的减慢,所以我们换一种方式,用字节寻址的方式来同时读写连接于一个并口上的一组DS18B20,这样就可以一次读入或写出8个位的数据,从而达到简化程序并提高读写效率的目的。

以并行方式该读取数据的具体实现算法如下:

使用这样的方法,我们就可以并行的方式一次读取不超过8个的DS18B20单总线温度传感器的温度值到一个8字节内存数组TData[]中,而所耗用的时间和读取一个DS18B20单总线温度传感器的时间几乎是相同的。不过,这种方式读取的各个数据位在内存中不是顺序排列的,而是如表1所示的那样的交叉排列的。我们必须再用一段程序处理一下,才能得到所需的各个温度值。

TData[7] TData[6] TData[5] TData[4] TData[3] TData[2] TData[1] TData[0] Data[0] Bit7.0 Bit6.0 Bit5.0 Bit4.0 Bit3.0 Bit2.0 Bit1.0 Bit0.0 Data[1] Bit7.1 Bit6.1 Bit5.1 Bit4.1 Bit3.1 Bit2.1 Bit1.1 Bit0.1 Data[2] Bit7.2 Bit6.2 Bit5.2 Bit4.2 Bit3.2 Bit22. Bit1.2 Bit0.2 Data[3] Bit7.3 Bit6.3 Bit5.3 Bit4.3 Bit3.3 Bit2.3 Bit1.3 Bit0.3 Data[4] Bit7.4 Bit6.4 Bit5.4 Bit4.4 Bit3.4 Bit2.4 Bit1.4 Bit0.4 Data[5] Bit7.5 Bit6.5 Bit5.5 Bit4.5 Bit3.5 Bit2.5 Bit1.5 Bit0.5 Data[6] Bit7.6 Bit6.6 Bit5.6 Bit4.6 Bit3.6 Bit2.6 Bit1.6 Bit0.6 Data[7] Bit7.7 Bit6.7 Bit5.7 Bit4.7 Bit3.7 Bit2.7 Bit1.7 Bit0.7

表1 内存中存储的数据Tdata[]与实际的8个温度读数Data0-7之间的关系

如表1所示,我们要设计一个将一个将纵向8位数据转换成横向8位的数据程序,便可得到各个传感器温度读数的数据字节。

数据转换的算法的实现如下:

具体对于DS18B20温度传感器而言,因为温度读数是以高字节和低字节两个字存储的,因此上述程序需要运行两次方能得到最终的读数。

同样,如果需要向各个单总线器件写入数据,也需要先把要写入各个单总线器件的数据存储到一个数组中,用上述算法进行转换,然后在写入。

写入数据的具体算法如下:

这样,通过上述方法,就可以实现一次对连接个一个MCU并口的不多于8个的单总线器件进行读写。

这种对多个单总线并行读写的方式虽然比传统的单线串接的方式使用了更多的MCU的IO端口,线路连接也使用了更多的连线,但是这样可以绕过对单总线器件的ROM ID的搜索和匹配操作,节省了每次数据读写操作时间;而且一次可以读写8组数据而所耗费的时间与读写一个单总线器件的时间基本相同,很大程度的提高了工作效率。另外,每个器件的读写都和MCU的一个IO端口对应,这样就可以很方便的应用在批量生产的工业产品上。所以,这种对并行读写的方式还是有一定的实际应用价值的。

[1]陈志英,李光辉.单总线(1-Wire Bus)技术及其应用[J].国外电子元器件,2003(8).

[2]潘勇,孟庆斌.基于DS18B20的多点温度测量系统设计[J].电子测量技术,2008(9).

[3]谢维成,杨加国.单片机原理与应用及C51程序设计[M].北京:清华大学出版社,2006.

[4]马忠梅,籍顺心.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,2003:53-58.

TP368.1

A

1674-6708(2010)24-0200-02

猜你喜欢
温度传感器器件总线
温度传感器DS18B20在温度计设计中的应用
一种高性能CMOS温度传感器
基于PCI Express总线的xHC与FPGA的直接通信
机载飞控1553B总线转以太网总线设计
XTR105电流变送器在温度传感器中的应用
旋涂-蒸镀工艺制备红光量子点器件
面向高速应用的GaN基HEMT器件
温度传感器在笔记本电脑散热系统中的应用
多通道ARINC429总线检查仪
一种加载集总器件的可调三维周期结构