#include "stm8l15x.h"
#include "pcf8563.h"
#ifndef WD_DADR
#define WD_DADR 0xA2 //write device-address
#endif
#ifndef RD_DADR
#define RD_DADR 0xA3 //read device-address
#endif
#define CTRL_BUF1 0x00
#define CTRL_BUF2 0x01
#define SECOND_DATA_BUF 0x02
#define MINUTE_DATA_BUF 0x03
#define HOUR_DATA_BUF 0x04
#define DAY_DATA_BUF 0x05
#define WEEK_DATA_BUF 0x06
#define MONTH_DATA_BUF 0x07
#define YEAR_DATA_BUF 0x08
#define MINUTE_AE_BUF 0x09
#define HOUR_AE_BUF 0x0A
#define DAY_AE_BUF 0x0B
#define WEEK_AE_BUF 0x0C
#define CLK_FRQ_BUF 0x0D
#define TIMER_CTRL_BUF 0x0E
#define COUNT_VAL_BUF 0x0F
//changeIntToHex(33),return 0x33
//传参必须为 unsigned 类型
#define changeIntToHex(dec) ( ( ((dec)/10) <<4 ) + ((dec)%10) )
//调用changeHexToInt(0x33),return 33
//传参必须为 unsigned 类型
#define changeHexToInt(hex) ( ( ((hex)>>4) *10 ) + ((hex)%16) )
unsigned char i=0;
#define I2C_busy() while((I2C1->SR3&0x02)==1);
#define I2C_start1() I2C1->CR2|=0x01;
#define I2C_stop() I2C1->CR2|=0x02;
#define I2C_Ack() I2C1->CR2|=0x04;
#define I2C_NAck() I2C1->CR2&=(~0x04);
#define I2C_addrask (I2C1->SR1&0x02)
#define I2C_SBask (I2C1->SR1&0x01)
#define I2C_TxEask (I2C1->SR1&0x80)
#define I2C_RxNeask (I2C1->SR1&0x40)
#define I2C_BTF (I2C1->SR1&0x04)
#define I2C_BERR_ERR (I2C1->SR2&0x01)
#define I2C_AF_ERR (I2C1->SR2&0x04)
#define I2C_writebyte(x) I2C1->DR=x;
void I2C_Init(void)
{
I2C1->FREQR=0x0f; //设置频率寄存器
I2C1->CCRH=0x00; //设置始终寄存器高位
I2C1->CCRL=0x50; //设置始终寄存器低位
I2C1->TRISER=0x11; //设置最大SCL上升时间
I2C1->CR1|=0x01; //使能I2C模块
I2C_Ack(); //设置匹配应答
I2C1->CR2|=0x08; //设置接收应答
}
void I2C_Start(void)
{
I2C_busy();
I2C_start1();
while(I2C_SBask==0);
}
/*-------------传送地址---------------*/
void I2C_SendDAdr(u8 Add)
{
I2C_writebyte(Add);
while(I2C_addrask==0);
I2C_busy();
}
/*----------------发送数据&接收数据------------------*/
void I2C_SendDat(u8 data)
{
I2C_writebyte(data);
I2C_busy();
while(I2C_TxEask==0);
}
u8 I2C_RcvDat(void)
{
u8 i;
while(I2C_RxNeask==0);
abc:
if(I2C_BTF==0x04)
{i=I2C1->DR;}
else goto abc;
if(I2C_BTF==0){}
else goto abc;
return i;
}
void WriteAByte(u8 wordAdr,u8 dat)
{
I2C_Start();
I2C_SendDAdr(WD_DADR);
I2C_SendDat(wordAdr);
I2C_SendDat(dat);
I2C_stop();
}
void PCF8563_getTime(u8 *buf)
{
u8 i;
I2C_Start();
I2C_SendDAdr(WD_DADR);
I2C_SendDat(SECOND_DATA_BUF);
I2C_Start();
I2C_SendDAdr(RD_DADR);
for(i=0;i<7;i++)
{
buf[i]=I2C_RcvDat();
}
I2C_NAck();
buf[i]=I2C_RcvDat();
I2C_stop();
I2C_Ack();
buf[0]=buf[0]&0x7f; //get second data
buf[1]=buf[1]&0x7f; //get minute data
buf[2]=buf[2]&0x3f; //get hour data
buf[3]=buf[3]&0x3f; //get day data
buf[4]=buf[5]&0x1f; //get month data
buf[5]=buf[6]&0x7f; //get year data
/*
buf[0]=changeHexToInt(buf[0]);
buf[1]=changeHexToInt(buf[1]);
buf[2]=changeHexToInt(buf[2]);
buf[3]=changeHexToInt(buf[3]);
buf[4]=changeHexToInt(buf[4]);
buf[5]=changeHexToInt(buf[5]);
*/
}
void PCF8563_setTime(u8 year,u8 month,u8 day,u8 hour,u8 minute,u8 second)
{
year=changeIntToHex(year);
month=changeIntToHex(month);
day=changeIntToHex(day);
hour=changeIntToHex(hour); //将数据的Dex格式转换为Hex格式
minute=changeIntToHex(minute);
second=changeIntToHex(second);
WriteAByte(YEAR_DATA_BUF,year);
WriteAByte(MONTH_DATA_BUF,month);
WriteAByte(DAY_DATA_BUF,day);
WriteAByte(HOUR_DATA_BUF,hour);
WriteAByte(MINUTE_DATA_BUF,minute);
WriteAByte(SECOND_DATA_BUF,second);
}
void PCF8563_Init()
{
CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
I2C_Init();
WriteAByte(CTRL_BUF1,0x00); //basic setting
WriteAByte(CTRL_BUF2,0x00);
///PCF8563_setTime(year,month,day,hour,minute,second);
}
- 1
- 2
- 3
- 4
- 5
前往页