引言
实时时钟已被广泛应用于各种电子产品,为系统监控提供必要的时间信息。利用ST公司提供的多种类RTC芯片,用户可以在设计中方便地针对具体应用选择相应的芯片。本文讨论了实时时钟M41T0在
PSD3251系统中的应用、电路设计以及程序开发。
PSD3251结构和工作原理
PSD3251带有一个8032微控制器,通过总线与PSD模块组合在一起的具有超大存储容量和可编程器件等扩展部件的SOC单片机,具有运算与寻址能力强、存储空间大、片内集成外设丰富、功耗低等优点。下面对其主要功能模块做一简要的介绍。
存储器系统
存储器系统包括256B的RAM、内核中128B的特殊寄存器(SFR)和PSD模块中256B的SFR,SFR包含了片内所有资源的全部内容,通过控制SFR,就可以控制芯片的各个引脚,实现各种功能,简单而方便。
另外还有2K的SRAM,可以用外接电池保持内容。外接电池连接到电压保持脚(VSTBY,PC2),只要电池电压不低于2V,SRAM内容就将一直保持,为用户存储重要数据提供很大方便。
主次2片大容量的FLASH存储器,可分别配置成数据或程序存储器,并且可以分页,以满足64KB的寻址空间。
中断系统
中断系统共有8个中断源,优先级依次为:INT0外部中断、第二异步串口中断、定时器0中断、I2C中断、INT1外部中断、定时器1中断、异步串口中断、定时器2中断。中断源通过中断允许(设定中断允许寄存器IE、IEA)、中断优先级排队(设定中断优先级寄存器IP、IPA)进行响应处理,每一个优先级都可设置为高、低两种优先级,为用户控制提供很大的方便,还可实现中断嵌套。
众多的I/O口
I/O系统共有5个端口,P1口、P3口、P4口、PB口和PC口。除了特殊外围设备接口功能外,P1和P3与标准的8032 MCU的I/O口完全相同。P4是新增加的端口,作为I/O口时,功能与P1和P3相同。这三个端口都是双向I/O口,可以对其直接进行读写。
PB和PC2个可编程I/O端口在PSD模块中。每个端口引脚都可以单独配置,允许为多项功能。端口可以用ST公司专门的PSD模块配置软件PSDsoft
Express来配置,也可以通过MCU写CSIOP(Chip-Select I/O Port,是PSD内部寄存器的集合,必须给CSIOP分配足够的地址空间,然后在CSIOP中访问某个寄存器,将数据手册中的偏移加到CSIOP的基地址上)空间的片内寄存器来配置,这就为用户控制端口引脚的输入/输出信号提供了方便。
集成多种功能
除了提供两个功能独立的全双工异步串行通信口之外,还提供了4个8位的A/D转换器和4路8位的PWM通道,可以进行模拟信号的采集和控制。此外,还提供了I2C接口,可与I2C器件进行通信。本文中介绍的M41T0就是采用I2C总线进行数据通信。
PSD3251通过I2C总线对M41T0进行时间设定并实时读取时间。
M41T0结构和工作原理:
M41T0是一款串行实时时钟,计时器RAM是一个低功耗串行计时器,内建32.768KHz振荡器(外部晶体控制)。八个寄存器用于实现时钟/日历的功能,配置了二进制编码的十进制格式。地址和数据的传输通过两线的双向总线连续传输。在每次的读或写数据字节时内建地址寄存器自动增加,引脚图如图4所示。
操作:
M41T0 时钟在串行总线上作为一个被控器件运行。获取访问的开始条件是跟随一个正确的被控地址(D0H),器件可被连续访问的8
个字节依次是:
1.秒寄存器
2.分钟寄存器
3.世纪小时寄存器
4.天寄存器
5.星期寄存器
6.月寄存器
7.年寄存器
8.控制寄存器
读模式:
在读模式下,首先要设置受控地址,MCU才可读取受控M41T0,如图1所示。然后是写模式控制位(R/W= 0) 和应答位,控制地址An被写到芯片内的地址指针。其次进行下一次的开始条件,重复受控地址,然后设置读模式控制位(R/W
= 1),此时主控器 PSD3251由发送变成接受,地址内的数据字节将被发送到主控器,接收之后发送一个应答位给受控发射器。地址指针的增加依附于一个应答脉冲的接收,M41T0受控发送的数据字节现放置地址An+1,主控接受器读取和应答这个新字节,同时地址指针增加到An+2,连续读时这些周期地址将连续增加,直到主控接受器给被控发送器发出停止条件,其时序如图2所示。
图1 受控地址位置(略)
图2 读模式时序(略)
写模式:
在写模式中,主控器 PSD3251先发送开始条件,然后设置受控地址、写模式控制位(R/W= 0)、写入芯片的地址指针,接下去将阻止数据命令写入存储器。在接收到一个应答脉冲之后,内部地址指针增加到下一个地址位置,M41T0受控接受器在接受受控地址之后将发送一个应答脉冲给主控发送器,重复地接受命令地址和每一个数据字节,其时序如图3所示。
图3 写模式时序(略)
时钟操作:
8字节时钟寄存器用于双向设置时钟和读取来自时钟的日期和时间,数据表现为二进制码的十进制格式。秒、分钟和小时包含在前三个寄存器。小时寄存器的位D6和位D7包含了世纪使能位
CEB和世纪位 CB,设置世纪使能位CEB为"1",将使世纪位CB锁定,无论从"0"上升到"1"还是从"1"下降到"0",世纪都将反转。若设置世纪使能位CEB为"0",将使世纪位CB不锁定,包含天的寄存器3是从位D0到位D2。寄存器4、
5、 6包含星期、月和年,最后的寄存器是控制寄存器。寄存器0的第7位(D7)含义是停止位,当把这一位设置为"1"时,将使振荡器停止振荡。假如期望该器件废除大量的计时,振荡器可以停止振荡,以减小电流的消耗。复位以后为"0",
振荡器在四秒之内重新启振(典型值为1秒)。
7个时钟寄存器一次可读一个字节或连续整块读取,控制寄存器(地址为7)可以单独访问。7个时钟地址的任意一个的读取在确保时钟更新时不会发生,假如时钟地址正在读取,时钟寄存器的更新将延时250ms,确保读取在更新发生之前完成,可预防在读取期间数据的变动。
时钟电路:
时钟电路如图4所示。
图4 时钟电路(略)
软件设计
应用程序的特点就是通过控制特殊功能寄存器(SFR)以及各种自定义寄存器来实现各种功能。主要包括I2C总线初始化程序、发送时间信息子程序、接收时间信息子程序、中断等待子程序和中断服务程序。程序框图如图5所示。
图5 程序框图(略)
发送时间信息子程序
void i2c_xmit (unsigned char i2c_address, unsigned char start_address,
unsigned char data_len)
{
while ((S2STA & BBUSY) != 0); // 等待I2C忙标志清零
i2c_master = 1;
i2c_xmitr = 1;// 设置主机发送模式
S2DAT = i2c_address;// 设置I2C地址
S2CON |= ENI;// 使能I2C
S2CON &= ~STO;// 清I2C停止标志
S2CON |= STA;// 设置I2C起始标志
S2CON &= ~AA;// 清应答使能信号
i2c_wait_for_int();// 等待中断,10ms
S2CON &= ~STA;// 清起始标志
S2DAT = start_address; // 发送首地址
i2c_wait_for_int();S2CON &= ~STA;// 清起始标志
for(i=0; i < (data_len-1); i++){
S2DAT = i2c_xmit_buf[i];
i2c_wait_for_int();S2CON &= ~STA;}
S2CON |= STO;// 设置停止标志
S2DAT = i2c_xmit_buf[i];// 发送最后一个字节
i2c_wait_for_int();
}
接收时间子程序:
void i2c_rcv (unsigned char i2c_address, unsigned char start_address,
unsigned char data_len)
{
while ((S2STA & BBUSY) != 0);
i2c_master = 1;
i2c_xmitr = 0;// 设置主机接受模式
S2DAT = i2c_address;// 配置I2C从机地址
S2CON |= ENI;
S2CON |= STA;
S2CON &= ~AA;
i2c_wait_for_int();
S2CON &= ~STA;
S2CON |= STO;
S2DAT = start_address;
i2c_wait_for_int();
S2DAT = 0xFF;// 发送虚假字节,使SDA为高
S2DAT = (i2c_address | 0x01);// 重新发送从机地址 ( R/W 位为1)
S2CON |= ENI;
S2CON &= ~STO;S2CON |= STA;S2CON &= ~AA;
i2c_wait_for_int();
S2CON &= ~STA;S2DAT = 0xFF;// 发送0xFF,使SDA为高
S2CON |= AA;// 设置应答使能标志
i2c_wait_for_int();
for(i=0; i < (data_len-1); i++){
dummybyte = S2STA;// 读取寄存器 S2STA的内容
i2c_rcv_buf[i] = S2DAT;// 读取数据到缓冲
i2c_wait_for_int();
}
S2CON &= ~AA;// 清应答使能标志
i2c_rcv_buf[i] = S2DAT;// 获取最后一个字节
i2c_wait_for_int();
dummybyte = S2STA;
i++;
i2c_rcv_buf[i] = S2DAT;
}
调试中需要注意几个问题:首先在调试发送子程序时,要先发送7个字节,发送完毕后要先设置停止标志,然后再发送第八个字节,发送完毕后总线会自动发送停止标志。若发送完8个字节再设置停止标志,先前发送的数据会受到破坏。其次,调试接收子程序时,在写完首地址和读受控地址后,都需要发送0xFF,释放总线。在接收数据时,也需要在接收最后一个字节之前清应答使能标志,否则在接收到最后一个字节后也会产生应答信号,不符合读模式时序。
结束语
电路中采用了备份电池,即使系统掉电,M41T0也能正常工作,不影响时钟的计时。 PSD3251的电压保持脚PC2(VSTBY)与外接电池相连,在程序中把存储时间信息的寄存器分配在SRAM中,即使发生掉电,存储在SRAM中的内容也将保持。这样就为用户存储重要数据信息提供了极大的方便;
如果供电电压低于电池电压,内部电源将切换到电池电压,能够很好的维持系统的稳定,提高系统的抗干扰性。本系统结构相对简单, PSD3251有很强的可扩展性,可满足用户多方面的需求。时钟芯片M41T0成本较低,且无需考虑供电问题,有较强的稳定性,具有良好的应用前景。
|