第4节 IIC应用实例━━GB60与PCF8563时钟芯片通信
推荐给好友
打印
加入收藏
更新于2008-07-25 19:55:03

 本节以具有IIC接口的时钟芯片PCF8563为例,阐述M68HC08系列单片机的IIC接口应用的基本方法,给出硬件设计与软件设计要点,目的是使读者了解IIC接口的实际应用方法与应用范围。GB60中含有IIC接口模块,因此给出PCF8563在GB60中的应用实例。

11.4.1 PCF8563芯片简介

PCF8563是PHILIPS公司推出的一款工业级内含IIC总线接口功能的具有极低功耗的多功能时钟/日历芯片。PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务甚至可为单片机提供看门狗功能。内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制IIC总线通讯方式,不但使外围电路极其简洁,而且也增加了芯片的可靠性。同时每次读写数据后内嵌的字地址寄存器会自动产生增量。当然作为时钟芯片PCF8563亦解决了2000年问题。因而PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

1.PCF8563芯片特性
①低工作电流:典型值为0.25µA(VDD=3.0V,Tamb=25℃时)。
②电压范围1.0-5.5V,复位电压标准值Vlow=0.9V。
③开漏中断输出。
④400KHz的IIC总线接口(VDD = 1.8~5.5V),IIC总线从地址:读,A3H;写,A2H。
⑤可编程时钟输出频率为:32.768KHz,1024Hz,32Hz,1Hz。
⑥四种报警功能和定时器功能。
⑦内含复位电路、振荡器电容和掉电检测电路。

2.PCF8563芯片引脚
PCF8563芯片如图11-8所示,PCF8563的SCL为IIC时钟输入端,数据随时钟信号同步输入器件或从器件输出;SDA为双向引脚,用于串行数据的输入输出;SDA、SCL为漏极开路必须上拉电阻;OSCI、OSCO分别为晶振接口,可接入32.768kHz的石英晶振。

3.PCF8563功能描述
PCF8563内含有一个可自动增量的地址寄存器、一个内置32.768KHz的振荡器(带有一个内部集成的电容)、一个分频器(用于给实时时钟RTC提供源时钟)、一个可编程时钟输出、一个定时器、一个报警器、一个掉电检测器和一个400KHz IIC总线接口。

PCF8563包含一个片内复位电路,当振荡器停止工作时,复位电路开始工作。在复位状态下,IIC总线初始化,寄存器TF、VL、TD1、TD0、TESTC、AE被置逻辑1,其它的寄存器和地址指针被清0。

PCF8563内嵌掉电检测器,当VDD低于Vlow时,位VL(Voltage Low,秒寄存器的位7)被置1,用于指明可能产生不准确的时钟/日历信息,VL标志位只可以用软件清除。当VDD慢速降低(例如以电池供电)达到Vlow时,标志位VL被设置,这时可能会产生中断。

PCF8563还具有报警、定时器和CLKOUT输出等功能,这些功能的介绍详见PCF8563芯片手册。

4.PCF8563寄存器
PCF8563有16个8位寄存器,所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。前两个寄存器(地址为00H,01H)用于控制寄存器和状态寄存器,地址02H~08H用于时钟计数器(秒~年计数器),地址09H~0CH用于报警寄存器(定义报警条件),地址0DH控制CLKOUT管脚的输出频率,地址0EH和0FH分别用于定时器控制寄存器和定时器寄存器。当任意一个时钟计数器被读时,其他计数器的内容被锁存,因此,在传送时间值的过程中,可以防止对时钟/日历芯片的错读。

(1) 控制/状态寄存器1
地址为:00H
数据位 D7 D6 D5 D4 D3 D2 D1 D0
数据 TEST 0 STOP 0 TESTC 0 0 0
D7—TEST位:TEST = 0,普通模式;TEST = 1,测试模式。
D5—STOP位:STOP = 0,芯片时钟运行;STOP = 1,所有芯片分频器异步置逻辑0。芯片时钟停止运行(CLKOUT在32.768kHz时可用)。
D3—TESTC位:TESTC = 0,电源复位功能失效(普通模式时置逻辑0);TESTC = 1,电源复位功能有效。
D6、D2-D0缺省置逻辑0。

