资源简介
STM32模拟I2C读写PCF8563程序,仅需更改初始化的IO配置即可使用,使用简单

代码片段和文件信息
#include “stm8l15x.h“
#include “pcf8563.h“
#ifndef WD_DADR
#define WD_DADR 0xA2 //write device-address
#endif
#ifndef RD_DADR
#define RD_DADR 0xA3 //read device-address
#endif
#define CTRL_BUF1 0x00
#define CTRL_BUF2 0x01
#define SECOND_DATA_BUF 0x02
#define MINUTE_DATA_BUF 0x03
#define HOUR_DATA_BUF 0x04
#define DAY_DATA_BUF 0x05
#define WEEK_DATA_BUF 0x06
#define MONTH_DATA_BUF 0x07
#define YEAR_DATA_BUF 0x08
#define MINUTE_AE_BUF 0x09
#define HOUR_AE_BUF 0x0A
#define DAY_AE_BUF 0x0B
#define WEEK_AE_BUF 0x0C
#define CLK_FRQ_BUF 0x0D
#define TIMER_CTRL_BUF 0x0E
#define COUNT_VAL_BUF 0x0F
//changeIntToHex(33),return 0x33
//传参必须为 unsigned 类型
#define changeIntToHex(dec) ( ( ((dec)/10) <<4 ) + ((dec)%10) )
//调用changeHexToInt(0x33),return 33
//传参必须为 unsigned 类型
#define changeHexToInt(hex) ( ( ((hex)>>4) *10 ) + ((hex)%16) )
unsigned char i=0;
#define I2C_busy() while((I2C1->SR3&0x02)==1);
#define I2C_start1() I2C1->CR2|=0x01;
#define I2C_stop() I2C1->CR2|=0x02;
#define I2C_Ack() I2C1->CR2|=0x04;
#define I2C_NAck() I2C1->CR2&=(~0x04);
#define I2C_addrask (I2C1->SR1&0x02)
#define I2C_SBask (I2C1->SR1&0x01)
#define I2C_TxEask (I2C1->SR1&0x80)
#define I2C_RxNeask (I2C1->SR1&0x40)
#define I2C_BTF (I2C1->SR1&0x04)
#define I2C_BERR_ERR (I2C1->SR2&0x01)
#define I2C_AF_ERR (I2C1->SR2&0x04)
#define I2C_writebyte(x) I2C1->DR=x;
void I2C_Init(void)
{
I2C1->FREQR=0x0f; //设置频率寄存器
I2C1->CCRH=0x00; //设置始终寄存器高位
I2C1->CCRL=0x50; //设置始终寄存器低位
I2C1->TRISER=0x11; //设置最大SCL上升时间
I2C1->CR1|=0x01; //使能I2C模块
I2C_Ack(); //设置匹配应答
I2C1->CR2|=0x08; //设置接收应答
}
void I2C_Start(void)
{
I2C_busy();
I2C_start1();
while(I2C_SBask==0);
}
/*-------------传送地址---------------*/
void I2C_SendDAdr(u8 Add)
{
I2C_writebyte(Add);
while(I2C_addrask==0);
I2C_busy();
}
/*----------------发送数据&接收数据------------------*/
void I2C_SendDat(u8 data)
{
I2C_writebyte(data);
I2C_busy();
while(I2C_TxEask==0);
}
u8 I2C_RcvDat(void)
{
u8 i;
while(I2C_RxNeask==0);
abc:
if(I2C_BTF==0x04)
{i=I2C1->DR;}
else goto abc;
if(I2C_BTF==0){}
else goto abc;
return i;
}
void WriteAByte(u8 wordAdru8 dat)
{
I2C_Start();
I2C_SendDAdr(WD_DADR);
I2C_SendDat(wordAdr);
I2C_SendDat(dat);
I2C_stop();
}
void PCF8563_getTime(u8 *buf)
{
u8 i;
I2C_Start();
I2C_SendDAdr(WD_DADR);
I2C_SendDat(SECOND_DATA_BUF);
I2C_Start();
I2C_SendDAdr(RD_DADR);
for(i=0;i<7;i++)
{
buf[i]=I2C_RcvDat();
}
I2C_NAck();
buf[i]=I2C_RcvDat();
I2C_stop();
I2C_Ack();
buf[0]=buf[0]&0x7f; //get second data
buf[1]=buf[1]&0x7f; //get minute data
buf[2]=buf[2]&0x3f; //get hour data
buf[3]=buf[3]&0x3f; //get day data
buf[4]=buf[5]&0x1f; //get mon
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4242 2012-02-21 19:40 PCF8563.c
文件 1074 2012-02-21 19:40 pcf8563.h
----------- --------- ---------- ----- ----
5316 2
相关资源
- 基于stm32f103ve的程序——跑马灯实验
- 基于STM32RCT6的步进电机驱动程序
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
- SIM908 SDIO FSMC STM32 FIFO
- STM32F103 CC2500完整驱动(模拟SPI)
- AD7606采集程序
- stm32 用SPI 方式读写 SDHC
- stm32通过DMA方式采集ADC数据
- 意法半导体STM全系列微控制器STM32ST
- 基于STM32芯片的SX1278 驱动 LORA.rar
- STM32的PCB封装库,以及原理图库,48
- SX1280.rar
评论
共有 条评论