• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: STM32  模拟I2C  

资源简介

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


评论

共有 条评论