PCF8563 时钟芯片驱动程序 (STM8S/STM8L)

发布者:Lihua1314520最新更新时间:2019-12-16 来源: eefocus关键字:PCF8563  时钟芯片  驱动程序  STM8S  STM8L 手机看文章 扫描二维码
随时随地手机看文章

模拟I2C读取时钟芯片PCF8563中的日期时间 


#define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号

#define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1)

#define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号

#define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2)


u8 buf[7];


void SDA_IN(u8 in) 

{

  if(in)

     GPIO_Init(GPIOD, GPIO_PIN_2,  GPIO_Mode_In_PU_IT );         //输入

  else

     GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_Mode_Out_OD_HiZ_Slow);   //输出

}


void delay_u()    

{

while(--10);

}

/**************************************************

**************************************************/

void Start()

{

SCLK_Set();     

        SDIN_Set();

        delay_u();

SDIN_Clr();

        delay_u();

SCLK_Clr();

}

/**********************************************

//IIC Stop

**********************************************/

void Stop()

{

        SCLK_Clr();

        delay_u();

SDIN_Clr();

        delay_u();        

        SCLK_Set();

        delay_u();

SDIN_Set();

        delay_u();

}




void WriteACK(u8 ack)

{

  if(ack)        SDIN_Set();

  else           SDIN_Clr();

  

    delay_u();

    SCLK_Set();

    delay_u();

    SCLK_Clr();

}




void WaitACK()

{  

   u8 errtime;

   errtime = 0;

   SDA_IN(1);

   SCLK_Set();

   delay_u();

   while(SDA_READ)

   {  errtime++;

      if(errtime==20)

      {Stop();

      break;}

   }

   SCLK_Clr();

   SDA_IN(0);

}

/**********************************************

// IIC Write byte

**********************************************/

void writebyte(u8 IIC_Byte)

{

u8 i;

u8 m,da;

da=IIC_Byte;

        SDA_IN(0);

SCLK_Clr();

for(i=0;i<8;i++) 

{

m=da;

m=m&0x80;

if(m==0x80)

{SDIN_Set();}

else SDIN_Clr();

da=da<<1;

SCLK_Set();

                delay_u();

SCLK_Clr();

}

        WaitACK();              //关键问题

}


u8 Readbyte()

{

   u8 i,bytedata;

   SDA_IN(1);

   delay_u(); 

   SDIN_Set();

   for(i=0;i<8;i++)

   {

      SCLK_Set(); 

      bytedata<<=1;

      if(SDA_READ)

      {

         bytedata++;

      }

      SCLK_Clr();

      delay_u();

   }

   SDA_IN(0);

   return(bytedata);

}

/**********************************************

// IIC Write Command

**********************************************/

void writeData(u8 address,u8 mdata)

{

Start();

writebyte(0xa2); /*写命令*/

writebyte(address); /*写地址*/

writebyte(mdata); /*写数据*/ 

Stop();

}

/********************************************

输入数据<-pcf8563

********************************************/

u8 ReadData(u8 address) /*单字节*/

{  u8 rdata =0;

   Start();

   writebyte(0xa2); /*写命令*/

   writebyte(address); /*写地址*/

   Start();   

   writebyte(0xa3); /*读命令*/

   rdata=Readbyte();

   WriteACK(1);

   Stop();

   return(rdata);

}


void ReadData1(u8 address,u8 count,u8 * buff) /*多字节*/

