DS1307
注意DS1307寄存器0X00的bit7,清零计数使能
写操作,地址0XD0
读操作,地址0XD1
GPIO初始化、I2C初始化
wm_i2c_scl_config(WM_IO_PA_01);
wm_i2c_sda_config(WM_IO_PA_04);
tls_i2c_init(400000);//最大频率400KHz
unsigned char ds1307_read_reg(unsigned char reg_addr)//读寄存器
{
//printf("%d\r:%s....reg_addr=0x%X\r\n",tls_os_get_time(),__FUNCTION__,reg_addr);
tls_i2c_write_byte(ds1307_addr,1);
tls_i2c_wait_ack();
tls_i2c_write_byte(reg_addr, 0);
tls_i2c_wait_ack();
tls_i2c_write_byte(ds1307_addr|1, 1);
tls_i2c_wait_ack();
return tls_i2c_read_byte(0, 1);;
}
void ds1307_write_reg(unsigned char reg_addr,unsigned char data)//写寄存器
{
//printf("%d\r:%s.... reg_addr:0x%X data:0x%X\r\n",tls_os_get_time(),__FUNCTION__,reg_addr,data);
tls_i2c_write_byte(ds1307_addr, 1); //发送 写 命令
tls_i2c_wait_ack();
tls_i2c_write_byte(reg_addr, 0);//发送地址
tls_i2c_wait_ack();
tls_i2c_write_byte(data, 0); //发送字节
tls_i2c_wait_ack();
tls_i2c_stop();
tls_os_time_delay(1);//必要的
}
void ds1307_set(unsigned short year,unsigned short month,unsigned short data,
unsigned short week,unsigned short hour,
unsigned short minute,unsigned short second)
{//设置日期
printf("%d\r:%s....year:%d month:%d data:%d --week:%d\n\r\r
time: %d:%d:%d\r\n",tls_os_get_time(),__FUNCTION__,
year,month,data,week,hour,minute,second);
if(year>99)
year-=2000;
unsigned short date[7]={second,minute,hour,week,data,month,year};//year month data week hour minute second
date[0]=((date[0]/10)<<4)+date[0]%10;//second
date[1]=((date[1]/10)<<4)+date[1]%10;//minute
date[2]=((date[2]/10)<<4)+date[2]%10;//hour
date[3]=((date[3]/10)<<4)+date[3]%10;//week
date[4]=((date[4]/10)<<4)+date[4]%10;//data
date[5]=((date[5]/10)<<4)+date[5]%10;//month
date[6]=((date[6]/10)<<4)+date[6]%10;//year
for(int i=0;i<7;i++)
ds1307_write_reg(i, date[i]);
}
void ds1307_read(void )//获取日期时间
{
unsigned short date[7];
for(int i=0;i<7;i++)
date[i]=ds1307_read_reg(i);
date[0]=(date[0]/16)*10+date[0]%16;
date[1]=(date[1]/16)*10+date[1]%16;
date[2]=(date[2]/16)*10+date[2]%16;
date[3]=(date[3]/16)*10+date[3]%16;
date[4]=(date[4]/16)*10+date[4]%16;
date[5]=(date[5]/16)*10+date[5]%16;
date[6]=(date[6]/16)*10+date[6]%16+2000;
printf("data:%d-%d-%d-week:%d \r time: %d:%d:%d\r\n",
date[6],date[5],date[4],date[3],date[2],date[1],date[0]);
}
另外:
W801的内部寄存器HR_PMU_RTC_CTRL1、HR_PMU_RTC_CTRL2,有兴趣的可以试一下