升级PCF8563芯片驱动代码,欢迎各位大大们拍砖指导

2019-07-21 07:11发布

之前和大家分享了一下几个时钟芯片的驱动代码还有原理图什么的“发一个之前玩过的几个RTC芯片程序

最近因为一个项目原因,全部更新了PCF8563这个芯片的驱动代码,主要是直接在函数设置BCD格式和BIN格式的转换输出,全部操作利用结构体的思路,更加清晰明了。

底层IIC驱动用“发一个之前玩过的几个RTC芯片程序”这个帖子3楼附件,或者在文件开头位置的几个函数稍微修改一下即可,具体如下

[mw_shl_code=c,true]/** ***************************************************************************** * @Name : PCF8563某寄存器写入一个字节数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器地址 * dat: 要写入的数据 * * @Output : none * * @Return : none ***************************************************************************** **/ void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat) { IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); IIC_Write_Byte(dat); //发送数据 } IIC_Stop(); } /** ***************************************************************************** * @Name : PCF8563某寄存器读取一个字节数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器地址 * * @Output : none * * @Return : 读取得到的寄存器的值 ***************************************************************************** **/ unsigned char PCF8563_Read_Byte(unsigned char REG_ADD) { unsigned char ReData; IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); //确定要操作的寄存器 IIC_Start(); //重启总线 IIC_Write_Byte(PCF8563_Read); //发送读取命令 ReData = IIC_Read_Byte(); //读取数据 IIC_Ack(1); //发送非应答信号结束数据传送 } IIC_Stop(); return ReData; } /** ***************************************************************************** * @Name : PCF8563写入多组数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器起始地址 * num: 写入数据数量 * *WBuff: 写入数据缓存 * * @Output : none * * @Return : none ***************************************************************************** **/ void PCF8563_Write_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff) { unsigned char i = 0; IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); //定位起始寄存器地址 for(i = 0;i < num;i++) { IIC_Write_Byte(*pBuff); //写入数据 pBuff++; } } IIC_Stop(); } /** ***************************************************************************** * @Name : PCF8563读取多组数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器起始地址 * num: 读取数据数量 * * @Output : *WBuff: 读取数据缓存 * * @Return : none ***************************************************************************** **/ void PCF8563_Read_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff) { unsigned char i = 0; IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); //定位起始寄存器地址 IIC_Start(); //重启总线 IIC_Write_Byte(PCF8563_Read); //发送读取命令 for(i = 0;i < num;i++) { *pBuff = IIC_Read_Byte(); //读取数据 if(i == (num - 1)) IIC_Ack(1); //发送非应答信号 else IIC_Ack(0); //发送应答信号 pBuff++; } } IIC_Stop(); }[/mw_shl_code]
上面几个函数只要对应移植就可以了。

