STM32对时钟芯片PCF8563的编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档