当前位置:首页 >> 信息与通信 >>

PCF8563时钟芯片驱动程序


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

3 8563 源代码 //****************************************************** //define //***************************************************** #define #define #define #define #define #define #define #define #define #define #define #define PCF8563_ADDR PCF8563_ENABLE PCF8563_SUBADDR PCF8563_NUMB PCF8563_LOOPTIME PCF8563_SECMASK PCF8563_MINMASK PCF8563_HRMASK PCF8563_DAYMASK PCF8563_WKMASK PCF8563_MOMASK PCF8563_YRMASK // PCF8563 设备地址 // 设置 0x02 // 时间地址 0x07 // 时间个数 0x02 // 循环次数 0x7f // second 0x7f // minute 0x3f // hour 0x3f // day 0x07 // week 0x1f // month 0xff // year 0xa2 0x00

/* void DELAY_US(Uint16 i) { Uint16 m,n; for(m=0;m<i;m++) { for(n=0;n<5;n++)

{ _nop_(); } } } */ /******************************************************** ** 函数名称: void DELAY_MS(Uint16 i) ** 功能描述: 延时函数 ** 输 入:延时毫秒数 ** 输 出:无 ********************************************************/ //延时函数单位 ms void DELAY_MS(Uint16 i) { Uint16 m,n; for(m=0;m<i;m++) { for(n=0;n<1000;n++) { _nop_(); } } } /******************************************************** ** 函数名称: InitCrt() ** 功能描述: SD2405 的初始化 ** 输 入:无 ** 输 出:无 ********************************************************/ void InitCrt() { //设备地址 I2cDeviceAdd = PCF8563_ADDR; } /******************************************************** ** 函数名称: CrtGetDateTime(struct SYSTEM_TIME *Time) ** 功能描述: 读取时间 ** 说 明:将从 PCF8563 中读取的时间放入 Time 指向的结构中 ** 输 入:无