提供对外的函数有以下几个
[mw_shl_code=c,true]void PCF8563_Write_Byte (unsigned char REG_ADD, unsigned char dat); //PCF8563某寄存器写入一个字节数据 unsigned char PCF8563_Read_Byte (unsigned char REG_ADD); //PCF8563某寄存器读取一个字节数据 void PCF8563_Write_nByte (unsigned char REG_ADD, unsigned char num, unsigned char *pBuff); //PCF8563写入多组数据 void PCF8563_Read_nByte (unsigned char REG_ADD, unsigned char num, unsigned char *pBuff); //PCF8563读取多组数据 unsigned char PCF8563_Check (void); //PCF8563检测是否存在 void PCF8563_Start (void); //PCF8563启动 void PCF8563_Stop (void); //PCF8563停止 void PCF8563_SetMode (unsigned char Mode); //PCF8563设置运行模式 void PCF8563_SetPowerReset (unsigned char NewState); //PCF8563设置电源复位功能开启与关闭 void PCF8563_SetCLKOUT (_PCF8563_CLKOUT_Typedef* PCF_CLKOUTStruct); //PCF8563设置输出频率 void PCF8563_SetTimer (_PCF8563_Timer_Typedef* PCF_TimerStruct); //PCF8563设置定时器 void PCF8563_Set_Times (unsigned char PCF_Format, unsigned char PCF_Century, unsigned char Year, unsigned char Month, unsigned char Date, unsigned char Week, unsigned char Hour, unsigned char Minute); //设置时间,主要用于后台调用,或者初始化时间用 void PCF8563_SetRegister (unsigned char PCF_Format, unsigned char PCF_Century, _PCF8563_Register_Typedef* PCF_DataStruct); //PCF8563写入寄存器 void PCF8563_GetRegister (unsigned char PCF_Format, unsigned char *PCF_Century, _PCF8563_Register_Typedef* PCF_DataStruct); //PCF8563读取寄存器 void PCF8563_SetTime (unsigned char PCF_Format, _PCF8563_Time_Typedef* PCF_DataStruct); //PCF8563写入时间信息 void PCF8563_GetTime (unsigned char PCF_Format, _PCF8563_Time_Typedef* PCF_DataStruct); //PCF8563读取时间信息 void PCF8563_SetDate (unsigned char PCF_Format, unsigned char PCF_Century, _PCF8563_Date_Typedef* PCF_DataStruct); //PCF8563写入日期信息 void PCF8563_GetDate (unsigned char PCF_Format, unsigned char *PCF_Century, _PCF8563_Date_Typedef* PCF_DataStruct); //PCF8563读取日期信息 void PCF8563_SetAlarm (unsigned char PCF_Format, _PCF8563_Alarm_Typedef* PCF_DataStruct); //PCF8563写入闹铃信息 void PCF8563_GetAlarm (unsigned char PCF_Format, _PCF8563_Alarm_Typedef* PCF_DataStruct); //PCF8563读取闹铃信息[/mw_shl_code]
详细代码请看附件,同时欢迎各路高人指点一二

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
八度空间
1楼-- · 2019-07-23 03:12
回复【13楼】chenyh85:
---------------------------------
我的可以啊,每次都成功,你仿真看下到哪步就不行了
chenyh85
2楼-- · 2019-07-23 07:14
 精彩回答 2  元偷偷看……
八度空间
3楼-- · 2019-07-23 11:23
回复【15楼】chenyh85:
---------------------------------
这样啊,我测试一下看下,谢谢啊!!!
chenyh85
4楼-- · 2019-07-23 11:44
回复【16楼】八度空间:
---------------------------------
大神,您不用测试了,是我这边问题!
八度空间
5楼-- · 2019-07-23 14:42
回复【17楼】chenyh85:
---------------------------------
怎么说我每次测试都过,怎么你就不过呢,呵呵
无名氏
6楼-- · 2019-07-23 16:47
1,帮忙看看,这样调用,行吗?
IIC_GPIO_Init();

void CF8563_SetFunc(void)
{
_PCF8563_Date_Typedef  Date_InitStructure;
_PCF8563_Time_Typedef  Timer_InitStruct;


Date_InitStructure.RTC_Years    = 15;
Date_InitStructure.RTC_Months   = 05;
Date_InitStructure.RTC_Days     = 28;
Date_InitStructure.RTC_WeekDays = 4;

Timer_InitStruct.RTC_Hours=14;
Timer_InitStruct.RTC_Minutes=23;
Timer_InitStruct.RTC_Seconds=55;

PCF8563_SetMode(PCF_Mode_Normal);

PCF8563_Stop();

PCF8563_SetTime(PCF_Format_BIN, &Timer_InitStruct);
 CF8563_SetDate(PCF_Format_BIN, 0,&Date_InitStructure);
 
 CF8563_Start();


}

void CF8563_GetFunc( _PCF8563_Time_Typedef* CF_TimeStruct, _PCF8563_Date_Typedef* CF_DateStruct)
{

PCF8563_GetTime(PCF_Format_BIN, CF_TimeStruct);
 CF8563_GetDate(PCF_Format_BIN,0, CF_DateStruct);

}

一周热门 更多>