(2) 控制/状态寄存器2
地址为:01H
数据位 D7 D6 D5 D4 D3 D2 D1 D0
数据 0 0 0 TI/TP AF TF AIE TIE
D4—TI/TP位:TI/TP = 0,当TF有效时INT有效(取决于TIE的状态);TI/TP = 1,INT脉冲有效(取决于TIE 的状态)。注意:若AF和AIE都有效时,则INT一直有效。
D3、D2—AF、TF位:当报警发生时AF被置逻辑1;在定时器倒计数结束时,TF被置逻辑1;它们在被软件重写前一直保持原有值。若定时器和报警中断都请求时,中断源由AF和TF决定,若要使清除一个标志位而防止另一标志位被重写,应运用逻辑指令AND。读出时,AF = 0、1分别表示报警标志无效、有效;TF = 0、1分别表示定时器标志无效、有效。向AF写0可以清除报警标志,写1则该标志保持不变;向TF写0可以清除定时器标志,写1则该标志保持不变。
D1、D0—AIE、TIE位:决定一个中断的请求有效或无效。当AF或TF中一个为1时中断是AIE和TIE都置1时的逻辑或。
AIE = 0,报警中断无效;AIE = 1,报警中断有效。
TIE = 0,定时器中断无效;TIE = 1,定时器中断有效。
D7-D5缺省置逻辑0。

(3) 其它寄存器
如表11-2所示,秒寄存器的第7位,VL(Voltage Low)电压低标志位,当VDD低于Vlow时被置位,用于指明可能产生不准确的时钟日历信息,VL标志位只可以用软件清除。月/世纪寄存器的第7位为世纪位C。C = 0,指定世纪数为20××;C = 1,指定世纪数为19××。“××”为年寄存器中的值。当年寄存器中的值由99变为00时,世纪位会改变。分钟报警、小时报警、日报警、星期报警寄存器的第7位是报警允许位AE。AE = 0,分别表示分钟报警、小时报警、日报警、星期报警有效;AE = 1,分别表示分钟报警、小时报警、日报警、星期报警无效。秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器编码格式为BCD,星期和星期报警寄存器不以BCD格式编码。星期寄存器的后3位000、001、010、011、100、101、110分别代表星期日、星期一、星期二、星期三、星期四、星期五、星期六。
CLKOUT频率寄存器的第7位FE是CLKOUT频率输出使能位。FE = 0,CLKOUT输出被禁止并设成高阻抗;FE = 1,CLKOUT输出有效。CLKOUT频率寄存器的最后两位FD1、FD0用于控制CLKOUT管脚的输出频率fCLKOUT。FD1、FD0 = 00、01、10、11,CLKOUT管脚的输出频率分别为32.768kHz、1024Hz、32Hz、1Hz。

定时器控制寄存器的第7位TE是定时器允许位。TE = 0,定时器无效;TE = 1,定时器有效。它的最后两位TD1、TD0,是定时器时钟频率选择位,决定倒计数定时器的时钟频率。TD1、TD0 = 00、01、10、11,定时器时钟频率分别为4096Hz、64Hz、1Hz、1/60Hz。不用时TD1、TD0应设为11,以降低电源损耗。

 

11.4.2 MCU使用专门的IIC模块与PCF8563时钟芯片通信

11.3.2节介绍了GB60 IIC模块的基本编程方法,本节将介绍GB60使用其专门的IIC模块与PCF8563时钟芯片的通信程序。
IIC通信工程的文件列表见表11-3,程序实例所在的路径:MC08Ex2007\GB60\GB60C\IIC通信


1.GB60与PCF8563的硬件接口
如图11-9所示,将其中的SCL和SDA分别接GB60的相应端口即可。


2.GB60与PCF8563的软件接口
如下是GB60通过已有的IIC模块与PCF8563通信的程序main.c。
//-------------------------------------------------------------------------*
//工程名:IIC.prj *
//硬件连接: *
// (1) MCU的串口与PC方的COM相连(参见"SCI.c"文件) *
// (2) MCU的IIC接口与时钟芯片的IIC接口相连(参见"IIC.c"文件) *
//功能说明:MCU与时钟芯片PCF8563通过IIC总线通信,MCU从PCF8563获得时间,并通过 *
// 串口发给PC.该程序可以与由VB编写的配套的显示程序一起使用 *
//-------------------------------------------------------------------------*

