#ifndef __SOFT_I2C_H #define __SOFT_I2C_H #include "stm32f10x.h" /*=========================================================================== * 软件 I2C(GPIO 位操作)— 任意引脚,无需硬件 I2C 外设 * * 核心特点:GPIO 完全可配置,初始化时传引脚参数即可。 * SCL 和 SDA 用任意 GPIO,编译时改宏或运行时用结构体传参。 * * 用法: * * 方案 A:编译时改宏(简单) * 修改下面 SOFT_I2C_SCL_PORT / SOFT_I2C_SDA_PORT 的宏即可 * * 方案 B:任意引脚(灵活) * SoftI2C_Config cfg; * cfg.scl_port = GPIOB; cfg.scl_pin = GPIO_Pin_6; * cfg.sda_port = GPIOB; cfg.sda_pin = GPIO_Pin_7; * SoftI2C_Init(&cfg); * * 单总线场景用方案 A,多总线或动态切换用方案 B。 *===========================================================================*/ /*=========================================================================== * 默认引脚配置 — 改这里就行 *===========================================================================*/ #ifndef SOFT_I2C_SCL_PORT #define SOFT_I2C_SCL_PORT GPIOA #define SOFT_I2C_SCL_PIN GPIO_Pin_1 #endif #ifndef SOFT_I2C_SDA_PORT #define SOFT_I2C_SDA_PORT GPIOA #define SOFT_I2C_SDA_PIN GPIO_Pin_2 #endif /*=========================================================================== * I2C 配置结构体(运行时动态传参用) *===========================================================================*/ typedef struct { GPIO_TypeDef *scl_port; uint16_t scl_pin; GPIO_TypeDef *sda_port; uint16_t sda_pin; } SoftI2C_Config; /*=========================================================================== * 接口函数 *===========================================================================*/ /** * @brief 初始化软件 I2C(编译时默认引脚)。 * 调用 SoftI2C_Init(NULL) 或 SoftI2C_Init() 用上面的宏定义引脚。 */ void SoftI2C_Init(const SoftI2C_Config *cfg); /* 时序原语(初始化后调用) */ void SoftI2C_Start(void); void SoftI2C_Stop(void); uint8_t SoftI2C_SendByte(uint8_t data); uint8_t SoftI2C_ReadByte(uint8_t ack_bit); /* 寄存器级封装(dev_addr = 7-bit 地址如 0x6B) */ uint8_t SoftI2C_WriteReg(uint8_t dev_addr, uint8_t reg, uint8_t data); uint8_t SoftI2C_ReadReg(uint8_t dev_addr, uint8_t reg); uint8_t SoftI2C_WriteReg16(uint8_t dev_addr, uint8_t reg, uint16_t data); uint16_t SoftI2C_ReadReg16(uint8_t dev_addr, uint8_t reg); /*=========================================================================== * BQ25756 初始化序列封装 *===========================================================================*/ uint8_t SoftI2C_WatchdogOff(void); uint8_t SoftI2C_NtcOff(void); uint8_t SoftI2C_AdcContinuous(void); uint8_t SoftI2C_InitCharging(uint8_t dev_addr, uint8_t ntc_off, uint32_t charge_ma, uint32_t input_ma, uint32_t input_mv); uint8_t SoftI2C_SetPrechargeCurrent(uint8_t dev_addr, uint32_t ma); uint8_t SoftI2C_SetTerminationCurrent(uint8_t dev_addr, uint32_t ma); #endif