随着科技的高速发展,现代工业测控领域的很多应用中都需要实现大量数据的定时采集存储。笔者以为海流计设计的海流数据采集存储接口电路为例,介绍一种定时采集存储系统的工作原理及其实现方法。
1 总体结构
在很多情况下,尤其是恶劣的工作环境下,高性能的单片机和大容量的Flash存储器是数据采集存储系统的最佳选择,本文介绍的系统也是基于这样的考虑。系统硬件结构并不复杂,包括高性能单片机C8051F021、实时时钟芯片SD2300、大容量Flash存储器K9G8G08及其外围电路,如图1所示。工作原理也较为简单,通过串口将单片机C8051F021与海流计相连,通过对单片机的编程实现对海流计的控制和使用。同时,为了实现定时采集和数据存储的功能,还需将实时时钟芯片SD2300和大容量Flash存储器K9G8G08的相应引脚与C8051F021的 GPIO相连。SD2300通过发送定时中断

图1 海流计数据定时采集存储系统框架图
使得C8051F021在预定时刻通过串口采集若干组流速和流向数据,然后将其存储在K9G8G08中。
2 硬件设计
2.1 高性能单片机C8051F021
C8051F021单片机是集成在一块芯片上的混合信号系统级单片机。芯片上有64位数字I/O。
C8051F021单片机具有片内看门狗定时器、VDD监视器和时钟发生器,可以说是真正的、可独立工作的、完整的SoC(片上系统)。片上所有的模拟和数字设备都可以使能或关闭,也可以由用户设置。片内的Flash存储器可以在电路(即由用户程序在运行时)编程(读写),为用户提供了非挥发性存储器,并允许现场更新8051程序。
2.2 SD2300与C8051F021的硬件接口设计
SD2300是深圳市兴威帆电子技术有限公司开发的一种具有内置晶振、两线式串行接口的高精度实时时钟芯片。较SD2000而言,SD2300具有更宽的定时范围、更多的周期性中断选择,并增加了数字精度调整寄存器、30 s时间调整和晶振停振检测等功能。最显著的改动是对时钟数据/寄存器的访问由通过不同命令字改为地址直接寻址,使得芯片的使用更加灵活,并提高了程序编写的可读性。
SD2300的接口为I2C总线。对于具有I2C总线接口的单片机,只需将SD2300的SCL、SDA脚与单片机的SCL、SDA脚相连;对于没有I2C总线接口的单片机,可以用通用I/O口来模拟I2C总线。如图2所示,单片机C8051F021的P0.6模拟SCL,产生I2C总线的时序同步信号;P0.7模拟SDA,实现I2C总线的串行数据输入/输出。图2中的INTRA、INTRB为定时中断输出,SDA和SCL为时钟电路的串行时钟脚,SDAE和SCLE为E2PROM的串行时钟脚。

图2 SD2300与C8051F021的部分硬件接口电路
2.3 K9G8G08与C8051F021的硬件接口设计
K9G8G08容量为8 Gb(8 858 370 048位),包含524 288行(页)和2 112×8列。在列地址2 048~2 111处有备用的64列存储单元。2 112字节的数据寄存器与存储器阵列相连,用来为在页读或页编程操作时I/O端口和存储阵列间的数据传输服务。存储器阵列由32个存储单元串行连接在一起,构成了一个NAND结构。每32个存储单元处于不同的页中。一个存储单元包括2位数据。一个块由2个NAND结构串组成,总共包含1 081 344个NAND结构。编程和读操作均以页为单位,而擦除操作以块为单位。存储器阵列包含4 096个256 KB的可擦除块。K9G8G08采用8个I/O引脚的多次复用方案。这就使得其外部引脚数显著减少,并且可以不改变现有系统的板级设计而进行系统升级。指令、地址和数据通过在CE为低电平时把WE引脚拉低而写入I/O引脚,在WE的上升沿被锁存。CLE和ALE通过I/O引脚分别被用在指令和地址的多路传输中。一些指令需要1个总线周期,例如重启指令、读状态指令等;另一些指令则需要2个周期,例如页读、块擦除和页编程操作,一个周期用来设置,另一个周期用来执行。1 Gb的物理地址空间需要30位的地址,5个周期来寻址(2个列地址,3个行地址)。页读和页编程操作在相应的指令后需要同样的5个地址周期。而在一个块擦除操作中,只需要3个行地址[1]。因此,可将C8051F021的P2口直接与这8根I/O连接,其他控制引脚接C8051F021的相应引脚,如图3所示。K9G8G08通过CLE和ALE信号线实现I/O口上指令和地址的复用。指令、地址和数据都通过拉低WE和CE从I/O口写入。

