关于武汉芯景科技有限公司的实时时钟芯片XJ8010开发指南(兼容RX8010)

一、准备工作

1.引脚图

2.引脚描述

3.硬件准备

(1)Arduino 单片机

(2)AT8010芯片

4.基于Arduino的硬件IIC总线函数封装

可以由下面的函数对寄存器进行读写,以及连续读写

源文件

#include "iic.hpp"
#include <Wire.h>
#include "Arduino.h"


 void WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite)
{     
  Wire.beginTransmission(ADDRESS_SLAVE);
  Wire.write(WriteAddr);
  Wire.write(DataToWrite);
  Wire.endTransmission();
  delay(1);                                                                                                     
}

  u8 ReadOneByte(u8 ReadAddr)
{                  
    u8 temp=0;       
    Wire.beginTransmission(ADDRESS_SLAVE);
    Wire.write(ReadAddr);
    Wire.endTransmission();
    Wire.requestFrom(ADDRESS_SLAVE, 1);
    temp = Wire.read();
    Wire.endTransmission();
    return temp;
}


void Continuous_writing(uint8_t registers ,  uint8_t *send_data ,int length)
{
    Wire.beginTransmission(ADDRESS_SLAVE);
    Wire.write(registers);
   for (int i=0; i<length; i++)
   {
    Wire.write(*(send_data +i) );
   }
    Wire.endTransmission();
}



void Continuous_reading(uint8_t registers ,  uint8_t *receive_data ,int length)
{
    Wire.beginTransmission(ADDRESS_SLAVE);
    Wire.write(registers);
    Wire.endTransmission();
    Wire.requestFrom(ADDRESS_SLAVE, length);
   for (int i=0; i<length; i++)
   {
    *(receive_data+i) = Wire.read();
   }
    Wire.endTransmission();
}

头文件

#ifndef __IIC_HPP
#define __IIC_HPP

#include "Arduino.h"
#include "iic.hpp"
#include <Wire.h>

#define ADDRESS_SLAVE 0x32
void WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite);
void Continuous_writing(uint8_t registers ,  uint8_t *send_data ,int length);
u8 ReadOneByte(u8 ReadAddr);
void Continuous_reading(uint8_t registers ,  uint8_t *receive_data ,int length);

#endif

二、正式工作

1、AT8010初始化

源文件

#include "Arduino.h"
#include "AT8010.hpp"
#include "iic.hpp"

  void AT8010_Init()
  {
    WriteOneByte(Reserved_17,Clear);
    WriteOneByte(Reserved_30,Clear);
    WriteOneByte(Reserved_31,Clear);  
    WriteOneByte(IRQ_Control,Clear);  
    WriteOneByte(Extension_Register,Clear);  
    WriteOneByte(Flag_Register,Clear); 
    WriteOneByte(Control_Register,Clear); 
  }

头文件

#ifndef __AT8010_HPP
#define __AT8010_HPP
#include "Arduino.h"
#include "AT8010.hpp"

#define Reserved_17 0xD8
#define Reserved_30 0xD8
#define Reserved_31 0xD8
#define Extension_Register 0x1D
#define Flag_Register  0x1E
#define Control_Register   0x1F
#define IRQ_Control 0x32
#define Clear 0x00

void AT8010_Init();

#endif

2.Clock calendar explanation

源文件

#include "Arduino.h"
#include "clock.hpp"
#include "iic.hpp"

//Clock_Init(&Clock_init);  设定时间
//clock_print();  打印时间

  Clock_Typedef Clock_init={
    Clock_init.SEC=0x50,
    Clock_init.MIN=0x59,
    Clock_init.HOUR=0x17,
    Clock_init.WEEK=0x01,
    Clock_init.DAY=0x01,
    Clock_init.MONTH=0x01,
    Clock_init.YEAR=0x23,
  };

/*设定时间*/
  void Clock_Init(Clock_Typedef* clock)
  {
    Continuous_writing(Clock_SEC,(uint8_t*)clock ,7);
  }

/*打印时间*/
  void clock_print()
 {
   Serial.print("20");
   Serial.print(ReadOneByte(Clock_YEAR) ,HEX);Serial.print("/");
   Serial.print(ReadOneByte(Clock_MONTH) , HEX);Serial.print("/");
   Serial.print(ReadOneByte(Clock_DAY), HEX);Serial.print(" ");  
   Serial.print(ReadOneByte(Clock_WEEK), HEX);Serial.print(" ");  
   Serial.print(ReadOneByte(Clock_HOUR), HEX);Serial.print(":");
   Serial.print(ReadOneByte(Clock_MIN), HEX);Serial.print(":");
   Serial.println(ReadOneByte(Clock_SEC), HEX);
   delay(1000);
 }

头文件

#ifndef __CLOCK_HPP
#define __CLOCK_HPP
#include "Arduino.h"
#include "clock.hpp"

#define Clock_SEC 0x10
#define Clock_MIN 0x11
#define Clock_HOUR 0x12
#define Clock_WEEK 0x13
#define Clock_DAY 0x14
#define Clock_MONTH 0x15
#define Clock_YEAR 0x16

typedef struct{
  uint8_t SEC;
  uint8_t MIN;
  uint8_t HOUR;
  uint8_t WEEK; 
  uint8_t DAY;
  uint8_t MONTH;
  uint8_t YEAR;
}Clock_Typedef;

