STM32对时钟芯片PCF8563的编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~
移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。
使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。
全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。
我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h 和IIC.C。只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~
Delay_nus(20):这是一个延迟20us的函数。
IIC.h:
#ifndef _IIC_H_
#define _IIC_H_
#include "stm32f10x.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/*#define I2C_Speed 100000
#define I2C1_SLA VE_ADDRESS7 0xA0
#define I2C_PageSize 256 */
//SCL PA0
//SDA PA1
#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)
#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)
#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)
#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)
//返回0,和1
#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)
u8 IIC_ReadByte(void);
void IIC_WriteByte(u8 byte);
void IIC_WaitAck(void);
void IIC_Stop(void);
void IIC_Start(void);
void IIC_Init(void);
void I2C_Ack(void);
void I2C_NoAck(void);
//取回八个字节的数据:秒,分,时,天,星期,月份,年份。
#endif
IIC.c:
#include "IIC.h"
#include "delay.h"
/**/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure I2C1 pins: SCL and SDA */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出,可以在不用改变成输入的情况下读取IO的电平
GPIO_Init(GPIOA, &GPIO_InitStructure);
SCL_H(); //拉高
SDA_H();
}
void IIC_Start(void)
{
/* SDA_H();
SCL_H();
delay_nus(20);
SDA_L();
delay_nus(20);
*/
SDA_H();
SCL_H();
delay_nus(20);
SDA_L();
delay_nus(20);
SDA_L();
delay_nus(20);
}
void IIC_Stop(void)
{
SCL_L(); //1
delay_nus(20);// 2
SDA_L(); // 3. 1,2,3这三行不可缺少
delay_nus(20);
SCL_H();
delay_nus(20);
SDA_H();
delay_nus(20);
}
void IIC_WaitAck(void)
{
u16 k;
SCL_L();
SDA_H();
delay_nus(20);
SCL_H();
k = 0;
while((Read_SDA()!= 0) && (k < 60000))k++;
delay_nus(20);
SCL_L();
delay_nus(20);
}
void IIC_WriteByte(u8 byte)
{
u8 i = 0;
for(i = 0; i < 8; i++)
{
SCL_L();
delay_nus(20);
if(byte & 0x80)
{
SDA_H();
}
else