CLSH1001-Firmware/include/sw7203/sw7203.h

467 lines
16 KiB
C
Raw Normal View History

2024-03-06 09:32:15 +08:00
#ifndef __SW7203_H__
#define __SW7203_H__
2024-03-08 01:45:59 +08:00
#include "driver/i2c_master.h"
2024-03-06 09:32:15 +08:00
#include "esp_log.h"
2024-03-19 02:44:58 +08:00
typedef sw7203_Vout_config_t *(*SW7203CallBack_t)(sw7203_I2C_port);
2024-03-08 01:45:59 +08:00
static i2c_master_dev_handle_t SW7203_I2C_handle;
int8_t *SW7203_Mutex = NULL;
2024-03-19 02:44:58 +08:00
static SW7203CallBack_t *__SW7203CallBack_;
struct
{
uint8_t mode : 1;
// 控制模式选择
// 0: 被动模式 采取回调函数的方式进行运作,当检测到输入插入时调用回调函数,回调函数输入具体插入口,回调函数需返回输出配置的指针
// 1: 主动模式 放弃中断中插入检测,直接用函数和配置文件进行设置
uint8_t INTGPIOEnable : 1;
// 中断GPIO模式使能
// 0: 中断GPIO启动
// 1: 轮询I2C代替中断GPIO
uint8_t intMode : 1;
// 中断模式选择在使用轮询I2C后无效
// 0: 轮询模式 驱动程序自动加载中断轮询函数
// 1: ESP32中断回调模式 需用户单独配置中断端口并中断后调用 函数
uint8_t voltageConflictSwitch : 1;
// 电压冲突选择,在设置为主动模式后无效
// 0: 当A1 A2 任何一个已经插入且插入第二个时回调得到第二个不同的电压值,立刻切换到这个电压
// 1: 当A1 A2 任何一个已经插入且插入第二个时回调得到第二个不同的电压值,等待第一个插入的拔出后再输出第二个电压
uint8_t I2CBusBusyEnable : 1;
} __sw7203_driver_config__;
2024-03-06 09:32:15 +08:00
2024-03-06 11:13:15 +08:00
typedef union
2024-03-06 09:32:15 +08:00
{
uint8_t hex;
struct
{
uint8_t adc_filter_time : 2; // 0: 10mS 1:20mS 2:40mS 4: 80mS
uint8_t : 2;
uint8_t adc_data : 4; // 0: VBAT电压 1: VBUS电压 4: VBAT充电电流 5: VBUS 充电电流 6: VBAT 放电电流 7:VBUS 放电电流 8: 芯片温度 9: NTC电压 10: VSYS电压
} config;
2024-03-06 11:13:15 +08:00
} adc_config;
2024-03-06 09:32:15 +08:00
2024-03-06 11:13:15 +08:00
typedef enum
2024-03-06 09:32:15 +08:00
{
2024-03-08 01:45:59 +08:00
sw7203_I2c_0x3C = 0,
sw7203_I2c_0x38 = 1,
sw7203_I2c_0x1C = 2,
sw7203_I2c_0x18 = 3
2024-03-06 11:13:15 +08:00
} sw7203_I2C_address_t;
2024-03-06 09:32:15 +08:00
2024-03-19 02:44:58 +08:00
typedef enum
{
sw7203_port_A1,
sw7203_port_A2
} sw7203_I2C_port;
2024-03-06 11:13:15 +08:00
typedef struct
{
2024-03-19 02:44:58 +08:00
uint16_t VBUSVoltage_mV; // 放电 VBUS 输出电压设置 [3000,22000] 单位毫伏mV
uint16_t VBATVoltageLimit_mV; // 放电 VBAT 欠压设置 [2700,13200] 单位毫伏mV
uint16_t VBATVoltageLimitHysteresis_mV; // 放电 VBAT 欠压迟滞设置 [400,2000] 单位毫伏mV
uint16_t VBUSCurrentLimit_mA; // 放电 VBUS 输出限流设置 [500,6850] 单位毫安mA
uint16_t VBATCurrentLimit_mA; // 放电 VBAT 输出限流设置 [100,12000] 单位毫安mA
2024-03-06 11:13:15 +08:00
} sw7203_Vout_config_t;
typedef struct
2024-03-06 09:32:15 +08:00
{
2024-03-19 02:44:58 +08:00
uint8_t INT_gpio_num;
2024-03-06 09:32:15 +08:00
sw7203_I2C_address_t i2cAddress;
2024-03-08 01:45:59 +08:00
void *Mutex;
2024-03-19 02:44:58 +08:00
SW7203CallBack_t CallBack;
2024-03-06 11:13:15 +08:00
2024-03-19 02:44:58 +08:00
struct
{
uint8_t mode : 1;
// 控制模式选择
// 0: 被动模式 采取回调函数的方式进行运作,当检测到输入插入时调用回调函数,回调函数输入具体插入口,回调函数需返回输出配置的指针
// 1: 主动模式 放弃中断中插入检测,直接用函数和配置文件进行设置
uint8_t INTGPIOEnable : 1;
// 中断GPIO模式使能
// 0: 中断GPIO启动
// 1: 轮询I2C代替中断GPIO
uint8_t intMode : 1;
// 中断模式选择在使用轮询I2C后无效
// 0: 轮询模式 驱动程序自动加载中断轮询函数
// 1: ESP32中断回调模式 需用户单独配置中断端口并中断后调用 函数
uint8_t gpioInitMode : 1;
// gpio初始化模式选择在使用轮询I2C后无效
// 0: 驱动程序初始化时自动初始化中断gpio
// 1: 用户自己初始化中断gpio后初始化sw7203
uint8_t voltageConflictSwitch : 1;
// 电压冲突选择,在设置为主动模式后无效
// 0: 当A1 A2 任何一个已经插入且插入第二个时回调得到第二个不同的电压值,立刻切换到这个电压
// 1: 当A1 A2 任何一个已经插入且插入第二个时回调得到第二个不同的电压值,等待第一个插入的拔出后再输出第二个电压
uint8_t I2CBusBusyEnable : 1;
// I2C总线忙使能
// 0: Mutex指针为I2C进程锁为1时表示总线正忙
// 1: 关闭总线防冲突功能
} SW7203_control_mode;
uint16_t chargeVoltage_mV; // 充电目标电压设置 [3000,19200] 单位毫伏mV
uint16_t trickleVoltage_mV; // 涓流电压设置 [2500,13200] 单位毫伏mV
uint16_t chargeVBUSVoltageLimit_mV; // 防拉挂电压设置 [4000,20000] 单位毫伏mV
uint16_t VSYSMinVoltage_mV; // VSYMIN 电压设置 [3000,16600] 单位毫伏mV
uint16_t chargeVBUSCurrentLimit_mA; // 充电 VBUS 输入限流设置 [500,6850] 单位毫安mA
uint16_t chargeVBATCurrentLimit_mA; // 充电 VBAT 输入限流设置 [100,12000] 单位毫安mA
uint16_t chargeLDOCurrentLimit_mA; // LDO 充电电流设置 [100,2000] 单位毫安mA
2024-03-06 11:13:15 +08:00
2024-03-06 09:32:15 +08:00
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t : 3; // 未定义的 bit 不能被改写
uint8_t shutdownLowPowerModeEnable : 1;
// 关机低功耗模式使能标志位:
// 0: 启用关机低功耗模式1: 禁用关机低功耗模式
uint8_t : 2; // 未定义的 bit 不能被改写
uint8_t a1PortDetectEnable : 1;
// A1端口检测使能标志位
// 0: 禁用A1端口检测1: 启用A1端口检测
uint8_t a2PortDetectEnable : 1;
// A2端口检测使能标志位
// 0: 禁用A2端口检测1: 启用A2端口检测
} config;
2024-03-06 11:13:15 +08:00
} connectDetect; // 负载接入检测及低功耗模式控制
2024-03-06 09:32:15 +08:00
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t switchFrequency : 2;
// 开关频率选项:
// 0: 300KHz1: 200KHz2: 400KHz3: 800KHz
uint8_t forcePWMModeEnable : 1;
// 强制 PWM 模式使能:
// 0: 禁用1: 启用
uint8_t : 2; // 未定义的 bit 不能被改写
uint8_t NTCProtectEnable : 1;
// NTC 过温保护使能
// 0: 启用1: 禁用
uint8_t PowerMOSMinConductTime : 1;
// 功率管最小导通时间设置:
// 0: 下管最小导通时间 112nS上管最小导通时间 133nS
// 1: 下管最小导通时间 58nS上管最小导通时间 81nS
uint8_t VBUSVoltageRegulationMethod : 1;
// VBUS 输出调压方式选择:
// 0: I2C 调压1: FB 调压
} config;
} funcConfig1;
2024-03-06 11:13:15 +08:00
2024-03-06 09:32:15 +08:00
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t deadzoneM1OpenM2Closed : 2;
// M2 关 M1 开死区设置:
// 0: 60nS1: 20nS2: 40nS3: 80nS
uint8_t deadzoneM1ClosedM2Open : 2;
// M2 关 M1 开死区设置:
// 0: 60nS1: 20nS2: 40nS3: 60nS
uint8_t deadzoneM3ClosedM4Open : 2;
// M3 关 M4 开死区设置:
// 0: 60nS1: 20nS2: 40nS3: 80nS
uint8_t deadzoneM3OpenM4Closed : 2;
// M4 关 M3 开死区设置:
// 0: 60nS1: 20nS2: 40nS3: 60nS
} config;
} funcConfig2;
2024-03-06 11:13:15 +08:00
2024-03-06 09:32:15 +08:00
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t M2MOSRdsOn : 2;
// M2 功率管内阻设置:
// 0: 2.5mR1: 5mR2: 7.5mR3: 10mR
uint8_t nductanceValue : 2;
// 电感感值设置:
// 0: 1uH1: 2.2uH2: 3.3uH3: 4.7uH
uint8_t : 4; // 未定义的 bit 不能被改写
} config;
} funcConfig3;
2024-03-06 11:13:15 +08:00
2024-03-06 09:32:15 +08:00
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t ACOutRegResetControl : 1;
// 适配器移出是否清除充电开关控制位:
// 0: 清除1: 不清除
uint8_t stopChargingOnFullEnable : 1;
// 充满停充使能:
// 0: 使能1: 禁止
uint8_t : 2; // 未定义的 bit 不能被改写
2024-03-06 11:13:15 +08:00
uint8_t fullChargeCurrent : 2;
2024-03-06 09:32:15 +08:00
// 充满截止电流设置:
// 0: 100mA1: 200mA, 3: 300mA4: 400mA
2024-03-06 11:13:15 +08:00
uint8_t batteryCellNum : 2;
2024-03-06 09:32:15 +08:00
// 电池节数设置:
// 0: 1节1: 2节, 3: 3节4: 4节
} config;
} funcConfig4;
2024-03-06 11:13:15 +08:00
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t : 4; // 未定义的 bit 不能被改写
uint8_t chipOverTemp : 2;
// 芯片过温温度设置:
// 0: 120℃1: 130℃, 3: 140℃4: 150℃
uint8_t peakCurrentLimit : 2;
// 峰值限流设置,充放电共用此设置:
// 0: 12A1: 14A, 3: 16A4: 18A
} config;
} funcConfig5;
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t func62368Enable : 1;
// 62368 功能使能:
// 0: 使能1: 禁止
uint8_t func62368IBUSLimitEnable : 1;
// 处于 62368 的高低温状态,降低 IBUS 限流功能使能:
// 0: 使能1: 禁止
uint8_t : 1; // 未定义的 bit 不能被改写
uint8_t chargeOverTimeEnable : 1;
// 充电超时使能:
// 0: 使能1: 禁止
uint8_t trickleChargeTimeout : 2;
// 涓流充电超时时间设置:
// 0: 30分钟1: 1小时, 3: 2小时4: 4小时
uint8_t constantCurrentChargeTimeout : 2;
// 恒流充电超时时间设置:
// 0: 12小时1: 24小时, 3: 48小时4: 72小时
} config;
} funcConfig6;
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t func62368LowTempCurrentLimit : 2;
// 处于 62368 的低温状态,降低限流设置:
// 当 funcConfig6.func62368IBUSLimitEnable=0 时,同时降低 IBUS 和 IBAT 的限流值
// funcConfig6.func62368IBUSLimitEnable=1 时,只降低 IBAT 的限流值
// 0: 降低到设置值的 1/21: 降低到设置值的 1/4, 3: 不降低4: 保留(不可选)
uint8_t func62368HighTempCurrentLimit : 2;
// 处于 62368 的高温状态,降低限流设置:
// 当 funcConfig6.func62368IBUSLimitEnable=0 时,同时降低 IBUS 和 IBAT 的限流值
// funcConfig6.func62368IBUSLimitEnable=1 时,只降低 IBAT 的限流值
// 0: 降低到设置值的 1/21: 降低到设置值的 1/4, 3: 不降低4: 保留(不可选)
uint8_t func62368LowTempVoltageLimit : 1;
// 处于 62368 的低温状态,降低充电目标电压设置:
// 0: 充电目标电压降低电池节数设置值*0.1V1: 不降低充电目标电压
uint8_t func62368HighTempVoltageLimit : 1;
// 处于 62368 的高温状态,降低充电目标电压设置:
// 0: 充电目标电压降低电池节数设置值*0.1V1: 不降低充电目标电压
uint8_t func62368LowTempHysteresis : 1;
// 62368 低温迟滞:
// 0: 5℃1: 10℃
uint8_t func62368HighTempHysteresis : 1;
// 62368 高温迟滞:
// 0: 5℃1: 10℃
} config;
} funcConfig7;
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t dischargeNTCHighLimit : 2;
// 放电 NTC 高温门限:
// 0: 50℃1: 55℃2: 60℃3: 65℃
uint8_t dischargeNTCLowLimit : 2;
// 放电 NTC 低温门限:
// 0: -10℃1: -5℃2: 0℃3: -20℃
uint8_t chargeNTCHighLimit : 2;
// 充电 NTC 高温门限:
// 0: 50℃1: 55℃2: 60℃3: 65℃
uint8_t chargeNTCLowLimit : 2;
// 充电 NTC 低温门限:
// 0: -10℃1: -5℃2: 0℃3: -20℃
} config;
} NTCConfig;
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t : 1; // 未定义的 bit 不能被改写
uint8_t NVDCLearnModeEnable : 1;
// 学习模式使能:
// 适配器接入时关闭充放电NVDC 处于全打开状态
// 0: 禁止1: 使能
uint8_t : 4; // 未定义的 bit 不能被改写
uint8_t VSYSOverVoltage : 2;
// VSYS 过载门限:
// 电池节数为 2~4 节时
// 0: 6V1: 5.75V2: 6.25V3: 6.5V
// 电池节数为 1 节时
// 0: 3.1V1: 2.85V2: 3.35V3: 3.6V
} config;
} NVDCConfig1;
union
{
uint8_t hex; // 8位无符号整数用于将位域组合成一个字节方便程序读取
struct
{
uint8_t : 4; // 未定义的 bit 不能被改写
uint8_t trickleCurrent : 2;
// 涓流电流设置:
// 0: 100mA1: 200mA2: 300mA3: 400mA
uint8_t trickleCurrentHysteresis : 2;
// 涓流电压迟滞设置:
// 默认值根据 BSSET 电阻设置的电池节数,设置为电池节数*0.1V
// 0: 0.1V1: 0.2V2: 0.3V3: 0.4V
} config;
} trickleConfig; // 涓流电流设置
} sw7203_config_t;
2024-03-06 09:32:15 +08:00
2024-03-19 02:44:58 +08:00
/**
* @brief SW7203 I2C
*
* @param handle i2c device handle
* @return
* - 8: -1
*/
2024-03-08 01:45:59 +08:00
uint8_t sw7203_I2C_address_find(i2c_master_bus_handle_t I2C_bus_handle);
2024-03-19 02:44:58 +08:00
/**
* @brief SW7203
*
* @param[in] sw7203_config sw7203的配置文件
* @param handle I2C_bus_handle I2C 线handle
* @param[in] I2C_address sw7203的I2C地址
*
* @return
* - ESP_OK: .
* - ESP_ERR_NOT_ALLOWED: SW7203 I2C地址不存在.
*/
esp_err_t sw7203_driver_install(sw7203_config_t *sw7023_config, i2c_master_bus_handle_t I2C_bus_handle, uint8_t I2C_address);
/**
* @brief SW7203
*
* @param[in] config sw7203的输出配置文件
*
*/
void sw7203SwitchOutput(sw7203_Vout_config_t *config);
/**
* @brief SW7203
*
* @param handle I2C_bus_handle I2C 线handle
*
* @return
* - ESP_OK: .
*/
esp_err_t sw7203_driver_uninstall(i2c_master_bus_handle_t I2C_bus_handle);
2024-03-08 01:45:59 +08:00
const uint8_t SW7203RegAddress_bitmask[][2] = {
{0x18, 0b00010011},
{0x1A, 0b00000011},
{0x20, 0b11100111},
{0x21, 0b11111111},
{0x22, 0b11110000},
{0x30, 0b11001111},
{0x31, 0b00001111},
{0x32, 0b11011111},
{0x33, 0b11111111},
{0x34, 0b11111111},
{0x35, 0b00000111},
{0x36, 0b01111111},
{0x37, 0b00001111},
{0x38, 0b11111111},
{0x39, 0b01111111},
{0x3A, 0b01111111},
{0x40, 0b01000011},
{0x41, 0b00011111},
{0x42, 0b01111111},
2024-03-19 02:44:58 +08:00
{0x43, 0b11111111},
{0x23, 0b11111111},
{0x24, 0b00000111},
{0x25, 0b01111111},
{0x26, 0b01111111},
{0x27, 0b01111111},
{0x28, 0b00011111},
2024-03-08 01:45:59 +08:00
};
2024-03-07 05:21:06 +08:00
2024-03-06 09:32:15 +08:00
#endif