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