摘 要:设计了一种基于单片机系统的数据采集移动存储器,其容量可达几兆位,传输速度可达1 Mb/s。为更好地解决智能仪器中非实时数据的采集、存储以及与计算机之间数据交换的问题提供了一种新的方法和思路。
关键词:移动存储器;I2C总线;EEPROM;PIC单片机
智能仪器是工业控制的重要部分,它所采集的数据是最珍贵的资料。目前,广泛应用于工业控制领域的智能仪表一般都采用RS-232串行接口实现对所采集的数据的上传。这就要求智能仪表和计算机最好处于同一个物理空间,或连接关系固定,才能够比较容易地完成数据的交换与传递。这种模式对于大多数以非实时数据采集为目标的测量与检测设备来说,实现起来很不方便。例如,有些测量与检测设备体积庞大、不便移动,有些设备已经固定在机架或管道上,要和计算机进行串口互连和数据上传是一件非常困难的事。为此,本文研制了一种数据采集移动存储器,较好地解决了智能仪器上非实时数据的采集以及与计算机之间数据交换的问题。
数据采集移动存储器采用先进的串行存储芯片和简单易行的并行接口技术,体积小、重量轻且无须额外供电。使用时,只需将此存储器插于测量或检测仪表的接口,便会自动采集到测量或检测数据,采集结束后,即可将此存储器拔下携带至计算机房,插入计算机的并行口,读出数据。一般的U盘虽然可以存储数据,但它需要特定的USB接口和非常复杂的难于用单片机系统实现的USB接口协议。
由于所采用的串行数据存储器具有很好的保密性,因此,该存储器还可以作为智能仪器的钥匙,或作为计算机软件的“加密狗”。在这种情况下,如果不插入移动数据采集存储器,智能仪器便不会响应操作者的指令,从而实现对智能仪器的一些重要功能的加锁保护。
这种数据采集、存储、移动、上传的“无线”技术,大大简化了串口连线带来的种种麻烦,可以在一定范围和应用领域内取代RS-232串口数据上传的实现方案。这种技术弥补了目前使用广泛的U盘无法或难于在智能仪表与计算机之间进行数据交换的缺陷,从而使串行存储器在工业测量、检测领域内得到新的应用。
1 移动数据采集存储器的基本原理
一般测量检测类智能仪器端的原理如图1(a)所示。其中,MCU为测量、检测类智能仪器中的CPU;端口P1.0和P1.1用来实现I2C总线的主机端口。VCC为智能仪器的电源端;GND为智能仪器的接地端;10 kΩ的上拉电阻用在SCL时钟频率为100 kHz的情况下,如果时钟频率为400 kHz或更高,则上拉电阻应为2 kΩ。
图1(b)为移动数据采集存储器,它主要由串行存储芯片和并行接口电路组成。SCL是同步时钟端口;SDA是串行数据端口;VCC为存储器的电源;GND为存储器的接地端。存储器由智能仪器供电。
在测量、检测类智能仪器工作时,数据采集移动存储器通过25芯的并行接口插入智能仪器相应的接口,智能仪器产生的数据会按约定的格式保存在串行存储芯片中。测量结束后,可将移动数据采集存储器拔下,携带至他处,利用计算机读取存储的数据或进行数据的再次采集与存储。
移动数据采集存储器及接口电路如图2所示。其中,U1为DB25型的25芯并口插头,可插入任何类型计算机的并行打印口插座。串行存储器芯片组的电源由计算机并行口的4~7和25管脚提供,并联电容用于滤波。SCL时钟信号由第2管脚产生,SDA信号接第13管脚。图2中的三极管用于防止干扰电平对存储芯片内部数据的损坏。传送数据时,将第3管脚置为高电平;在不传输数据时,将第3管脚置为低电平可将SDA信号锁定到低电平,屏蔽来自第13管脚的干扰。A0、A1、A2为片选或块选地址输入,通过接入固定高低电平,可以用这3个管脚进行容量扩展,最多可扩展8个芯片。
2 I2C串行存储器的特点与读写方式
串行存储器是移动数据采集存储器的主要器件,本文选择美国Microchip公司24xxx系列的串行存储器作为主要存储单元。24xxx系列是采用I2C串行总线进行数据传输的8管脚EEPROM器件。其容量从1 KB~256 KB(如24xx256),擦除写入周期可达100万次。采用单一电源供电(+5 V±10%),低功耗工作电流1 mA,备用状态时只有10 μA,三态输出,与TTL电平兼容。片内数据保存寿命达40年以上,工业品工作温度范围为-40℃~+85℃。
I2C总线是由Philips公司设计的两线制串行传输总线,由时钟线(SCL)和数据线(SDA)两根线组成。时钟线用于产生时钟节拍信号,数据线用于读/写数据。操作总是从启动位开始,在停止位后结束。I2C总线时序如图3所示。
(A)段:总线空闲状态。SDA和SCL都保持高电平。
(B)段:启动数据传输。当SCL为高电平状态时,SDA由高电平变为低电平的下降沿时被认为是“启动”信号。只有出现“启动”信号以后,其他命令才有效。
(C)段:停止数据传输。SCL保持高电平的状态下,SDA出现上升沿视为结束传送数据。停止信号过后,总线被认为空闲。
(D)段:数据有效(或总线忙)。为了保持数据稳定,只有当SCL为低电平的时候才允许SDA上的数据改变。这时数据线的状态就表示要传送的数据。
24xx256芯片的控制字与地址格式如图4所示。图4(a)中的固定序列“1010”是专门分配给24系列的从设备地址,紧跟其后的是3 bit片选位,最低位的R/W是读写标识,用来确定接下来的操作是读(“1”)还是写(“0”)。图4(b)中的高、低字节构成了215 B的存储容量。该系列芯片有单字节和页模式两种写入方式,有当前地址读取、随机读取和顺序读取3种数据读出模式。在写模式中,页写模式可一次性连续写入64 B;在读模式中,顺序读取模式具有最快的读取速度,可达到与同步时钟频率几乎相同的速度。对该存储器的操作可分为两个方面:存储器地址指针的定位操作以及数据的发送或接收操作。尤其在随机读模式中,应该先定位后读取。进行地址指针定位时,首先要依照上图3中的时序向总线发出写命令(R/W为“0”)的控制字节,接着发出高字节地址和低字节地址。读写操作时,首先应向总线发出控制字节(读为“1”,写为“0”),然后即可从总线读出此地址所指的字节数据或将总线上的字节数据写入该地址。存储器芯片每接到一个命令、地址或数据字节,或发送完一个完整的数据字节,都会向总线发送一个低电平应答信号“ACK”。MCU可通过检测“ACK”信号的响应来判断每一次的读写是否成功。
3 单片机端移动存储器的读写程序
串行存储器读和写的方法相似,这里只针对字节写入模式的流程和程序予以说明。图5(a)是向EEPROM写入一个字节的流程,图5(b)是如何向I2C总线发送一个字节的流程。向总线发送一个字节并判断是否被应答是单片机与串行存储器通信的基本操作,所以本例中用一个子程序来实现。这样,无论是命令、地址还是数据,只需赋予不同的初值,即可调用这段通用的子程序。
下列向移动存储器的写入数据的程序适用于PIC单片机,并已在批量生产的工业设备上可靠运行,可直接移植。该程序由WRITE、TX、BITOUT和BITIN等子程序构成。WRITE是向移动存储器的某一地址写入一个字节数据的子程序。该程序中的子程序BSTART和BSTOP分别是产生一个起始位和停止位的子程序,限于篇幅不再详述。高低地址存入ADDR1、ADDR0寄存器,待发送数据存入DATAO寄存器。
WRITE
CALL BSTART //调子程序,产生一个起始位。
MOVLW B′10100000′ //发送缓冲寄存器TXBUF置控
//制字内容,a2,a1,a0为‘0’
MOVWF TXBUF //选择1#芯片,“写”方式。
CALL TX //调字节发送子程序,将TXBUF
//中的控制字发送到总线上
MOVF ADDR1,W //将高字节地址存入TXBUF中
MOVWF TXBUF
CALL TX //调子程序,发送高字节地址
MOVF ADDR0,W //将低字节地址存入TXBUF中
MOVWF TXBUF
CALL TX //调子程序,发送低字节地址
MOVF DATAO,W; //将DATAO中的待存储数据
//送入TXBUF中
MOVWF TXBUF
CALL TX //调子程序,发送该数据字节到总线
CALL BSTOP //调子程序,产生一个停止位
RETLW 0
将发送寄存器TXBUF中的命令或数据内容向移动存储器发送的子程序为:
TX
MOVLW .8
MOVWF COUNT //循环计数器,连续发送8 bit
TXLP
BCF EEPROM,DO //发送标识位清零
BTFSC TXBUF,7 //若发送寄存器高位为‘0’则
//EEPROM的‘DO’位为‘0’
BSF EEPROM,DO //否则为‘1’
CALL BITOUT //调用子程序发送该位
RLF TXBUF,1 //发送寄存器数据左移一位
DECFSZ COUNT,1 //若已将最低位移至最高
//位,则停止,否则继续循环发送
GOTO TXLP
CALL BITIN //若8 bit数据发送完毕,则调
//用子程序接收应答信号‘ACK’
BTFSC EEPROM,DI //若无应答信号
CALL KEY_VO //则调用子程序‘KEY_VO’发音提示
RETLW 0 //否则返回
发送一位数据的子程序为:
BITOUT
BANKSEL TRISC//设置SDA和SCK口为输出模式
BCF TRISC,SDA
BCF TRISC,SCK
BANKSEL PORTC //选择PORTC口
BTFSS EEPROM,DO //若DO位为‘1’,则SDA
//口置‘1’,否则置‘0’
GOTO BITLOW
BSF PORTC,SDA
GOTO CLKOUT
BITLOW BCF PORTC,SDA
CLKOUT BSF PORTC,SCK //SCK置‘1’,延时后置‘0’
NOP
NOP
NOP
NOP
BCF PORTC,SCK
RETLW 0
接收一位数据的子程序为:
BITIN
BSF EEPROM,DI //EEPROM的DI位预置‘1’
BANKSEL TRISC //将SDA口设为输入模式
BSF TRISC,SDA
BANKSEL PORTC
BSF PORTC,SCK //SCK时钟线置‘1’,并延时
NOP
NOP
NOP
NOP
NOP
BTFSS PORTC,SDA //测试SDA口的电平,并暂存
//在DI位
BCF EEPROM,DI
BCF PORTC,SCK //SCK时钟线返回‘0’
RETLW 0
计算机端读写数据采集移动存储器的程序可以用任何一种高级语言来编写,其读写时序和读写流程与上述单片机端相似。只需将图2电路中的SDA和SCL信号分别定义在并行打印口的13脚和2脚即可。
本文介绍了一种新颖的移动数据采集存储器,其容量可达几兆位,传输速度可达1 Mb/s。较好地解决了各种智能仪器上非实时数据的采集以及与计算机之间数据交换的问题。实践证明,该存储器可靠性强、成本低廉、易于实现,具有很强的适用性和非常广泛的推广价值。
参考文献
[1] 窦振中,汪立森.PIC系列单片机应用设计与实例[M].北京:北京航空航天大学出版社,1999.
[2] 杨青川,甄兴福,李芳.I2C总线器件与非I2C总线单片机之间数据传输的软硬件设计[J].仪表技术与传感器,2004(5):40-41,48.
[3] Microchip Technology Inc.. 256K I2C CMOS serial EEPROM DS21203M[Z]. 2004.
[4] Microchip Technology Inc.. 28/40-pin 8-bit CMOS Flash microcontrollers DS30292A[Z]. 1998.