图3 K9G8G08与C8051F021的硬件接口电路
3 软件设计
3.1 系统软件设计

图4 系统软件设计流程
系统软件的设计流程如图4所示。首先完成系统的初始化工作,包括C8051F021的初始化和SD2300的定时中断设置,然后系统进入等待状态。待到达预定时刻后,SD2300发出定时中断,使C8051F021进入中断处理程序,进行数据采集和存储。存储完毕,系统再次进入等待状态,等待下一次定时中断的到来。
3.2 SD2300的软件接口设计
SD2300的I2C接口与C8051F021的GPIO相连,通过GPIO来模拟I2C,编程简单,操作方便。SD2300的访问控制通过寄存器直接寻址实现,其内部的寄存器如表1所列。
表1 SD2300内部寄存器说明

SD2300通过两线式串行接口方式接收各种命令并读写数据。下面具体介绍两线式串行接口方式。
① 开始条件:当SCL处于高电平时,SDA由高电平变成低电平构成一个开始条件。对SD2300的所有操作均必须由开始条件开始。
② 停止条件:当SCL处于高电平时,SDA由低电平变成高电平构成一个停止条件。此时SD2300所有的操作均停止,系统进入待机状态。
③ 数据传输:当SCL为低电平,且SDA电平变化时,数据由C8051F021传输给SD2300;当SCL为高电平,且SDA电平不变时,C8051F021读取SD2300 E2PROM发送来的数据;当SCL为高电平,且SDA电平变化时,SD2300收到一个开始或停止条件。
④ 确认:数据传输以8位序列进行。SD2300在第9个时钟周期时将SDA置位为低电平,即送出一个确认信号,标明数据被其收到[2]。
鉴于篇幅所限,仅以SD2300的设定开始采集时间程序为例,介绍一下SD2300的软件接口编写。
void I2CSetStartTime(void) {//设置开始采集时间
I2CStart();
I2CStop();
I2CStart();//开始条件
I2CSendByte(0x64); //设定采集时间,在AALE(BALE)=0//时设置,之后设置AALE(BALE)=1
I2CWaitAck();
I2CSendByte(0x80);//从分定时寄存器开始写起,地址为8H
I2CWaitAck();
I2CSendByte(0x03);//分
I2CWaitAck();
I2CSendByte(0x08);//小时
I2CWaitAck();
I2CSendByte(0x08);//天
I2CWaitAck();
I2CStop();
}
3.3 K9G8G08的软件接口设计
相比于三星公司的Flash存储器KM29U128T,K9G8G08不仅在容量上得到了极大的提高,操作的多样性和灵活性也有显著改进。例如,支持一页内的随机数据读写,并提供了一种特殊的TwoPlane页编程操作,可以支持两页的同时写入, 其操作指令如表2所列。K9G8G08引脚与KM29U128T引脚完全兼容,如果今后想再次升级系统存储容量,无需更改硬件设计。仅以页读程序为例,介绍一下K9G8G08的软件接口设计。
表2 K9G8G08操作指令表

页读操作先写入5个周期的地址,然后向指令寄存器写入指令00h和30h。2 112字节在60 μs内被写入所选页的数据寄存器中。系统控制器通过R/B引脚的电平来判断数据的写入是否完成。一旦一页的数据载入了数据寄存器,就可以随着接下来的RE引脚的脉冲在30 ns内被读出。RE时钟反复地从高电平到低电平的跳变,使得所选的开始列地址到结束列地址之间的数据被输出。其程序流程如图5所示。

图5 页读程序流程
4 总结
笔者为海流计设计的数据定时采集存储系统,经过反复实验,能够按照预定时刻准时进行数据采集工作,数据存储完整准确,整个系统工作稳定可靠。该系统的设计为相关应用提供了参考。