资源简介
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
相关资源
- STM32输出SPWM
- SSD1305 SPI DMA驱动
- STM32F103C8T6封装.zip
- STM32几个简单小程序
- 基于STM32F103的SHT11温湿度传感器采集程
- 基于STM32的闹钟程序
- STM32的红外遥控程序,亲测能用
- STM32的待机唤醒程序,亲测能用
- STM32的RTC实时时钟程序,亲测能用
- stm32 外部上升沿触发ADC采集
- STM32的傅里叶算法
- STM32F103ZET6 原理图文件SCH 。protel99s
- stm32固件库改写文件
- stm103_falsh读写
- STM32F103 TFT彩屏显示图片和汉字字符(
- STM32F103 TFT彩屏显示汉字字符(取摸
- STM32雕刻机、CNC源代码
- stm32f4探索者开发板原理图
- STM32Cube-USART
- STM32F10Xlib.h系列的固件库
- STM32F030-uCOSIII
- 开源三轴无刷云台算法STM32程序带注释
- STM32 d的图形GUI界面代码
- STM32驱动max30102和MLX90614程序
- stm32 IAP源码
- STM32F407 6288语音模块程序
- STM32-实时时钟和闹钟程序.pdf
- 声音定位系统
- STM32定时器
- 基于STM32图像采集程序
评论
共有 条评论