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

149 lines
4.7 KiB
C
Raw Normal View History

#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);
}