** 输 出:无 ********************************************************/ void CrtGetDateTime(struct SYSTEM_TIME *Time) { Uint8 buf[8]; //设备地址 I2cDeviceAdd = PCF8563_ADDR; SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB); Time->time.ucSecond = buf[0]; Time->time.ucMinute = buf[1]; Time->time.ucHour = buf[2]; Time->date.ucDay = buf[3]; Time->Week = buf[4]; Time->date.ucMonth = buf[5]; Time->date.ucYear = buf[6]; } /******************************************************** ** 函数名称: CrtSetDateTime(struct SYSTEM_TIME *Time) ** 功能描述: 设置时间 ** 说 明:将 Time 指向的结构中日期时间参数设置到 sd24.5 中 ** 输 入:无 ** 输 出:无 ********************************************************/ void CrtSetDateTime(struct SYSTEM_TIME *Time) { Uint8 buf[8]; //设备地址 I2cDeviceAdd = PCF8563_ADDR; //写入设置(时钟工作、关闭复位、关闭测试模式) buf[0] = PCF8563_ENABLE; SM_Send (0, buf, 0); //写入日期时间 buf[0] = Time->time.ucSecond; //秒 buf[1] = Time->time.ucMinute; //分 buf[2] = Time->time.ucHour|0x80; //时 置为 24 小时格式 buf[3] = Time->date.ucDay; //日 buf[4] = Time->Week; //星期 buf[5] = Time->date.ucMonth; //月 buf[6] = Time->date.ucYear; //年 SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB); } //秒 //分 //时 屏蔽最高位 //日 //星期 //月 //年

4 新华龙 C8051F022 的 IIC 驱动程序 //----------------------------------------------------------------------------// Includes //----------------------------------------------------------------------------#include <c8051f020.h> #include <stdio.h> #include <king.h> #include <DYSJ.h> #include <I2C.H> #define SMB_FREQUENCY 10000L // SFR declarations

// Target SCL clock rate

/****************************************************************************** ** 函数名称:void SPI0_Init() ** 功能描述:I2C 初始化程序 ** 说 明: 1. 置下降沿有效 2. 置工作时钟 2MHz 3. ** 输 入:无 ** 输 出:无 ******************************************************************************* / void I2C_Init() { SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY)); EIE1 |= 2; EA = 1; I2cSM_BUSY = 0; } /****************************************************************************** ** 函数名称:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count) ** 功能描述:I2C 写入程序 ** 说 明: 1. 等待空闲 2. 写入数据 3. 等待结束 ** 输 入:地址 byte_address、写入数据缓冲区*SendBuf、数量 count // SMBus interrupt enable // Global interrupt enable // Free SMBus for first transfer.

//

** 输 出:无 ******************************************************************************* / void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count) { ET0 = 0; ET2 = 0; while (I2cSM_BUSY); I2cSM_BUSY = 1; SMB0CN = 0x44; I2cSendCount = count; I2cRecCount = 0; I2cSendDPTR = SendBuf; I2CWRITE; I2cMemAdd = byte_address; STO = 0; STA = 1; FeedWatchdog(); while (I2cSM_BUSY); ET0 = 1; ET2 = 1; } /****************************************************************************** ** 函数名称:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count) ** 功能描述:I2C 读取程序 ** 说 明: 1. 等待空闲 2. 置地址 3. 读取数据 3. 等待结束 ** 输 入:地址 byte_address、读取数据缓冲区*SendBuf、数量 count ** 输 出:无 // 启动传输 //禁止中断 //禁止中断 // 等待空闲 // 置忙 // SMBus enabled, ACK on acknowledge cycle // 置写入数量 // 读出数量清零 // SMBus enabled, ACK on acknowledge cycle // Chip select + WRITE

// 等待空闲 //允许中断 //允许中断

******************************************************************************* / void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count) { ET0 = 0; ET2 = 0; while (I2cSM_BUSY); I2cSM_BUSY = 1; SMB0CN = 0x44; I2cSendCount = 0; I2CWRITE; I2cMemAdd = byte_address; I2cRecCount = count; I2cRecDPTR = ReadBuf; STO = 0; STA = 1; FeedWatchdog(); while (I2cSM_BUSY); ET0 = 1; ET2 = 1; } /****************************************************************************** ** 函数名称:void SMBUS_ISR (void) interrupt 7 ** 功能描述:I2C 中断服务程序 ** 说 明: 1. 选择器件地址 2. 置读写地址 3. 读取或写入数据 3. 置结束标志 ** 输 入:无 ** 输 出:无 ******************************************************************************* // 等待空闲 //允许中断 //允许中断 //禁止中断 //禁止中断 // 等待空闲 // 置忙 // SMBus enabled, ACK on acknowledge cycle // 置写入数量 // Chip select + WRITE //值地址偏移 //要接收的数据个数 //指向要接收的数据区

// Start transfer

/ void SMBUS_ISR (void) interrupt 7 { switch (SMB0STA) // Status code for the SMBus (SMB0STA register) { // 主发送器/接收器:起始条件已发送 // 在该状态发送的 COMMAND 字的 R/W 位总是为 0(W), // 因为对于读和写操作来说都必须先写存储器地址。 case SMB_START: SMB0DAT = I2cCOMMAND; // 写入含读写指令的设备地址 STA = 0; // 清除启动标志 break; //主发送器/接收器:重复起始条件已发送。 // 该状态只应在读操作期间出现,在存储器地址已发送并得到确认之后 case SMB_RP_START: I2CREAD; // 置设备读 SMB0DAT = I2cCOMMAND; // 写入含读写指令的设备地址 STA = 0; break; // 主发送器 设备地址+(W/R)已发出。收到 ACK。 case SMB_MTADDACK: SMB0DAT = I2cMemAdd; break; // 发送要写入的字节地址

/*

// 主发送器 从地址+W 已发出。收到 NACK。 case SMB_MTADDNACK: if (I2cSendCount) // 传输结束 { SMB0DAT = *I2cSendDPTR; //传送数据 I2cSendDPTR++; I2cSendCount--; } else { if(I2cRecCount) { STO = 0; STA = 1; } else { STO = 1;

I2cSM_BUSY = 0; } }*/ STO = 1; STA = 1; break; // 数据字节已经发出,收到 ACK case SMB_MTDBACK: if (I2cSendCount) {

//发送停止,释放总线

// 传输结束

SMB0DAT = *I2cSendDPTR; //传送数据 I2cSendDPTR++; I2cSendCount--; } else { if(I2cRecCount) { STO = 0; STA = 1; } else { STO = 1; I2cSM_BUSY = 0; } } break; // 数据字节已经发出,收到 NACK case SMB_MTDBNACK: STO = 1; STA = 1; break; // 主发送器 竞争失败 case SMB_MTARBLOST: STO = 1; STA = 1; break; // 从地址+R 已经发出,收到 ACK case SMB_MRADDACK: //发送停止,释放总线

SysBuff[500]=8; //if (counter == 1) //{ // AA = 0; //} break; //只接收一个字节时要设置接收后就 NACK // NACK sent on acknowledge cycle.

// 从地址+R 已经发出,收到 NACK case SMB_MRADDNACK: STO = 0; STA = 1; break; // 数据字节收到,ACK 已经发出 case SMB_MRDBACK: if (I2cRecCount == 1) { AA = 0; 节不应答 } I2cRecCount--; *I2cRecDPTR = SMB0DAT; I2cRecDPTR++; break; // 数据字节收到,NACK 已经发出 case SMB_MRDBNACK: *I2cRecDPTR = SMB0DAT; STO = 1; I2cSM_BUSY = 0; break; // 未知状态或总线错误 default: STO = 1; I2cSM_BUSY = 0; break; } SI=0; } // clear interrupt flag // 收到最后一个字节前准备设置最后一个字

// Free SMBus

// Reset communication.


相关文章:
基于8051实时时钟芯片PCF8563驱动程序设计方案_图文
基于8051 实时时钟芯片 PCF8563 驱动程序的实现 基于 8051 实时时钟芯片 PCF8563 驱动程序设计方案 第 1 章 绪论 1.1 研究背景 前单片机渗透到我们生活的各个...
STM32对时钟芯片PCF8563的编程
STM32对时钟芯片PCF8563的编程_电子/电路_工程科技_专业资料。STM32对PCF8563时钟芯片的编程,模拟IIC,I2C 这是用 STM32 对 PCF8563 编程的程序、模拟 IIC,经验...
pcf8563驱动程序
pcf8563驱动程序_计算机软件及应用_IT/计算机_专业资料。#include "pcf8563.h"...DATE: 2012/6/9 *CREATED BY: xs *FUNCTION: 修改时钟芯片时间 *INPUT: ?...
PCF8563芯片时序程序
PCF8563芯片时序程序_信息与通信_工程科技_专业资料。PCF8563芯片时序程序实时时钟/日历芯片 PCF8563驱动方 实时时钟/日历芯片 PCF8563驱动方法 PCF8563 是低...
基于PCF8563时钟芯片的万年历制作
基于PCF8563 时钟芯片的万年历制作万年历时钟芯片很多,用途也很广,采用飞利浦公司...LCM1602 的驱动程序如下,可移植。 #define LCM1602_DB0_DB7 P0 // 定义 ...
PCF8563时钟芯片
PCF8563 时钟芯片(C 语言单片机编写) 收藏 #i nclude <reg51.h> #i nclude <intrins.h> sbit SDA=P1^0; // 将 p1.0 口模拟数据口 sbit SCL=P1^1;...
PCF8563做时钟的C程序
PCF8563做时钟的C程序_工学_高等教育_教育专区。PCF8563PCF8563 做实时时钟...时钟芯片PCF8563可用程序... 3页 免费 PCF8563程序 7页 2下载PCF8563...
PCF8563 I2C实时时钟
PCF8563 I2C 实时时钟/日历芯片在 8051 系统中的应用类别:单片机/DSP 阅读:...05 日 星期一 11:30 为了写程序方便, 我将主程序和各器件的驱动程序分开了...
PCF8563的C51程序设计
00 PCF8563 是一款低功耗的 CMOS 实时时钟/日历芯片,它提供一个可编程时钟输出...} //开始 PCF8563T 驱动程序 /*---...
实时时钟PCF8563P中文译文
实时时钟PCF8563P中文译文_电子/电路_工程科技_专业资料。实时时钟芯片 PCF8563 ...接口技术-USB驱动程序简... 16页 免费 PCF8563-周立功应用案例 11页 免费 MAX...
更多相关标签: