
#ifndef _LTC4015_H_
#define _LTC4015_H_
#include "stm32f10x.h"
#include "IIC.h"
#define CHARGER_CRTL_CLK        RCC_APB2Periph_GPIOB
#define CHARGER_CTRL_PORT       GPIOB
#define CHARGER_SCL_PIN         GPIO_Pin_6
#define CHARGER_SDA_PIN         GPIO_Pin_7

extern IIC_IO_Def bq25756IO;

/* bq25756 FSW_SYNC频率同步PWM输出(PB0/TIM3_CH3, 接bq25756 PIN36 FSW_SYNC) */
#define BQ25756_FSW_SYNC_TIM            TIM3
#define BQ25756_FSW_SYNC_RCC            RCC_APB1Periph_TIM3
#define BQ25756_FSW_SYNC_PORT           GPIOB
#define BQ25756_FSW_SYNC_PIN            GPIO_Pin_0
#define BQ25756_FSW_SYNC_TIMER_CLK      72000000u            /* 定时器时钟:72MHz */
#define BQ25756_FSW_SYNC_FREQ_HZ        500000u              /* FSW_SYNC同步频率:500kHz */
#define BQ25756_FSW_SYNC_PERIOD         (BQ25756_FSW_SYNC_TIMER_CLK / BQ25756_FSW_SYNC_FREQ_HZ - 1u)  /* 143 */
#define BQ25756_FSW_SYNC_DUTY_PERCENT   50u                  /* 初始占空比:50% */
#define BQ25756_FSW_SYNC_PULSE          ((BQ25756_FSW_SYNC_PERIOD + 1u) * BQ25756_FSW_SYNC_DUTY_PERCENT / 100u)  /* 72 */

/* bq25756 CE充电使能引脚PA1(接bq25756 PIN7, 低电平使能充电, 不能悬空) */
#define BQ25756_CE_PORT                 GPIOA
#define BQ25756_CE_PIN                  GPIO_Pin_1
#define BQ25756_CE_RCC                  RCC_APB2Periph_GPIOA

/* bq25756 INT中断输出引脚PA2(接bq25756 PIN3, 开漏低电平有效, 256us脉冲) */
#define BQ25756_INT_PORT                GPIOA
#define BQ25756_INT_PIN                 GPIO_Pin_2
#define BQ25756_INT_RCC                 RCC_APB2Periph_GPIOA

/* bq25756 BAT充电路径MOS控制引脚PA15(高电平允许充电, 低电平禁止充电) */
#define BQ25756_BAT_MOS_PORT            GPIOA
#define BQ25756_BAT_MOS_PIN             GPIO_Pin_15
#define BQ25756_BAT_MOS_RCC             RCC_APB2Periph_GPIOA

/* MCU运行状态LED控制引脚PB15(推挽输出) */
#define MCU_LED_PORT                    GPIOB
#define MCU_LED_PIN                     GPIO_Pin_15
#define MCU_LED_RCC                     RCC_APB2Periph_GPIOB

void Bq25756_Gpio_Init(void);
void Bq25756_Init(void);
int  Bq25756_IIC_Check(void);
int  Bq25756_Get_PartInfo(unsigned char *part_num, unsigned char *dev_rev);
int  Bq25756_CheckAndGetPartInfo(unsigned char *part_num, unsigned char *dev_rev);
unsigned char Bq25756_INT_GetPending(void);
void Bq25756_INT_ClearPending(void);
int  Bq25756_INT_Process(unsigned char *flag1, unsigned char *flag2, unsigned char *fault_flag);
void Bq25756_BAT_MOS_Set(unsigned char level);
void Bq25756_BAT_MOS_Enable(void);
void Bq25756_BAT_MOS_Disable(void);
void Bq25756_CE_Set(unsigned char level);

void Bq25756_StopCharge_Hard(void); /* 硬件级/彻底停充(双保险): 关EN_CHG寄存器 + CE拉高, 保护路径统一停充入口 */
void Bq25756_Charge_Start_Hard(void);/* 硬件级/彻底启动充电(双保险): 置EN_CHG + CE拉低, 与StopCharge_Hard对称, 启动路径统一入口 */
int  Bq25756_Charge_SoftStart(void);/* 软件级/轻量启动充电: 清EN_HIZ + 置EN_CHG, 与SoftStop配套快速恢复(仅动寄存器) */
int  Bq25756_Charge_SoftStop(void); /* 软件级/轻量停止充电: 只清EN_CHG, 不断硬件/保留配置通信(备用API) */

void Bq25756_PG_Monitor(void);      /* PG(输入电源)监控: 掉线即时停充, 需周期调用 */
int  Bq25756_Int_Fault_Process(void); /* BQ25756 INT 故障检查: 按故障类型分类处理(0=无故障/1=已处理), 故障状态写入g_bq25756_fault, 需周期调用 */
int  Bq25756_CvTimer_Check(void);      /* CV阶段独立定时器到期检测: 到期停充(0=未到期/1=已到期停充), 需周期调用 */
int  Bq25756_Dpm_Monitor(unsigned char *dpm_state); /* DPM(动态功率管理)状态监测: 返回边沿事件位掩码(bit0=IACon/1=IACoff/2=VACon/3=VACoff), dpm_state可为NULL, 需周期调用 */
int  Bq25756_Charge_State_Machine(int8_t temp_c); /* 充电状态机决策执行(IDLE/PRECHG/CC/CV/DONE): 返回SM_ACTION_*决策, temp_c为NTC温度(无则25), 需~200ms周期调用 */
void Bq25756_Diag_Periodic(void);      /* BQ25756 周期诊断: 每10s调用bq_pfm_sync_check(), 需~100ms周期调用 */
void Bq25756_GateDriver_Init(void);    /* 配置栅极驱动(Gate Driver)参数: 驱动强度0x15+死区0x05, 由Init/故障恢复统一调用 */

/* BQ25756 周期监控统一入口: 按安全等级/事件快慢分流频率
   (period_ms=调用周期, 每周期跑PG/故障/测量/喂狗, 500ms跑DPM, 1s跑CV)
   main.c PowerManagement 每100ms调用一次即可, 替代分散的PG/故障/CV/DPM/测量/喂狗调用 */
void Bq25756_Monitor_Periodic(unsigned int period_ms);

/* bq25756 全量可检测数据(实测值)结构体 */
typedef struct
{
    /* ── ADC 实测物理量 ── */
    int32_t  vin_mv;    /* 输入电压  (VAC_ADC,  2mV/LSB, 读失败=-1)  */
    int32_t  iin_ma;    /* 输入电流  (IAC_ADC,  0.8mA/LSB, 有符号, 正=流入) */
    int32_t  vbat_mv;   /* 电池电压  (VBAT_ADC, 2mV/LSB, 读失败=-1) */
    int32_t  ibat_ma;   /* 充电电流  (IBAT_ADC, 2mA/LSB, 有符号, 正=充电/负=放电) */
    int32_t  vfb_mv;    /* VFB反馈电压(VFB_ADC,  1mV/LSB, 通道默认禁用时=0) */
    uint16_t ts_adc;    /* TS ADC原始值(0~1023) */
    float    ts_pct;    /* TS电压百分比 0~100%(10k上拉+10k@25°C NTC, 25°C≈50%) */
    float    ts_temp_c; /* TS温度(°C, 由ts_pct按β公式换算, 无效=-300) */

    /* ── 状态寄存器(反映当前状态) ── */
    unsigned char status1;     /* CHARGER_STATUS_1: ADC_DONE/IAC_DPM/VAC_DPM/充电状态 */
    unsigned char status2;     /* CHARGER_STATUS_2: PG/TS区域/MPPT状态 */
    unsigned char status3;     /* CHARGER_STATUS_3: FSW_SYNC/CV_TMR/REVERSE_ON */
    unsigned char fault;       /* FAULT_STATUS: 故障状态 */

    /* ── 中断标志(读清除) ── */
    unsigned char flag1;       /* FLAG_1(读清除) */
    unsigned char flag2;       /* FLAG_2(读清除) */
    unsigned char fault_flag;  /* FAULT_FLAG(读清除) */

    /* ── 器件信息 ── */
    unsigned char part_info;   /* PART_INFO: 产品型号+器件版本 */

    unsigned char i2c_ok;      /* 1=所有I2C读取成功 */
} Bq25756_Measure_t;

/* bq25756 故障/状态告警统一结构体
   (由 PG_Monitor / Int_Fault_Process / CvTimer_Check / Dpm_Monitor 四个监控器集中写入, 上层统一读取) */
typedef struct
{
    uint8_t pg_ok;             /* 1=输入电源在位(PG正常)  0=PG丢失(已由PG_Monitor停充) */
    uint8_t fault_raw;         /* FAULT_STATUS(REG0x24) 原始值, 各 BQ25756_FAULT_* 位 */
    uint8_t fault_triggered;   /* 1=本次检测到并处理了 INT 故障(Int_Fault_Process) */
    uint8_t cv_timer_expired;  /* CV 独立定时器到期标记: 1=到期(已由CvTimer_Check停充) */
    uint8_t iac_dpm;           /* IAC_DPM 生效: 1=输入电流达 REG0x06 限流(6A) */
    uint8_t vac_dpm;           /* VAC_DPM 生效: 1=输入电压低于 REG0x08 DPM(21V) */
    uint8_t dpm_events;        /* DPM 边沿事件位掩码(本次周期): bit0=IACon/1=IACoff/2=VACon/3=VACoff */
} Bq25756_Fault_t;

extern Bq25756_Measure_t g_bq25756_meas;   /* bq25756 全部可检测数据(实测值) */
extern Bq25756_Fault_t    g_bq25756_fault;  /* bq25756 故障/状态告警统一结构体(由各监控器写入) */

/* 读取bq25756全部可检测数据并填入g_bq25756_meas(读取结果见g_bq25756_meas.i2c_ok, 1=全部成功/0=存在失败) */
void Bq25756_Read_All_Measure(void);

/* 通过ts_pct百分比换算NTC温度(°C), β=3435, 10k上拉+10k@25°C NTC; 无效返回-300 */
float Bq25756_TsPctToTempC(float ts_pct);

#endif