#include "Includes.h" //总头文件

INT8U ReBuf[17]; //存放从PC接收的从秒到年的ASCII码(首字节:帧头)
INT8U Flag = 0; //接收正确帧标志
void main(void)
{
//变量定义
INT8U i,j,k; //(1) 循环控制变量
INT8U Sec = 0xff; //(2) 记录秒值
//(3) 初始写入PCF8563寄存器的值:CSR1,2, 秒, 分钟,小时,天, 星期,月,
INT8U WriteData[15] = {0x00,0x00,0x00,0x00,0x14,0x01,0x01,0x06,
// 年, 分钟报警,小时报警,日期报警,周报警,
0x07,0x80, 0x80, 0x80, 0x80,
// CLKOUT频率,定时器控制
0x00, 0x00};
INT8U ReadData[7]; //(3) 依次存放秒,分,小时,日,星期,月,年数值的BCD码
INT8U SendBuf[17]; //(4) 存放要发送的从秒到年的ASCII码(首字节:帧头)

//关总中断
DisableMCUint();
//芯片初始化
MCUinit();
//模块初始化
SCIinit(); //(1) 串行口初始化(波特率:9600,查询方式)
IICinit(); //(2) IIC通信初始化(IIC波特率 = 62.5KHz)
while (IICwriteN(0xA2, 0x00, WriteData, 15));//(3) 初始化时钟芯片PCF8563
//初始时间设置:2007.06.01 14:00 Mon
//开放各模块中断
EnableMCUint(); //(1) 开放总中断
EnableSCIreInt(); //(2) 开放串行接收中断
//主循环
while (1)
{
if (Flag == 1) //接收到正确的一帧
{
//处理从秒到年数据(2字节ASCII合为1字节的压缩BCD)
for (i = 0;i < 8;i++)//最后一个字节为世纪字节
{
k = (ReBuf[2*i+1] - '0') << 4;
WriteData[i] = k | (ReBuf[2*i+2] - '0');

}
//按照时间寄存器格式,进一步处理WriteData中的时间数据
WriteData[0] &= 0b01111111; //VL位清零
if (WriteData[7] == 0x19) //设置月寄存器的世纪位
WriteData[5] |= 0b10000000;
else
WriteData[5] &= 0b01111111;
while(IICwriteN(0xA2, 0x02, WriteData, 7));
Flag = 0;
}
//从PCF8563读出时间的BCD码,存入ReadData
while(IICreadN(0xA3, 0x02, ReadData, 7));
if (Sec != (ReadData[0] & 0b01111111))//秒值发生变化,就转换数据格式并发送
{
//处理ReadData中的7个时间数据
for (i = 0;i < 7;i++)
{
switch(i)
{
case 0://秒和分数据的最高位不用,清零
case 1:
ReadData[i] &= 0b01111111;
break;
case 2://时和天数据的高两位不用,清零
case 3:
ReadData[i] &= 0b00111111;
break;
case 4://星期数据的高五位不用,清零
ReadData[i] &= 0b00000111;
break;
case 5://月数据的6、5两位不用
if ((ReadData[i] & 0b10000000) == 0)
{
SendBuf[15] = '2';
SendBuf[16] = '0';
}
else
{
SendBuf[15] = '1';
SendBuf[16] = '9';
}
ReadData[i] &= 0b00011111;
break;
default:
break;
}
//BCD码转为ASCII码
SendBuf[2*i+2] = (ReadData[i] & 0b00001111) + 0x30;
SendBuf[2*i+1] = ((ReadData[i] & 0b11110000) >> 4) + 0x30;
}
SendBuf[0] = '#'; //'#'作为帧头
Sec = ReadData[0];
SCIsendN(17,SendBuf);
}
}
}
练习题
【基础题】
1.简述IIC总线的特点。
2.简述IIC总线的数据传输过程。
3.简述MC9S08GB60的IIC模块的使用方法。
【综合题】
4.用GP32的通用I/O口模拟实现IIC通信,编写规范的收发数据的子程序。
5.构建一个多设备的IIC总线系统。

<<上一节 下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.