{  

   u8 i;

   Start();

   writebyte(0xa2); /*写命令*/

   writebyte(address); /*写地址*/

   Start();

   writebyte(0xa3); /*读命令*/

   for(i=0;i   {

        buff[i]=Readbyte();

        if(i   }

  WriteACK(1);

  Stop();

}

/********************************  

 读入时间到内部缓冲区  

*********************************/ 

void P8563_Read(void)  

{

    buf[0]=ReadData(0x02);

    buf[1]=ReadData(0x03);   

    buf[2]=ReadData(0x04);   

    buf[3]=ReadData(0x05);   

    buf[4]=ReadData(0x06);   

    buf[5]=ReadData(0x07);   

    buf[6]=ReadData(0x08);   

    Stop();  

    buf[0]=buf[0]&0x7F;//秒

    buf[1]=buf[1]&0x7F;//分

    buf[2]=buf[2]&0x3F;//时

    buf[3]=buf[3]&0x3F;//日

    buf[4]=buf[4]&0x07;//星期

    buf[5]=buf[5]&0x1F;//月  

    delay_u();

    buf[0]=HexToBcd(buf[0]);

    buf[1]=HexToBcd(buf[1]);

    buf[2]=HexToBcd(buf[2]);

    buf[3]=HexToBcd(buf[3]);

    buf[5]=HexToBcd(buf[5]);

    buf[6]=HexToBcd(buf[6]);     

}  

/*******************  

 写时间修改值  

*******************/  

void RTC_Set_Time(u8 sec,u8 min,u8 hour,u8 day,u8 week,u8 month,u8 year)  

{  

    sec=BcdToHex(sec);

    min=BcdToHex(min);

    hour=BcdToHex(hour);

    day=BcdToHex(day);

    week=week;

    month=BcdToHex(month);

    year=BcdToHex(year);

    delay_u();

    

    writeData(0x02,sec);

    writeData(0x03,min);

    writeData(0x04,hour);

    writeData(0x05,day);

    writeData(0x06,week);

    writeData(0x07,month);

    writeData(0x08,year); 

}  

/****************************  

 P8563的初始化   

********************************/  

void P8563_init(void)  

{  

  writeData(0x00,0x20); //时钟停止  

  RTC_Set_Time(30,12,12,1,5,12,17);  //秒,分,时,天,星期,月,年   

  delay_u();

  writeData(0x00,0x00); //时钟开始  

}  

/********************************************************************/

关键字:PCF8563  时钟芯片  驱动程序  STM8S  STM8L 引用地址:PCF8563 时钟芯片驱动程序 (STM8S/STM8L)

上一篇:STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片
下一篇:STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片

推荐阅读最新更新时间:2024-11-09 09:02

基于设备树的led驱动程序
1 #include linux/module.h 2 #include linux/kernel.h 3 #include linux/fs.h 4 #include linux/init.h 5 #include linux/delay.h 6 #include asm/io.h 7 #include linux/cdev.h 8 #include linux/device.h 9 #include linux/bitmap.h 10 #include asm/gpio.h 11 #include linux/platform_device.h 12 #include linux/sla
[单片机]
STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
计时时钟芯片概览 常用的计时时钟芯片有 DS12C887, DS1302, DS1307, DS3231, RX8025, 各型号还有衍生型号. 可以看到到大部分是Dallas生产的芯片, RX8025的厂商是Epson. 其中 DS1302 和 DS1307 可以看成是同一芯片的不同协议版本(SPI和I2C), 需要外接晶振, 如果晶振不带温补, 计时误差受温度影响较大. DS12C887是内建晶振的DS12C885, 在出厂时已经经过校准, 在+25°C时误差为±1分钟/月. DS12C887使用并口, 比较浪费IO资源, 另外体积也较大, 现在大都用于DIY用途. DS3231 自带温补晶振, 精度很高, 在 范围内误差
[单片机]
STC8H开发(十四): I2C驱动RX8025T高精度实时<font color='red'>时钟芯片</font>
字符设备驱动程序按键驱动---中断方式
中断函数:包含#include linux/irq.h request_irq(irq,handle,irqflag,name,dev_id) { 1,分配一个irqaction结构体 2、把这个结构体放到irq_desc (action链表)中 3、设置引脚 4、使能中断 } free_irq(irq,dev_id) { 1、irqaciton出链 2、禁止中断 } ----------------------------------------------------------------------------------------------------------------------
[单片机]
stm32舵机驱动程序分享
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按内核架构分为不同产品:   其中STM32F系列有:   STM32F103“增强型”系列   STM32F101“基本型”系列   STM32F105、STM32F107“互联型”系列   增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved