摘要:介绍了基于I2C总线接口的实时时钟芯片的应用功能,给出了DS1337在基于EP9315芯片的嵌入式系统中的接口电路,同时给出了在中通过驱动程序对其进行串行扩展,以实现读写控制的具体方法。
关键词:DS1337;EP9315;ARM嵌入式系统;I2C总线;Linux操作系统;驱动程序
引言
DS1337串行实时时钟芯片是一种低功耗、全部采用BCD码的时钟日历芯片,它带有两个可编程的定时闹钟和一个可编程的方波输出。其地址和数据可通过I2C总线串行传输,能提供秒、分、时、日、星期、月和年等信息。在月末天数小于31天的情况下,它也能自动调整月份,包括对闰年的校正。时钟可以以24小时模式工作也可以以12小时模式工作。芯片的工业温度范围为-40~+85摄氏度,提供有8引脚的DIP和SOIC封装。
EP9315是352脚PBGA封装的工业级ARM芯片,它是美国CIRRUSLOGIC公司生产的系列ARM芯片中的一员。EP9315的核心是200MHz的ARM920T处理器,带有16K字节的指令Cache,16字节的数据Cache,100MHz的系统总线以及适合Linux,WindowsCE等操作系统的内存管理单元(MMU)。EP9315带有MaverickCrunch数学引擎,能够处理有关浮点、整数和信号处理的指令,能够优化数字音乐压缩和解压缩算法。另外,EP9315还集成了丰富的各类外设接口,包括32bit的SDRAM接口、32/16bit的SRAM/FLASH/ROM接口、I2C接口、EIDE接口、1/10/100M以太网接口、UART接口、全速USB主机接口、IrDA接口、LCD和带图形加速的光栅显示接口、PCMCIA接口、触摸屏接口、SPI接口、8X8键盘接口、音频接口等。此外,它还带有DMA通道、实时时钟、32bit和16bit普通定时器、看门狗定时器、中断控制器、启动ROM等诸多的内部器件。EP9315自带有I2C总线接口,能够非常方便地使用目前各种带有I2C总线接口的器件。但是,对于I2C总线,EP9315只提供2个bit的数据缓存位和2个bit的数据方向控制位,而没有提供更多的硬件控制电路,因此,I2C总线所需的时序都要使用软件产生,也就是说I2C总线上的时钟信号和数据信号都需要软件来实现。
DS1337实时时钟芯片
引脚功能 DS1337的引脚排列示意图如图1所示。各引脚的功能如下: VCC,GND:直流电源和接地端,VCC的输入范围在1.8~5.5V之间。X1,X2:标准的32.768kHz的石英晶振接入端,内部晶振电路设计要求晶振特定电容负载为6pF。另外,这两个引脚还可以有其它接法,即:X1脚连接外部振荡信号源,而将X2脚悬空。
图1 DS1337引脚示意图
SCL:串行时钟输入,用来在总线上同步数据传输。
SDA:串行数据输入输出,SDA是I2C总线接口的数据输入输出引脚,开漏输出,使用时要求接一个上拉电阻。
SQW/:方波/中断输出,可通过对DS1337的内部控制寄存器进行编程来控制这个引脚是输出方波还是输出中断信号。该引脚是开漏输出,使用时要接一个外部的上拉电阻。
:中断输出端,使能时,如果闹钟寄存器的设定值与当前时间匹配,该脚会输出一个低电平。该引脚也是开漏输出,要接上拉电阻。
内部地址分配 DS1337的内部寄存器地址分配方式如图2所示。在多字节存取过程中,当地址指针到达0FH,即寄存器空间的最后一个单元时,下一个操作地址将翻卷到00H。在I2C总线的开始、停止、或在地址指针增加到00H位置时,当前时间会传送给一组二级寄存器,在这期间,时钟照常运转。这样就不必在读取当前时间期间,在主寄存器更新的情况下再次读取主寄存器中的数据,从而防止发生错误。
时钟和日历 读取适当的寄存器可以获得正确的时间和日历信息。实时时钟寄存器的地址如表1所列。设置和初始化时间和日历可通过写相应的寄存器字段来实现,寄存器的数据格式以BCD码表示。对于不符合逻辑的时间和日期格式数据,写入时都会导致未定义的操作。
DS1337既可以工作在12小时模式下,也可以工作在24小时模式下。小时寄存器的位6被定义为12小时模式或24小时模式选择位,该位为1时,选择12小时模式。在12小时模式时,位5是AM/PM标志位,该位为1时表示PM。当在24小时模式时,位5是第二个十位(表示20到23小时)。月寄存器的第7位是世纪位,当年寄存器从0到99溢出时,该位发生变化。
闹钟 DS1337有两个定时闹钟。闹钟1的定时时间由07H到0AH的寄存器设置,而从0BH到0DH的寄存器则设置闹钟2的定时时间。通过设置控制寄存器的INTCN位可以控制闹钟的两种操作模式:一是两个闹钟具有各自独立的中断输出信号,二是两个闹钟共同使用一个公共的中断输出信号。每个定时寄存器的第7位是屏蔽位,每个定时闹钟的所有屏蔽位都为0且闹钟的定时时间和00H到06H寄存器中的值匹配时,发生闹铃。闹钟还可以通过编程设定在每秒、每分钟、每小时、一个星期的某天、一个月的某日重复产生闹钟中断,其配置如表2所示。但表中未列出的配置可能会导致不合理的操作。
表1 DS1337的地址分配图
Day/Date寄存器的第6位是DY/DT位。该位为1时,表示该寄存器中位0到位5中的值是一个星期的一天;它为0时,表示该寄存器的位0到位5中的值是一个月中的一天。
控制寄存器和状态寄存器 DS1337中有一个控制寄存器和一个状态寄存器,可用于控制实时时钟、闹钟和方波的输出。控制寄存器各位定义如表3所列。其中:
:振荡器使能位。该位为0,振荡器起振;为1,振荡器停振。刚上电时,该位为0;RS1,RS2:方波输出频率选择位。RS1和RS2共有四种组合,分别对应的方波输出频率为1Hz,4.096kHz,8.192kHz,32.768kHz。在刚加电时,方波输出频率设置是32.768kHz。
INTCN:中断控制位。用于控制两个闹钟与中断输出脚之间的关系。为1时,两个闹钟在满足定时条件时,各自有独立的中断输出。为0时,两个闹钟共用一个中断输出脚,而脚SQW/为方波输出端。开始上电时,该位为0。
A1IE:闹钟1中断使能位。为1时,允许状态寄存器的A1F位输出到脚。上电时该位为0,此时不能用A1F位初始化信号。
A2IE:闹钟2中断使能位,该位的作用与A1IE位相同。
DS1337的状态寄存器各位定义如表4所列, 各位的作用如下:OSF:振荡器停止标志。该位为1,表示振荡器已停止。有四种情况能产生这样的结果:一是芯片刚上电,二是Vcc引脚电压不足,三是位为1,四是晶振受到外部影响(如噪声等)。A1F,A2F:闹钟标志位。为1时,表示闹钟设定时间与当前时间匹配,并产生中断输出。
接口电路设计
EP9315是基于ARM920T核并带有诸多外设控制器的单片处理器系统(SoC)。可以和较少的外围器件组成功能强大的小型计算机系统。以完成手工输入、屏幕显示、数据采集、数据传输等众多功能,系统采用Linux操作系统。其中EP9315与DS1337的接口电路如图2所示。
图2 EP9315与DS1337的接口电
图2中,EGPIO6是EP9315的通用输入输出I/O口EGPIO的16个管脚的第7脚。EGPIO的16个管脚的每个都可单独配置成输出、输入或中断输入功能。DS1337的Vcc脚使用系统3.3V和3V的电池同时供电。在系统未加电时,电池可以维持对DS1337的供电,以使振荡器继续工作,从而准确计时,这样就不用在系统加电起动之后,重新设置DS1337的时间和闹钟定时。
表2 闹钟屏蔽位设置方式
表3 控制寄存器位定义
驱动程序设计
对DS1337时钟信息的设置和读取,以及对闹钟的设置都需要编写软件来实现。本系统运行在Linux操作系统下,DS1337作为系统的一个硬件设备,系统对它的操作都是通过Linux操作系统内的驱动程序来完成的。
在Linux系统中,设备分为字符设备和块设备两种。DS1337属于字符设备,用户模式的程序对这类设备可以像对普通文件一样对它进行操作,因而字符设备类的驱动程序至少要实现Open(),Close(),Read()和Write()四个系统调用函数。这四个系统调用函数是内核数据结构file_operations内部各项的其中四项。另外,一个设备驱动程序还和两个数据结构有关,它们是inode结构和file结构。但直接相关的数据结构是file_operations。编写一个Linux系统驱动程序并对它进行测试主要有以下步骤:
(1)编写各个文件操作函数,即Open(),Close(),Read(),Write()等系统调用函数; (2)声明file_operations结构,给结构成员赋值; (3)编写初始化函数和清除函数,并用两个宏module_init和module_exit定义这两个函数; (4)创建一个字符设备入口点,即使用mknod/dev/ds1337cxxx0命令来建立设备文件节点其中,c代表字符设备,如果是块设备,这个位置应该是b;参数xxx代表该设备的主设备号,0代表该设备的次设备号; (5)编写测试应用程序; (6)使用insmodds1337.o命令加载驱动程序; (7)运行测试程序对驱动程序进行测试; (8)使用rmmodds1337.o命令卸载驱动程序;
实际上,在测试过程中,如果发现有问题,还要再修改各个文件操作函数,然后再从第1步重新开始上面的过程,直到最后形成最终的完善的驱动程序。
DS1337的I2C总线上的数据传输速率在标准模式下是100Kbit,在高速模式下为400Kbit。对于I2C总线上的START条件和STOP条件以及数据位的传输时序,由于在EP9315中没有更多的硬件控制电路,因此需要编程实现。需要注意的是,在I2C总线上,数据的变化发生在SCL信号线为低电平的时刻;在SCL信号为高电平时,数据线SDA上的数据信号应该保持稳定。START条件是在SCL信号为高电平时,SDA产生一个由高变低的电平变化,此后开始一个数据传输过程。
STOP条件是在SCL信号为高电平时,SDA产生一个由低变高的电平变化,并在之后的几个时钟周期总线被释放,变成“闲”状态。在Linux系统中,可以利用短延时函数udelay(unsignedlongusecs)来实现I2C总线上的延时功能。具体的驱动程序在此不再给出。
结束语
DS1337芯片是一种非常实用的串行接口实时时钟芯片,可广泛应用在GPS、POS终端机、MP3播放器等各种手持设备,消费电子设备,办公电子设备,医药电子设备和通信设备等各种需要实时时钟的系统中。该芯片通过I2C接口与控制处理器芯片通信,具有体积小,引线少等特点。实际上,即使没有专门的I2C接口来控制处理器芯片,只要有两条I/O口引脚,也可以通过软件来模拟I2C总线时序,以完成芯片间的通信,因而特别适用于各种嵌入式设备使用。 |