一款可以看得見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
架構
裸片
封裝
目前可供樣片封裝形式爲msop8,如下圖所示
樣片圖片
測試
目前測試結果
目前提供樣片中,可留言索取,謝謝
代碼
#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();
}