- /*******************************************************************************
- * 文件名:void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
- * 描 述: PCF8563某寄存器写入一个字节数据
- * 功 能:REG_ADD:要操作寄存器地址 dat: 要写入的数据
- * 作 者:大核桃
- * 版本号:1.0.1(2017.03.03)
- *******************************************************************************/
- void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
- {
- IIC_Start();
- if(!(IIC_Write_Byte(0xa2))) //发送写命令并检查应答位
- {
- IIC_Write_Byte(REG_ADD);
- IIC_Write_Byte(dat); //发送数据
- }
- IIC_Stop();
- }
从上图可以看出一个完整的写模式包括 起始信号+设备地址+应答信号+数据地址+应答信号+数据+应答信号+停止信号 组成,每写入一个字节,PCF8563都要返回一个应答信号0,表示我正确的接收了,相当于一个回执。PCF8563的写设备地址固定是0XA2,通过程序,可以很容易的理解上面的代码了。
再来看下PCF8563读单个字节函数
- /*******************************************************************************
- * 文件名:unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
- * 描 述: PCF8563某寄存器读取一个字节数据
- * 功 能:REG_ADD:要操作寄存器地址 读取得到的寄存器的值
- * 作 者:大核桃
- * 版本号:1.0.1(2017.03.03)
- *******************************************************************************/
- unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
- {
- unsigned char ReData;
-
- IIC_Start();
- if(!(IIC_Write_Byte(0xa2))) //发送写命令并检查应答位
- {
- IIC_Write_Byte(REG_ADD); //确定要操作的寄存器
- IIC_Start(); //重启总线
- IIC_Write_Byte(0xa3); //发送读取命令
- ReData = IIC_Read_Byte(); //读取数据
- IIC_Ack(1); //发送非应答信号结束数据传送
- }
- IIC_Stop();
- return ReData;
- }
我们看下他的时序图:
注意PCF8563读寄存器字节的设备地址固定0XA3,按照时序图,很容易就能够理解这段代码的。
写多个字节和读多个字节的函数也是比较容易的,唯一要注意的是时序图中的解释,ack from master 和ack from slave 这个一定要理解明白,写字节对应的是slave,是主机写,从机返回应答,from master 是读字节,是主机发出应答或者非应答,从机响应。
- /*******************************************************************************
- * 文件名:void PCF8563_Write_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff)
- * 描 述: PCF8563写入多组数据
- * 功 能:REG_ADD:要操作寄存器起始地址 num: 写入数据数量 *WBuff: 写入数据缓存
- * 作 者:大核桃
- * 版本号:1.0.1(2017.03.03)
- *******************************************************************************/
- void PCF8563_Write_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff)
- {
- unsigned char i = 0;
-
- IIC_Start();
- if(!(IIC_Write_Byte(0xa2))) //发送写命令并检查应答位
- {
- IIC_Write_Byte(REG_ADD); //定位起始寄存器地址
- for(i = 0;i < num;i++)
- {
- IIC_Write_Byte(*pBuff); //写入数据
- pBuff++;
- }
- }
- IIC_Stop();
- }
- /*******************************************************************************
- * 文件名:void PCF8563_Read_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff)
- * 描 述: PCF8563读取多组数据
- * 功 能:REG_ADD:要操作寄存器起始地址 num: 写入数据数量 *WBuff: 读取数据缓存
- * 作 者:大核桃
- * 版本号:1.0.1(2017.03.03)
- *******************************************************************************/
- void PCF8563_Read_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff)
- {
- unsigned char i = 0;
-
- IIC_Start();
- if(!(IIC_Write_Byte(0xa2))) //发送写命令并检查应答位
- {
- IIC_Write_Byte(REG_ADD); //定位起始寄存器地址
- IIC_Start(); //重启总线
- IIC_Write_Byte(0xa3); //发送读取命令
- for(i = 0;i < num;i++)
- {
- *pBuff = IIC_Read_Byte(); //读取数据
- if(i == (num - 1)) IIC_Ack(1); //发送非应答信号
- else IIC_Ack(0); //发送应答信号
- pBuff++;
- }
- }
- IIC_Stop();
- }
好了,就到这里吧,这个程序的结果是写入PCF8563时间信息,PCF8563读取到的时间信息显示在数码管上。
代码上传