源自 中科银河芯
一款可以看得见IIC的实时时钟芯片
简介
GX8563 是一款CMOS实时时钟芯片,用于低功耗领域。可编程时钟和中断输出。通过I2C通信,最大传输速率100 kbit/s。每个字节传输结束后,内部计数器自动加一。
特性
■ 基于外部32k晶振,芯片提供年,月,日,工作日,小时,分钟,秒。
■ 世纪标志
■ 工作电压2.5 V to 5.5 V
■ 低工作电流:在电压为3.0 V 、温度为25 °C时,仅需1.5 µA。
■ 100kHzI2C通信速率 (在电压为 2.5 V 到 5.5 V)
■ 可编程时钟输出 (32.768 kHz, 1024 Hz, 32 Hz 和1 Hz),开漏输出
■ 报警和定时功能
■ 集成了晶体振荡器
■ 内部电源复位
■ I2C地址为: 读 A3h, 写A2h
■ 开漏的中断输出
应用
■ 手机
■ 便携仪器
■ 电子计量
■ 电池产品
管脚
OSCI
OSCO
INT
GND
SDA
SCL
CLKOUT
VDD
图1 内部架构
图2 晶圆裸片图
图3 封装图
图4 测试图
代码
#include "C8051F320.H"
#include "lcd.h"
#include "INIT.h"
sbit scl = P2^7;
sbit chip_vcc = P2^5;
sbit chip_gnd = P2^3;
sbit sda = P2^1;
#define I2C_Addr 0xA2
void I2C_init(){
P2MDIN = 0xff;
P2MDOUT = 0x28;
chip_vcc = 1;
chip_gnd = 0;
scl = 1;
sda = 1;
}
void I2C_delay(void) {
// unsigned short a;
// for(a=2000; a>0; a--); // 1k
unsigned char a;
// for(a=200; a>0; a--); // 10k
// for(a= 97; a>0; a--); // 20k
for(a= 35; a>0; a--); // 50k
// for(a= 15; a>0; a--); //100k
// for(a= 5; a>0; a--); //200k
// ; //400k
}
void I2C_start () {
I2C_delay();
sda = 1;
I2C_delay();
I2C_delay();
scl = 1;
I2C_delay();
I2C_delay();
sda = 0;
I2C_delay();
scl = 0;
I2C_delay();
}
void I2C_stop() {
sda = 0;
I2C_delay();
scl = 1;
I2C_delay();
sda = 1;
I2C_delay();
I2C_delay();
I2C_delay();
}
void I2C_write_bit( unsigned char wdata) {
sda = wdata;
I2C_delay();
scl = 1;
I2C_delay();
I2C_delay();
scl = 0;
I2C_delay();
}
void I2C_write_byte( unsigned char wdata) {
unsigned char i;
for (i=0;i<8;i++) {
I2C_write_bit((wdata<<i)&0x80);
}
}
unsigned char I2C_read_bit () {
unsigned char i;
sda = 1;
I2C_delay();
scl = 1;
I2C_delay();
i = sda?1:0;
I2C_delay();
scl = 0;
I2C_delay();
return i;
}
unsigned char I2C_read_byte() {
unsigned rdata, i;
rdata=0;
for (i=0;i<8;i++) {
rdata <<=1;
if (I2C_read_bit())
rdata |= 0x01;
}
return rdata;
}
unsigned char I2C_check_ack() {
return (I2C_read_bit());
}
void I2C_send_ack() {
I2C_write_bit(0);
sda = 1;
}
void I2C_send_nack() {
I2C_write_bit(1);
}
void I2C_ID(unsigned char RW){
I2C_write_byte(I2C_Addr + RW);
}
void DiaplayIICReg(unsigned char y){
unsigned char i;
Set_LCDYXChar(y+0,1);
ToLCDS(" C1:"); ToLCDB(dat[0]);
ToLCDS(" C2:"); ToLCDB(dat[1]);
Set_LCDYXChar(y+1,1); font_color = purple;
ToLCDS(" s:"); ToLCDB(dat[2]);
ToLCDS(" m:"); ToLCDB(dat[3]);
ToLCDS(" h:"); ToLCDB(dat[4]);
ToLCDS(" D:"); ToLCDB(dat[5]);
Set_LCDYXChar(y+2,1);
ToLCDS(" W:"); ToLCDB(dat[6]);
ToLCDS(" M:"); ToLCDB(dat[7]);
ToLCDS(" Y:"); ToLCDB(dat[8]); font_color = green;
Set_LCDYXChar(y+3,1);
ToLCDS(" AW:"); ToLCDB(dat[12]);
ToLCDS(" AM:"); ToLCDB(dat[9]);
ToLCDS(" AH:"); ToLCDB(dat[10]);
ToLCDS(" AD:"); ToLCDB(dat[11]);
Set_LCDYXChar(y+4,1);
ToLCDS(" FE:"); ToLCDB(dat[13]);
ToLCDS(" TE:"); ToLCDB(dat[14]);
ToLCDS(" TIMER:");ToLCDB(dat[15]);
}
void I2CWrite() {
unsigned char i;
for(i = 0; i < 16; i++){
dat[i] = 0;
}
dat[2] = 0x56;
dat[3] = 0x59;
dat[4] = 0x23;
dat[5] = 0x31;
dat[6] = 0x06;
dat[7] = 0x12;
dat[8] = 0x11;
dat[13] = 0x83;
Set_LCDYXChar(1,1); ToLCDS("W8563:"); DiaplayIICReg(2);
I2C_start();
I2C_ID(0); I2C_check_ack();
I2C_write_byte(0); I2C_check_ack();
for(i = 0; i < 16; i++){I2C_write_byte(dat[i]); I2C_check_ack(); }
I2C_stop();
}
void I2CRead() {
unsigned char i;
I2C_start();
I2C_ID(0); I2C_check_ack();
I2C_write_byte(0); I2C_check_ack();
I2C_stop();
I2C_start();
I2C_ID(1); I2C_check_ack();
for(i = 0; i < 16; i++){
dat[i] = I2C_read_byte();
if(i < 15) I2C_send_ack();
else I2C_send_nack();
}
I2C_stop();
}