增加文件系统
This commit is contained in:
@@ -1,12 +1,16 @@
|
||||
/*
|
||||
* 模块名称:SD2506API-G RTC 实时时钟驱动
|
||||
* 模块功能:SD2506API-G 高精度温补实时时钟模<EFBFBD>?I2C 驱动
|
||||
* 适用平台:STM32F407ZGT6,I2C1 接口 (PB6-SCL, PB7-SDA)
|
||||
* 作者:王建<EFBFBD>? * 创建日期<E697A5>?026-07-17
|
||||
* 修改记录<EFBFBD>? * 2026-07-17 王建<E78E8B>? 创建初始版本,参<EFBC8C>?SD2506API-G Ver2.0 手册
|
||||
* 模块名称:SD2506API-G RTC Driver
|
||||
* 模块功能:SD2506API-G 高精度温补实时时钟驱动,I2C 接口
|
||||
* 适用平台:STM32F407ZGTx + SD2506API-G 实时时钟芯片(I2C1: PB6-SCL, PB7-SDA)
|
||||
* 作者:王建锋
|
||||
* 创建日期:2026-07-17
|
||||
* 修改记录:
|
||||
* 2026-07-17 王建锋 创建初始版本,参考 SD2506API-G Ver2.0 手册
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "sd2506.h"
|
||||
#include "i2c.h"
|
||||
|
||||
@@ -15,8 +19,11 @@ extern I2C_HandleTypeDef hi2c1;
|
||||
/* ======================== 内部辅助函数 ======================== */
|
||||
|
||||
/*
|
||||
* 函数功能:BCD 码转十进<EFBFBD>? * 入口参数:bcd - BCD 编码<E7BC96>? uint8_t 0x00 - 0x99
|
||||
* <EFBFBD>?<3F>?值:十进制数<E588B6>? * 限定条件:输入为合法 BCD <20>? * 函数说明:高 4 位为十位,低 4 位为个位
|
||||
* 函数功能:BCD 码转十进制数
|
||||
* 入口参数:bcd - BCD 编码值 uint8_t 0x00 - 0x99
|
||||
* 返回值:十进制数值 uint8_t
|
||||
* 限定条件:输入为合法 BCD 编码(高 4 位和低 4 位均 <= 9)
|
||||
* 函数说明:高 4 位为十位,低 4 位为个位,分别乘 10 和加后返回
|
||||
*/
|
||||
uint8_t sd2506_bcd_to_dec(uint8_t bcd) {
|
||||
return ((bcd >> 4) * 10) + (bcd & 0x0FU);
|
||||
@@ -31,9 +38,11 @@ uint8_t sd2506_dec_to_bcd(uint8_t dec) {
|
||||
|
||||
/*
|
||||
* 函数功能:写单字节寄存器
|
||||
* 入口参数:reg - 寄存器地址 uint8_t 00H - 79H
|
||||
* val - 写入<EFBFBD>? uint8_t 0x00 - 0xFF
|
||||
* <EFBFBD>?<3F>?值:0 - 成功<E68890>?2 - I2C 错误
|
||||
* 入口参数:reg - 寄存器地址 uint8_t 0x00 - 0x79
|
||||
* val - 写入数据 uint8_t 0x00 - 0xFF
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:I2C 外设已初始化
|
||||
* 函数说明:通过 I2C 向指定地址写入 1 字节数据
|
||||
* 限定条件:I2C 外设已初始化
|
||||
* 函数说明:通过 I2C 向指定地址写入 1 字节
|
||||
*/
|
||||
@@ -48,10 +57,12 @@ static int sd2506_write_reg(uint8_t reg, uint8_t val) {
|
||||
|
||||
/*
|
||||
* 函数功能:读单字节寄存器
|
||||
* 入口参数:reg - 寄存器地址 uint8_t 00H - 79H
|
||||
* val - 读取值指<EFBFBD>? uint8_t*
|
||||
* <EFBFBD>?<3F>?值:0 - 成功<E68890>?2 - I2C 错误
|
||||
* 限定条件:I2C 外设已初始化,val 为非空指<EFBFBD>? * 函数说明:通过 I2C 从指定地址读取 1 字节
|
||||
* 入口参数:reg - 寄存器地址 uint8_t 0x00 - 0x79
|
||||
* p_val - 读取值指针 uint8_t*(非空)
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:I2C 外设已初始化,p_val 为非空指针
|
||||
* 函数说明:通过 I2C 从指定地址读取 1 字节数据
|
||||
* 限定条件:I2C 外设已初始化,val 为非空指针函数说明:通过 I2C 从指定地址读取 1 字节
|
||||
*/
|
||||
static int sd2506_read_reg(uint8_t reg, uint8_t *p_val) {
|
||||
if (HAL_I2C_Mem_Read(&hi2c1, SD2506_I2C_ADDR_READ, reg,
|
||||
@@ -63,12 +74,14 @@ static int sd2506_read_reg(uint8_t reg, uint8_t *p_val) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:写多字节寄存器
|
||||
* 入口参数:reg - 起始寄存器地址 uint8_t 00H - 79H
|
||||
* data - 数据缓冲区指<EFBFBD>? uint8_t*
|
||||
* len - 数据长度 uint8_t 1 - N
|
||||
* <EFBFBD>?<3F>?值:0 - 成功<E68890>?2 - I2C 错误
|
||||
* 限定条件:I2C 外设已初始化,data 为非空指<EFBFBD>? * 函数说明:从 reg 开始连续写<E7BBAD>?len 字节
|
||||
* 函数功能:写多字节寄存器(连续写)
|
||||
* 入口参数:reg - 起始寄存器地址 uint8_t 0x00 - 0x79
|
||||
* p_data - 数据缓冲区指针 uint8_t*(非空)
|
||||
* len - 数据长度 uint8_t 1 - N
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:I2C 外设已初始化,p_data 为非空指针
|
||||
* 函数说明:从 reg 开始连续写入 len 字节数据
|
||||
* 限定条件:I2C 外设已初始化,data 为非空指针
|
||||
*/
|
||||
static int sd2506_write_regs(uint8_t reg, const uint8_t *p_data, uint8_t len) {
|
||||
if (HAL_I2C_Mem_Write(&hi2c1, SD2506_I2C_ADDR_WRITE, reg,
|
||||
@@ -80,12 +93,14 @@ static int sd2506_write_regs(uint8_t reg, const uint8_t *p_data, uint8_t len) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:读多字节寄存器
|
||||
* 入口参数:reg - 起始寄存器地址 uint8_t 00H - 79H
|
||||
* data - 数据缓冲区指<EFBFBD>? uint8_t*
|
||||
* len - 数据长度 uint8_t 1 - N
|
||||
* <EFBFBD>?<3F>?值:0 - 成功<E68890>?2 - I2C 错误
|
||||
* 限定条件:I2C 外设已初始化,data 为非空指<EFBFBD>? * 函数说明:从 reg 开始连续读<E7BBAD>?len 字节
|
||||
* 函数功能:读多字节寄存器(连续读)
|
||||
* 入口参数:reg - 起始寄存器地址 uint8_t 0x00 - 0x79
|
||||
* p_data - 数据缓冲区指针 uint8_t*(非空)
|
||||
* len - 数据长度 uint8_t 1 - N
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:I2C 外设已初始化,p_data 为非空指针
|
||||
* 函数说明:从 reg 开始连续读取 len 字节数据
|
||||
* 限定条件:I2C 外设已初始化,data 为非空指针
|
||||
*/
|
||||
static int sd2506_read_regs(uint8_t reg, uint8_t *p_data, uint8_t len) {
|
||||
if (HAL_I2C_Mem_Read(&hi2c1, SD2506_I2C_ADDR_READ, reg,
|
||||
@@ -97,16 +112,16 @@ static int sd2506_read_regs(uint8_t reg, uint8_t *p_data, uint8_t len) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:开启写保护(允许写<EFBFBD>?00H~71H 寄存器)
|
||||
* 函数功能:开启写保护(允许写入 00H~71H 寄存器)
|
||||
* 入口参数:无
|
||||
* 返回值:0 - 成功<EFBFBD>?2 - I2C 错误
|
||||
* 返回值:0 - 成功 2 - I2C 错误
|
||||
* 限定条件:I2C 外设已初始化
|
||||
* 函数说明:顺序:先写 WRTC1=1, 再写 WRTC2=1 + WRTC3=1
|
||||
*/
|
||||
static int sd2506_write_enable(void) {
|
||||
int ret = 0;
|
||||
|
||||
/* 先置 WRTC1=1 (bit6=1), 其它位参考手<EFBFBD>? 0x84 */
|
||||
/* 先置 WRTC1=1 (bit6=1), 其它位参考手册0x84 */
|
||||
ret = sd2506_write_reg(SD2506_REG_CTR1, 0x84U);
|
||||
if (ret != SD2506_OK) return ret;
|
||||
|
||||
@@ -118,9 +133,9 @@ static int sd2506_write_enable(void) {
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:关闭写保护(禁止写<EFBFBD>?00H~71H 寄存器)
|
||||
* 函数功能:关闭写保护(禁止写入 00H~71H 寄存器)
|
||||
* 入口参数:无
|
||||
* 返回值:0 - 成功<EFBFBD>?2 - I2C 错误
|
||||
* 返回值:0 - 成功 2 - I2C 错误
|
||||
* 限定条件:I2C 外设已初始化
|
||||
* 函数说明:顺序:先写 WRTC2=0 + WRTC3=0, 再写 WRTC1=0
|
||||
*/
|
||||
@@ -143,10 +158,14 @@ static int sd2506_write_disable(void) {
|
||||
/*
|
||||
* 函数功能:初始化 SD2506API-G RTC
|
||||
* 入口参数:无
|
||||
* 返回值:0 - 成功<E68890>?2 - I2C 错误
|
||||
* 限定条件:CubeMX 已完<EFBFBD>?I2C1 初始<EFBFBD>?
|
||||
* 函数说明<EFBFBD>?. 读取芯片 ID 验证通信
|
||||
* 2. 上电重置充电寄存<EFBFBD>?18H=82H
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:CubeMX 已完成 I2C1 初始化(PB6-SCL, PB7-SDA)
|
||||
* 函数说明:1. 读取芯片 ID 验证通信
|
||||
* 2. 上电重置充电寄存器 (0x18=0x82)
|
||||
* 3. 配置 24 小时制、开自动复位
|
||||
* 限定条件:CubeMX 已完成I2C1 初始化
|
||||
* 函数说明:读取芯片 ID 验证通信
|
||||
* 2. 上电重置充电寄存器18H=82H
|
||||
* 3. 配置 24 小时制、开自动复位
|
||||
*/
|
||||
int sd2506_init(void) {
|
||||
@@ -221,9 +240,11 @@ int sd2506_set_time(const sd2506_time_t *p_time) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: read RTC time
|
||||
* param: p_time - output time struct
|
||||
* return: 0=OK, -2=I2C error
|
||||
* 函数功能:读取 RTC 时间日期
|
||||
* 入口参数:p_time - 输出时间结构体指针 sd2506_time_t*(非空)
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功
|
||||
* 函数说明:一次读取 7 字节时间数据 (00H~06H),所有实时数据被锁存避免错误
|
||||
* note: sd2506_init() must be called first
|
||||
*/
|
||||
int sd2506_get_time(sd2506_time_t *p_time) {
|
||||
@@ -253,8 +274,11 @@ int sd2506_get_time(sd2506_time_t *p_time) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: read internal temperature
|
||||
* param: p_temp - output temperature
|
||||
* 函数功能:读取内部温度
|
||||
* 入口参数:p_temp - 输出温度值指针 int8_t*(非空)
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功
|
||||
* 函数说明:读取寄存器 0x16,bit7 为符号位
|
||||
* return: 0=OK, -2=I2C error
|
||||
* note: reads register 0x16
|
||||
*/
|
||||
@@ -284,8 +308,11 @@ int sd2506_get_temperature(int8_t *p_temp) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: read battery voltage (mV)
|
||||
* param: p_voltage - output voltage
|
||||
* 函数功能:读取电池电压(毫伏)
|
||||
* 入口参数:p_voltage - 输出电压指针 uint16_t*(非空)
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功
|
||||
* 函数说明:组合 9 位值 (bit8=BAT8_VAL, bit7~0=BAT_VL),转换为毫伏
|
||||
* return: 0=OK, -2=I2C error
|
||||
* note: combines 9-bit value
|
||||
*/
|
||||
@@ -314,8 +341,11 @@ int sd2506_get_battery_voltage(uint16_t *p_voltage) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: read 8-byte chip ID
|
||||
* param: p_id - 8-byte output buffer
|
||||
* 函数功能:读取 8 字节芯片 ID
|
||||
* 入口参数:p_id - 输出缓冲区指针 uint8_t[8](非空)
|
||||
* 返回值:0-成功,2-I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功
|
||||
* 函数说明:读取寄存器 0x72~0x79
|
||||
* return: 0=OK, -2=I2C error
|
||||
* note: reads registers 0x72-0x79
|
||||
*/
|
||||
@@ -328,10 +358,13 @@ int sd2506_get_id(uint8_t p_id[8]) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: read SRAM data
|
||||
* param: addr - start address (0-69)
|
||||
* p_buf - output buffer
|
||||
* len - read length
|
||||
* 函数功能:读取 SRAM 数据
|
||||
* 入口参数:addr - 起始地址 uint8_t 0-69
|
||||
* p_buf - 输出缓冲区指针 uint8_t*(非空)
|
||||
* len - 读取长度 uint8_t 1-N
|
||||
* 返回值:0-成功,-1=参数错误,-2=I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功;addr+len <= SD2506_SRAM_SIZE(70)
|
||||
* 函数说明:SRAM 范围 0x2C~0x71
|
||||
* return: 0=OK, -1=param err, -2=I2C err
|
||||
* note: SRAM range 0x2C-0x71
|
||||
*/
|
||||
@@ -348,10 +381,13 @@ int sd2506_read_sram(uint8_t addr, uint8_t *p_buf, uint8_t len) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: write SRAM data
|
||||
* param: addr - start address (0-69)
|
||||
* p_buf - input data
|
||||
* len - write length
|
||||
* 函数功能:写入 SRAM 数据
|
||||
* 入口参数:addr - 起始地址 uint8_t 0-69
|
||||
* p_buf - 输入数据指针 uint8_t*(非空)
|
||||
* len - 写入长度 uint8_t 1-N
|
||||
* 返回值:0-成功,-1=参数错误,-2=I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功;addr+len <= SD2506_SRAM_SIZE(70)
|
||||
* 函数说明:SRAM 写入需走写保护流程(虽 SRAM 本身无需)
|
||||
* return: 0=OK, -1=param err, -2=I2C err
|
||||
*/
|
||||
int sd2506_write_sram(uint8_t addr, const uint8_t *p_buf, uint8_t len) {
|
||||
@@ -377,9 +413,12 @@ int sd2506_write_sram(uint8_t addr, const uint8_t *p_buf, uint8_t len) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: set alarm interrupt
|
||||
* param: p_time - alarm time struct
|
||||
* mask - alarm match mask
|
||||
* 函数功能:设置闹钟中断
|
||||
* 入口参数:p_time - 报警时间结构体指针 sd2506_time_t*(非空)
|
||||
* mask - 报警匹配掩码 uint8_t
|
||||
* 返回值:0-成功,-2=I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功
|
||||
* 函数说明:写入 8 字节报警数据 (07H~0EH),使能 CTR2.INTAE+INTS0+IM
|
||||
* return: 0=OK, -2=I2C error
|
||||
*/
|
||||
int sd2506_set_alarm(const sd2506_time_t *p_time, uint8_t mask) {
|
||||
@@ -421,8 +460,11 @@ int sd2506_set_alarm(const sd2506_time_t *p_time, uint8_t mask) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: clear alarm interrupt flag
|
||||
* param: none
|
||||
* 函数功能:清除闹钟中断标志
|
||||
* 入口参数:无
|
||||
* 返回值:0-成功,-2=I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功;ARST=1 时自动清除 INTAF
|
||||
* 函数说明:读取 CTR1 即可清除 INTAF 标志
|
||||
* return: 0=OK, -2=I2C error
|
||||
* note: reading CTR1 clears INTAF
|
||||
*/
|
||||
@@ -440,8 +482,10 @@ int sd2506_clear_alarm(void) {
|
||||
}
|
||||
|
||||
/*
|
||||
* function: read control register 1
|
||||
* param: p_val - output value
|
||||
* 函数功能:读取控制寄存器 1 (CTR1)
|
||||
* 入口参数:p_val - 输出值指针 uint8_t*(非空)
|
||||
* 返回值:0-成功,-2=I2C 错误 int
|
||||
* 限定条件:sd2506_init() 已调用成功
|
||||
* return: 0=OK, -2=I2C error
|
||||
*/
|
||||
int sd2506_read_ctr1(uint8_t *p_val) {
|
||||
|
||||
Reference in New Issue
Block a user