#ifndef __BQ_I2C_OPT_H #define __BQ_I2C_OPT_H #include "stm32f10x.h" /*=========================================================================== * 优化版 I2C 底层 — BQ25756 驱动用 * * 对比原版 bq25756.c 的改进: * 1. 总线句柄化:通过 I2C_Bus 结构体选择 I2C1 或 I2C2 * 2. 总线恢复:SDA 卡死时自动发 9 个 SCL 脉冲解锁 * 3. NACK 重试:写/读失败后自动重试 3 次 * 4. 统一读写接口:单字节和双字节操作复用同一底层 *===========================================================================*/ /*=========================================================================== * I2C 总线句柄 *===========================================================================*/ typedef struct { I2C_TypeDef *instance; GPIO_TypeDef *scl_port; uint16_t scl_pin; GPIO_TypeDef *sda_port; uint16_t sda_pin; uint32_t speed; uint8_t initialized; } I2C_Bus; /* 预定义总线配置(可以直接改宏定义或运行时传参) */ extern I2C_Bus I2C_Bus_I2C1; /* PB6=SCL, PB7=SDA, 400kHz */ extern I2C_Bus I2C_Bus_I2C2; /* PB10=SCL, PB11=SDA, 400kHz */ /*=========================================================================== * 对外接口 *===========================================================================*/ /* 初始化 */ void BQ_I2C_Init(I2C_Bus *bus); /* 总线选择 */ void BQ_I2C_SelectBus(I2C_Bus *bus); I2C_Bus* BQ_I2C_GetBus(void); /* 带重试和总线恢复的读写 */ int BQ_I2C_WriteRetry(uint8_t dev_addr, const uint8_t *data, uint8_t len); int BQ_I2C_ReadRetry(uint8_t dev_addr, uint8_t reg, uint8_t *buf, uint8_t len); /* BQ25756 兼容简化接口 */ int BQ_I2C_WriteByte(uint8_t dev, uint8_t reg, uint8_t val); int BQ_I2C_ReadByte(uint8_t dev, uint8_t reg, uint8_t *val); int BQ_I2C_Write2Bytes(uint8_t dev, uint8_t reg, uint16_t val); int BQ_I2C_Read2Bytes(uint8_t dev, uint8_t reg, uint16_t *val); #endif