初级会员

- 积分
- 50
- 金钱
- 50
- 注册时间
- 2021-9-18
- 在线时间
- 14 小时
|
7金钱
#include "pcf8563.h"
#include "delay.h"
unsigned char Time[7];
void PCF_IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOB时钟
//GPIOB8,B9初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
PCF_IIC_SCL=1;
PCF_IIC_SDA=1;
}
void PCF_IIC_Start(void)
{
PCF_SDA_OUT(); //sda线输出
PCF_IIC_SDA=1;
PCF_IIC_SCL=1;
delay_us(4);
PCF_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
PCF_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
void PCF_IIC_Stop(void)
{
PCF_SDA_OUT();//sda线输出
PCF_IIC_SCL=0;
PCF_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
PCF_IIC_SCL=1;
PCF_IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);
}
u8 PCF_IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
PCF_SDA_IN(); //SDA设置为输入
PCF_IIC_SDA=1;delay_us(1);
PCF_IIC_SCL=1;delay_us(1);
while(PCF_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
PCF_IIC_Stop();
return 1;
}
}
PCF_IIC_SCL=0;//时钟输出0
return 0;
}
//产生ACK应答
void PCF_IIC_Ack(void)
{
PCF_IIC_SCL=0;
PCF_SDA_OUT();
PCF_IIC_SDA=0;
delay_us(2);
PCF_IIC_SCL=1;
delay_us(2);
PCF_IIC_SCL=0;
}
//不产生ACK应答
void PCF_IIC_NAck(void)
{
PCF_IIC_SCL=0;
PCF_SDA_OUT();
PCF_IIC_SDA=1;
delay_us(2);
PCF_IIC_SCL=1;
delay_us(2);
PCF_IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void PCF_IIC_Send_Byte(u8 txd)
{
u8 t;
PCF_SDA_OUT();
PCF_IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
PCF_IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2); //对TEA5767这三个延时都是必须的
PCF_IIC_SCL=1;
delay_us(2);
PCF_IIC_SCL=0;
delay_us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 PCF_IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
PCF_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
PCF_IIC_SCL=0;
delay_us(2);
PCF_IIC_SCL=1;
receive<<=1;
if(PCF_READ_SDA)receive++;
delay_us(1);
}
if (!ack)
PCF_IIC_NAck();//发送nACK
else
PCF_IIC_Ack(); //发送ACK
return receive;
}
unsigned char PCF_BinToBcd2(unsigned char BINValue)
{
unsigned char BCDHigh=0;
while(BINValue >= 10)
{
BCDHigh ++;
BINValue -= 10;
}
return ((unsigned char)(BCDHigh<<4)|BINValue);
}
unsigned char PCF_Bcd2ToBin(unsigned char BCDValue)
{
unsigned char Time=0;
{
Time=((unsigned char)(BCDValue&(unsigned char)0xF0)>>(unsigned char)0x04)*10;
return (Time+(BCDValue&(unsigned char)0x0F));
}
}
void PCF8563_Write_Byte(unsigned char REG_ADDR, unsigned char DAT)
{
PCF_IIC_Start();
PCF_IIC_Send_Byte(PCF8563_WADDR);
// delay_us(5);
// PCF_IIC_Send_Byte(PCF8563_CLKOUT,0x81);
while(PCF_IIC_Wait_Ack());
PCF_IIC_Send_Byte(REG_ADDR);
PCF_IIC_Wait_Ack();
PCF_IIC_Send_Byte(DAT);
PCF_IIC_Wait_Ack();
PCF_IIC_Stop();
}
unsigned char PCF8563_Read_Byte(unsigned char REG_ADDR)
{
u8 ReData;
PCF_IIC_Start();
PCF_IIC_Send_Byte(PCF8563_WADDR);
while(PCF_IIC_Wait_Ack());
PCF_IIC_Send_Byte(REG_ADDR);
PCF_IIC_Wait_Ack();
PCF_IIC_Start();
PCF_IIC_Send_Byte(PCF8563_RADDR);
PCF_IIC_Wait_Ack();
ReData=PCF_IIC_Read_Byte(0);
PCF_IIC_Stop();
return ReData;
}
void PCF8563_Config(void)
{
PCF8563_Write_Byte(PCF8563_Control_Status_1,0x00);
PCF8563_Write_Byte(PCF8563_Control_Status_2,0x02);
// PCF8563_Write_Byte(PCF8563_CLKOUT,0x83);
}
void PCF8563_GetTime(void)
{
if((PCF8563_Read_Byte(PCF8563_Months)>>7)==0)
{
Time[0]=0x14;
}
if((PCF8563_Read_Byte(PCF8563_Months)>>7)==1)
{
Time[0]=0x13;
}
Time[1]=PCF_Bcd2ToBin(PCF8563_Read_Byte(PCF8563_Years)); //年份读取
Time[2]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Months)<<3&0xff)>>3); //月份设置
Time[3]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Days)<<2&0xff)>>2); //日期设置
Time[4]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Hours)<<2&0xff)>>2); //小时设置
Time[5]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Minutes)<<1&0xff)>>1); //分钟设置
Time[6]=PCF_Bcd2ToBin((PCF8563_Read_Byte(PCF8563_Seconds)<<1&0xff)>>1); //秒钟设置
}
void PCF8563_SetTime(unsigned char year, unsigned char month, unsigned char day, unsigned char hour, unsigned char minute, unsigned char second)
{
PCF8563_Write_Byte(PCF8563_Years,PCF_BinToBcd2(year)); //年份设置
PCF8563_Write_Byte(PCF8563_Months,PCF_BinToBcd2(month)); //月份设置
PCF8563_Write_Byte(PCF8563_Days,PCF_BinToBcd2(day)); //日期设置
PCF8563_Write_Byte(PCF8563_Hours,PCF_BinToBcd2(hour)); //小时设置
PCF8563_Write_Byte(PCF8563_Minutes,PCF_BinToBcd2(minute)); //分钟设置
PCF8563_Write_Byte(PCF8563_Seconds,PCF_BinToBcd2(second)); //秒钟设置
}
|
|