20240909-DXSPX-emb/Src/Usr/Driver/DrvRtcI2c.c

149 lines
4.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "DrvRtcI2c.h"
#include "BSPI2C.h"
static uint8_t g_usr_drv_rtc_i2c_id = 0;
// 检错模块
static int8_t Check_rt(int8_t rt) {
if (rt < 0) {
return -1;
}
return 0;
}
// 读取时间模块
static int8_t ReadTimeUnit(uint8_t address, uint8_t *value, uint8_t mask) {
int8_t rt;
uint8_t senddate = address;
uint8_t recvdate = 0;
// 发送地址
rt = BspMasterSend(g_usr_drv_rtc_i2c_id, USR_DRV_RTC_I2C_ADDRESS, &senddate, 1);
if (Check_rt(rt) < 0) return -1;
// 接收数据
rt = BspMasterRecv(g_usr_drv_rtc_i2c_id, USR_DRV_RTC_I2C_ADDRESS, &recvdate, 1);
if (Check_rt(rt) < 0) return -1;
// BCD转化
*value = (recvdate & 0x0f) + ((recvdate & mask) >> 4) * 10;
return 0;
}
// 设置时间模块
static int8_t SendTimeUnit(uint8_t reg, uint8_t value) {
uint8_t senddate[2] = {reg, value};
return Check_rt(BspMasterSend(g_usr_drv_rtc_i2c_id, USR_DRV_RTC_I2C_ADDRESS, senddate, sizeof(senddate)));
}
// 同上,改个名字,用于特殊寄存器的配置
static int8_t SendCommand(uint8_t reg, uint8_t value) {
uint8_t senddate[2] = {reg, value};
return Check_rt(BspMasterSend(g_usr_drv_rtc_i2c_id, USR_DRV_RTC_I2C_ADDRESS, senddate, sizeof(senddate)));
}
// 初始化RTC和I2C
int8_t DrvRtcI2CInit(uint8_t i2c_id, int32_t i2c_speed) {
int8_t rt;
g_usr_drv_rtc_i2c_id = i2c_id;
// 初始化I2C
rt = BspI2CInit(g_usr_drv_rtc_i2c_id, i2c_speed, USR_I2C_MASTER, 0);
if (Check_rt(rt) < 0) return -1;
// 初始化RTC
rt = DrvRtcI2CTrickCharge_uA();
if (Check_rt(rt) < 0) return -1;
rt = DrvRtcI2COutput1hz();
if (Check_rt(rt) < 0) return -1;
return 0;
}
// 获取RTC时间
int8_t DrvRtcI2CGetTime(USR_DRV_RTC_I2C_TIME *rtc_time) {
if (Check_rt(DrvRtcI2CReadSecond(&rtc_time->second)) < 0) return -1;
if (Check_rt(DrvRtcI2CReadMinute(&rtc_time->minute)) < 0) return -1;
if (Check_rt(DrvRtcI2CReadHour(&rtc_time->hour)) < 0) return -1;
if (Check_rt(DrvRtcI2CReadDate(&rtc_time->date)) < 0) return -1;
if (Check_rt(DrvRtcI2CReadMonth(&rtc_time->month)) < 0) return -1;
if (Check_rt(DrvRtcI2CReadYear(&rtc_time->year)) < 0) return -1;
return 0;
}
// 设置RTC时间
int8_t DrvRtcI2CSetTime(USR_DRV_RTC_I2C_TIME *rtc_time) {
if (Check_rt(DrvRtcI2CSetSecond(rtc_time->second)) < 0) return -1;
if (Check_rt(DrvRtcI2CSetMinute(rtc_time->minute)) < 0) return -1;
if (Check_rt(DrvRtcI2CSetHour(rtc_time->hour)) < 0) return -1;
if (Check_rt(DrvRtcI2CSetDate(rtc_time->date)) < 0) return -1;
if (Check_rt(DrvRtcI2CSetMonth(rtc_time->month)) < 0) return -1;
if (Check_rt(DrvRtcI2CSetYear(rtc_time->year)) < 0) return -1;
return 0;
}
// 读取时间函数群6
int8_t DrvRtcI2CReadSecond(uint8_t *second) {
return ReadTimeUnit(USR_DRV_RTC_I2C_SECOND, second, 0x70);
}
int8_t DrvRtcI2CReadMinute(uint8_t *minute) {
return ReadTimeUnit(USR_DRV_RTC_I2C_MINUTE, minute, 0x70);
}
int8_t DrvRtcI2CReadHour(uint8_t *hour) {
return ReadTimeUnit(USR_DRV_RTC_I2C_HOUR, hour, 0x30);
}
int8_t DrvRtcI2CReadDate(uint8_t *date) {
return ReadTimeUnit(USR_DRV_RTC_I2C_DATE, date, 0x30);
}
int8_t DrvRtcI2CReadMonth(uint8_t *month) {
return ReadTimeUnit(USR_DRV_RTC_I2C_MONTH, month, 0x10);
}
int8_t DrvRtcI2CReadYear(uint8_t *year) {
return ReadTimeUnit(USR_DRV_RTC_I2C_YEAR, year, 0xf0);
}
// 设置时间函数群6
int8_t DrvRtcI2CSetSecond(uint8_t second) {
return SendTimeUnit(USR_DRV_RTC_I2C_SECOND, ((second / 10) << 4) | (second % 10));
}
int8_t DrvRtcI2CSetMinute(uint8_t minute) {
return SendTimeUnit(USR_DRV_RTC_I2C_MINUTE, ((minute / 10) << 4) | (minute % 10));
}
int8_t DrvRtcI2CSetHour(uint8_t hour) {
return SendTimeUnit(USR_DRV_RTC_I2C_HOUR, ((hour / 10) << 4) | (hour % 10));
}
int8_t DrvRtcI2CSetDate(uint8_t date) {
return SendTimeUnit(USR_DRV_RTC_I2C_DATE, ((date / 10) << 4) | (date % 10));
}
int8_t DrvRtcI2CSetMonth(uint8_t mon) {
return SendTimeUnit(USR_DRV_RTC_I2C_MONTH, ((mon / 10) << 4) | (mon % 10));
}
int8_t DrvRtcI2CSetYear(uint8_t year) {
return SendTimeUnit(USR_DRV_RTC_I2C_YEAR, ((year / 10) << 4) | (year % 10));
}
// RTC初始化函数群3
int8_t DrvRtcI2CTrickCharge_mA(void) {
if (Check_rt(SendCommand(USR_DRV_RTC_I2C_TCH2, 0x20)) < 0) return -1;
return SendCommand(USR_DRV_RTC_I2C_CFG2, 0x05);
}
int8_t DrvRtcI2CTrickCharge_uA(void) {
if (Check_rt(SendCommand(USR_DRV_RTC_I2C_TCH2, 0x20)) < 0) return -1;
return SendCommand(USR_DRV_RTC_I2C_CFG2, 0x45);
}
int8_t DrvRtcI2COutput1hz(void) {
if (Check_rt(SendCommand(USR_DRV_RTC_I2C_SFKEY1, 0x5E)) < 0) return -1;
if (Check_rt(SendCommand(USR_DRV_RTC_I2C_SFKEY2, 0xC7)) < 0) return -1;
if (Check_rt(SendCommand(USR_DRV_RTC_I2C_SFR, 0x01)) < 0) return -1;
return SendCommand(USR_DRV_RTC_I2C_CAL_CFG1, 0x40);
}