在电流互感器(CT)测试过程中,经常需要保存测量结果,或者将测量结果上传至PC机。在保存时,数据是以测量日期为顺序进行保存的,即需要1片实时时钟和1片数据存储芯片。当前市场上比较流行的解决方案是使用DS1302或者DS12C887等时钟芯片,再配以E2PROM或者一片普通RAM。这些方案的缺点是需要外接晶体振荡器或者电池等来保护时钟信息和RAM中的数据,占用口线较多,而且使用E2PROM时又受到擦写次数的限制。深圳市兴威帆电子技术有限公司生产的SD2200EP是一款内置256 Kb NVRAM、支持I2C总线接口的高精度实时时钟芯片,连线简单,无需任何外围配套器件,断电之后仍能继续工作;使用MCS51系列单片机的任何两条口线均可对它进行操作,使用方便、可靠。
1 SD2200EP介绍
SD2200RAM系列(包括SD2200B/C/D/EP)是一种具有内置晶振、支持I2C总线的高精度实时时钟芯片。该芯片可保证时钟精度为±5×10-6(25±1 ℃以下),即年误差小于2.5 min;内置时钟精度调整功能,可以在很宽的范围内校正时钟的偏差(分辨率为3.052×10-6或1.017×10-6);通过外置的温度传感器可设定适应温度变化的调整值,实现在宽温范围内高精度的计时功能;内置串行NVSRAM为非易失性SRAM,擦写次数可达100亿次。该芯片内置一次性电池,电池使用寿命可在5年左右。SD2200RAM系列内部结构如图1所示。
图1 SD2200RAM系列内部结构
2 硬件设计
电流互感器测试仪是一个非常复杂的系统,程序量较大,MCU选用深圳宏晶科技有限公司的STC89C516RD+,该单片机具有64 KB ROM和1 KB RAM。在本系统中,单片机除了需要操作通用的键盘和显示的接口外,还需要对打印机、步进电机、声光报警等电路进行控制,所以对单片机有限的口线来说,资源是非常紧张的。本设计所选用的SD2200EP将实时时钟和掉电RAM集成在一起,使用两根线连接到单片机的任何两个引脚上就可以进行操作。SD2200EP是I2C总线接口方式,所以其硬件接口设计非常简单,大大简化了单片机的外围器件。SD2200EP的定时中断输出1和单片机的外部中断0相连接,将单片机的INT0配置为边沿触发方式。SDA、SDAE与单片机的P1.0脚相连,SDL、SCLE与单片机的P1.1脚相连。具体硬件原理图如图2所示。
图2 SD2200EP与STC89C516RD+硬件连接原理图
3 软件设计
由于普通的MCS51单片机没有I2C总线,所以使用两个引脚来模拟I2C时序。STC89C516RD+可以在40 MHz的频率下工作,并且可以设置为双倍速,其速度足以对I2C总线接口的芯片进行操作。下面介绍使用STC89C516RD+对内置NVRAM的实时时钟芯片SD2200EP进行读/写程序的设计,所有程序都是在Keil集成编译环境下编写完成的。
3.1 MCS51模拟I2C总线
I2C总线非常适合于典型的处理器应用。I2C协议允许系统设计者只使用两根线就可以将多达128个不同的设备连接在一起,极大地节省了单片机的口线。只需在这两根线上分别加一个10 kΩ的上拉电阻,即可解决阻抗匹配的问题。I2C器件通过各自的硬件连线方式来确定自己的地址,如在本设计中使用的SD2200EP的实时时钟地址为0110,NVRAM的地址为1010。不同器件竞争总线时,I2C总线协议解决了总线仲裁问题。典型的I2C总线接线方式如图3所示。
图3 典型的 I2C总线接线方式
对没有I2C总线接口的单片机来说,使用任何两根口线均可模拟I2C总线时序。在本设计中,使用P1.0和P1.1来模拟。限于篇幅,这里仅给出操作要点: ① 当SCL处于高电平时,SDA由高电平变成低电平时构成一个开始条件,对I2C总线的所有操作均须由开始条件开始。② 当SCL处于高电平时,SDA由低电平变成高电平时构成一个停止条件,此时I2C总线的所有操作均停止。③ 当SCL为低电平,且SDA线电平变化时,则数据由CPU输出到I2C总线;当SCL为高电平,且SDA线电平不变时,则CPU读取I2C总线上的数据;当SCL为高电平,且SDA电平变化时,I2C总线上为开始或停止条件。④ 数据传输以8位序列进行。I2C器件在第9个时钟周期时将SDA置位为低电平,即送出一个确认信号(ACK),表明数据已经被其收到。
在这里使用到5个公用函数:
bit I2CStart(void);//启动I2C总线,1=成功,0=失败
void I2CAck(void);//当读出的不是最后一个字节时,发送ACK
void I2CStop(void); //关闭I2C总线
bit I2CWaitAck(void); //返回值为1=有ACK,为0=无ACK
void I2CNoAck(void);//当读出的是最后一个字节时,发送NO ACK
3.2 实时时钟和NVRAM的操作
3.2.1 实时时钟的操作
实时数据寄存器是一个56位的存储器,它以BCD码方式存储,包括年、月、日、星期、时、分、秒的数据。实时数据的读/写操作都通过发送或接收年数据的第一位“LSB”开始执行的。
对实时时钟操作的指令格式如下:
其中,高4位称为“器件代码”,它代表实时时钟的器件地址,固定为“0110”;C0、C1、C2由3位操作指令构成对实时时钟操作的8条指令。对实时时钟读/写操作的流程如图4所示。
图4 SD2200EP实时时钟读/写流程
读写实时时钟的子函数为:
void I2CReadTime(uchar *timedata);//读取的7字节时钟信息
void I2CWriteTime(uchar *timedata); //写入的7字节时钟信息
3.2.2 NVRAM的操作
SD2200EP的NVRAM操作和实时时钟的操作指令格式基本相同。其中,NVRAM的器件代码固定为1010,操作码固定为000。对NVRAM的操作可以分为任意地址单字节写入、任意地址单字节读取、连续写入、连续读取、立即地址读取5种操作方法。图5为SD2200EP NVRAM连续地址读/写流程图。
图5 SD2200EP NVRAM连续地址读/写流程图
如果为任意地址读操作,则在接收到数据之后不进行判断,直接发送NO ACK信号关闭I2C总线即可。如果为任意地址写操作,则在写入数据之后不等待ACK信号,直接关闭I2C总线。立即地址读取可以发生在任何一次读取操作之后,读取时不需要发送地址信息,读取的地址为上次读取的地址加1。
连续读/写NVRAM的子函数为:
uchar I2CReadEEram(uint address,uchar *sramdata,uchar num);//连续读num个数据
void I2CWriteEEram(uint address,uchar *sramdata,uchar num);//连续写num个数据
在本设计中,需要保存系统参数、伏安特性数据和变比测试数据,并且保存的数据量比较大,所以在数据存储的过程中人为地将256 Kb的空间分成了3个区域,分别存储不同的数据。 在存储测试数据的过程中采用环形存储算法,在存储区域用完之后采用覆盖最开始采集数据的方法,有效地使用存储空间。当CT测试系统和上位机相连时,将存储在SD2200EP中的数据全部上传到PC机的数据处理软件中,以进行更详细的分析。
4 总结
SD2200EP是一种性价比较高的实时时钟加掉电存储方案,且使用I2C接口,具有电路简单、占用资源少、测试方便、功耗低等优点,可以方便地与任何数字系统进行对接。经过实际的现场运行,证明了这种方案是可靠、有效的。本设计主要是针对电流互感器测试系统的,将此方案稍加修改可以应用于任何需要这种功能的监控系统中。