extern Clock_Typedef Clock_init;

void Clock_Init(Clock_Typedef* clock);
void clock_print();

#endif

3.Fixed-cycle Timer Interrupt Function

源文件


#include <Wire.h>
#include "Arduino.h"
#include "iic.hpp"
#include "timer.hpp"
#include "AT8010.hpp"
//timer计数  IRQ_Init(&IRQ_init,IRQ2_interrupt);
   TIMER_Typedef TIMER_init={
   TIMER_init.timer_counter0=200,
   TIMER_init.timer_counter1=00,
   TIMER_init.extension_register=SourceClock_1HZ,
   TIMER_init.flag_register=Clear_flag,
   TIMER_init.control_register=TimerInterrupt_Disable,
   };

  void TIMER_Init(TIMER_Typedef* TIMER,uint8_t Control)
  {
    Continuous_writing(0x1B,(uint8_t*)TIMER ,6);
    WriteOneByte(IRQ_Control,Control); 
  }

头文件

#ifndef __TIMER_HPP
#define __TIMER_HPP
#include "Arduino.h"
#include "timer.hpp"

#define Clear_flag 0x00

#define IRQ1_interrupt 0x04
#define IRQ2_interrupt 0x00

#define SourceClock_4096HZ 0x10
#define SourceClock_64HZ 0x11
#define SourceClock_1HZ 0x02
#define SourceClock1_60HZ 0x13
#define SourceClock1_3600HZ 0x14

#define Count_Enable 0X10
#define Count_Disable 0X00

#define TimerInterrupt_Enable 0X10
#define TimerInterrupt_Disable 0X00

  typedef struct{
    uint8_t timer_counter0;
    uint8_t timer_counter1;
    uint8_t extension_register;
    uint8_t flag_register;
    uint8_t control_register;
  }TIMER_Typedef;

extern TIMER_Typedef TIMER_init;

void TIMER_Init(TIMER_Typedef* TIMER,uint8_t Control);

#endif

4、Alarm Interrupt Function

源文件

#include "Arduino.h"
#include "ALARM.hpp"
#include "iic.hpp"
#include "AT8010.hpp"

   Alarm_Typedef Alarm_init={
    Alarm_init.MIN_Alarm=0x00,
    Alarm_init.HOUR_Alarm=0x18,
    Alarm_init.WD_Alarm=0x01, 
  };

  void Alarm_Init(Alarm_Typedef*alarm)
  {
    Continuous_writing(0x18,(uint8_t*)alarm ,3);
    WriteOneByte(Extension_Register,WEEK);
    WriteOneByte(Control_Register,ALARM_DISABLE);
  }

头文件

#ifndef __ALARM_HPP
#define __ALARM_HPP
#include "Arduino.h"
#include "alarm.hpp"

#define WEEK 0x00
#define DAY 0x08
#define ALARM_ENABLE 0x08
#define ALARM_DISABLE 0x00

typedef struct{
  uint8_t MIN_Alarm;
  uint8_t HOUR_Alarm;
  uint8_t WD_Alarm;
}Alarm_Typedef;

extern Alarm_Typedef Alarm_init;

void Alarm_Init(Alarm_Typedef*alarm);

#endif

5、Time Update Interrupt Function

源文件

#include "Arduino.h"
#include "update.hpp"
#include "iic.hpp"
#include "AT8010.hpp"

 void Update_init ()
 {
   WriteOneByte(Extension_Register,Second_update); 
   WriteOneByte(Control_Register,Update_ENABLE); 
 }

头文件

#ifndef __update_HPP
#define __update_HPP
#include "Arduino.h"
#include "update.hpp"

#define Second_update 0x00
#define Minute_update 0x20

#define Update_ENABLE 0x20
#define Update_DISABLE 0x00

void Update_init ();
#endif

6、FOUT function

源文件

#include "Arduino.h"
#include "Fout.hpp"
#include "iic.hpp"
#include "AT8010.hpp"
  
  // Fout_init(Output_1Hz,IRQ2_Output);
  void Fout_init(uint8_t FSEL,uint8_t FOPIN1)
  {
   WriteOneByte(Extension_Register,FSEL);
   WriteOneByte(IRQ_Control,FOPIN1);
  }

头文件

#ifndef __FOUT_HPP
#define __FOUT_HPP
#include "Arduino.h"
#include "Fout.hpp"

#define Output_OFF 0x00
#define Output_1Hz  0x40
#define Output_1024Hz  0x80
#define Output_32768Hz  0xc0

#define IRQ1_Output  0x01
#define IRQ2_Output  0x00

void Fout_init(uint8_t FSEL,uint8_t FOPIN1);

#endif

7、主函数

#include <Wire.h>
#include "iic.hpp"
#include "timer.hpp"
#include "clock.hpp"
#include "Fout.hpp"
#include "AT8010.hpp"
#include "ALARM.hpp"
#include "update.hpp"

void setup()
{
    Wire.begin();
    Serial.begin(9600);
    AT8010_Init();
    Clock_Init(&Clock_init);   
    //Alarm_Init(&Alarm_init);
    //TIMER_Init(&TIMER_init,IRQ1_interrupt);
    //Update_init ();
    //Fout_init(Output_1Hz,IRQ2_Output);
}

void loop()
{
    clock_print();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值