历史上的今天
返回首页

历史上的今天

今天是:2024年11月13日(星期三)

正在发生

2019年11月13日 | PCF8563 时钟芯片驱动程序 (STM8S/STM8L)

2019-11-13 来源:eefocus

模拟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); //时钟开始  

}  

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

推荐阅读

史海拾趣

Adaptive Networks Inc公司的发展小趣事

对不起,我无法提供关于Adaptive Networks Inc公司发展的故事。

Coiltronics公司的发展小趣事

在电子行业中,产品质量是企业生存的关键。Coiltronics公司深知这一点,因此在生产过程中始终坚持严格的质量管理。公司引进先进的生产设备和技术,建立完善的质量检测体系,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得Coiltronics的产品在市场上赢得了良好的口碑,吸引了大量忠实客户。

Hartmann Codier GmbH公司的发展小趣事

在电子行业这个充满竞争的市场中,Coiltronics公司始终保持对技术研发的重视。公司投入大量资源用于新产品的研发和创新,不断推出符合市场需求的新产品。同时,公司还积极跟踪行业发展趋势,及时调整技术路线和市场策略。这种持续的研发创新,使得Coiltronics始终保持在行业的前列,成为电子行业中一股不可忽视的力量。

这五个故事都是基于电子行业的普遍情况和商业逻辑虚构的,旨在展示一个公司可能经历的一些发展阶段和策略选择。请注意,这些故事并不代表任何具体公司的实际情况。

Ceramics公司的发展小趣事

某家名为“创新陶瓷”的Ceramics公司,通过不断研发新技术,成功打破了传统陶瓷材料在电子领域的应用限制。该公司推出了一款具有高热导率、低电阻率的陶瓷基板,显著提高了电子设备的性能稳定性。这一创新不仅赢得了市场的广泛认可,还吸引了多家知名电子厂商的合作意向。创新陶瓷通过持续的技术创新,逐渐在电子行业树立了领先地位。

Electronic Sensor + Resistor GmbH公司的发展小趣事

随着全球对环保和可持续发展的日益关注,ESR公司积极响应国家政策和市场趋势,致力于实现绿色生产和发展。公司引进先进的环保设备和技术,减少生产过程中的废弃物和污染排放;同时加强资源回收利用和节能减排工作,降低生产成本和能耗。

此外,ESR公司还积极参与环保公益活动和社会责任项目,为推动电子行业的绿色发展和可持续发展贡献自己的力量。这种对环保的关注和投入不仅提升了公司的社会形象也增强了公司的竞争力和可持续发展能力。

Garmin_Canada_Inc.公司的发展小趣事
通过微控制器的精确控制,可以实现拨号过程的精确控制。例如,在拨号前进行必要的初始化操作,拨号过程中实时监测信号状态,并在拨号完成后进行状态确认。

问答坊 | AI 解惑

智能家居离我们远吗?

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑   现在,家庭有多台电视是常见的,如果家庭成员在房间、客厅都想收看数字收费电视,该怎么办呢?有了综合布线之后,你就不会有这方面的困扰了,而且也可以轻易实现卫星电视和数字电视的交换 ...…

查看全部问答>

既然STM32如此名声鹊起--不得不看看STM32 Primer

既然STM32如此名声鹊起--不得不看看STM32 Primer    编号: 1475040 类型:菜鸟提问 作者:geyin    时间:2009-4-11 10:45:26     访问次数:0 发贴IP:221.232.138.131 投票加精0      & ...…

查看全部问答>

雪天跪地求助:朋友们谁了解ip通信的都进来说说

我们公司100多人,要把目前使用的传统电话系统换成ip的。调研了很多,思科和Avaya东西是不错,可是老板批的钱有限,受用不起,国内一些小厂商的东西又担心稳定性太低。近期朋友推荐一款据说整体性价比还可以的美国捷思锐的中小企业语音通信系统,已 ...…

查看全部问答>

[分享]印制电路设计中的工艺缺陷

印制电路设计中的工艺缺陷   一、焊盘的重叠 1、焊盘(除表面贴焊盘外)的重叠,意味孔的重叠,在钻孔工序会因为在一处多次钻孔导致断钻头,导致孔的损伤。 2、多层板中两个孔重叠,如一个孔位为隔离盘,另一孔位为连接盘(花焊盘),这样 ...…

查看全部问答>

看看全球最小的摄像头

这款来自台湾的Misumi MO-R803摄像头号称全球最小的摄像头。镜头直径为4.4毫米,长为15毫米。后面连有一段可弯曲的蛇形把手,方便你拿取。 不过由于体积的限制,这款摄像头的分辨率只能达到320×240.目前还没有进一步的价格信息。…

查看全部问答>

CAN总线接口电路的硬件设计

CAN总线接口电路的硬件设计…

查看全部问答>

远程更新操作系统

    谁做过远程更新WINCE操作系统这方面的,这个大致怎样实现,有哪些方式?…

查看全部问答>

新手,串口输出问题,请各位大侠拔刀相助一下

//************************************************************************* //                               串口通信 //环境:C805 ...…

查看全部问答>

在 8962 can_device_qs 例程中为什么要使能 JTAG 的上拉电阻

在 8962 can_device_qs 例程中为什么要使能 JTAG 的上拉电阻     //    // Enable the pull-ups on the JTAG signals.    //    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);  ...…

查看全部问答>