#ifndef _ML5238_H__ #define _ML5238_H__ #include "bsp/clock.h" void ml5238_init(void); void ml5238_softreset(void); int ml5238_enable_discharger_mosfet(int enable); int ml5238_enable_charger_mosfet(int enable); int ml5238_short_current_detect(int mode); int ml5238_is_load_disconnect(void); int ml5238_enable_load_detect(int enable); void ml5238_cell_start_balance(uint16_t balance_mask); void ml5238_power_down(void); void ml5238_power_save(int save); int ml5238_charger_is_disconnect(int small_current_on); int ml5238_enable_charger_detect(int small_current_on, int enable); int ml5238_is_charging(void); int ml5238_is_discharging(void); int ml5238_is_short_current_enabled(int mode); uint8_t ml5238_noop_register_rw(uint8_t data);//ml5238 ¶Áд²âÊÔ void ml5238_reg_log(void); typedef void (*ml5238_notify_hander)(int event); void ml5238_register_notify_handler(ml5238_notify_hander handler); #define ML5238_Event_Charger_Over_Current 1 #define ML5238_Event_Short_Current 2 #define ML5238_Event_Load_Disconnect 3 #define SHORT_CURRENT_MODE_DISABLE -1 #define SHORT_CURRENT_MODE_50A_100A 0 //sp600: 50A, SP700: 100A #define SHORT_CURRENT_MODE_100A_200A 1 //sp600: 100A SP700: 200A #define SHORT_CURRENT_MODE_150A_300A 2 //sp600: 150A Sp700: 300A #define SHORT_CURRENT_MODE_200A_400A 3 //sp600:200A SP700: 400A /* ml5238 will amplify the vmon val by 0.5, so we need * multi 2 to the adc value, to get the real vol */ #define cell_real_vol(v) (v * 2) #include "ml5238_reg.h" int ml5238_write(uint8_t regaddr, uint8_t data); /* disable the vmon output the cell voltage */ #define ML5238_VMON_DISABLE() {ml5238_write(ML5238_VMON, 0x00);}; /* select one cell (0-14) connect to vmon, so we can measure * the cell voltage from vmon pin */ #define ML5238_SELECT_CELL(i) {ml5238_write(ML5238_VMON, i | VMON_OUT);}; /* IMON output disable */ #define ML5238_IMON_DISABLE() {ml5238_write(ML5238_IMON, 0x02);}; /* IMON output 0V, used to cali the GAIN */ #define ML5238_IMON_OUT_ZERO_10X() {ml5238_write(ML5238_IMON, 0x12);delay_us(1000);}; #define ML5238_IMON_OUT_ZERO_50X() {ml5238_write(ML5238_IMON, 0x13);delay_us(5000);}; /* IMON output 2V, used to cali the GAIN */ #define ML5238_IMON_OUT_V2000_10X() {ml5238_write(ML5238_IMON, 0x14);delay_us(1000);}; #define ML5238_IMON_OUT_V2000_50X() {ml5238_write(ML5238_IMON, 0x15);delay_us(5000);}; /* IMON output 100mV, used to cali the GAIN */ #define ML5238_IMON_OUT_V100_10X() {ml5238_write(ML5238_IMON, 0x1c);delay_us(1000);}; #define ML5238_IMON_OUT_V20_50X() {ml5238_write(ML5238_IMON, 0x1d);delay_us(5000);}; /* IMON output real pin's voltage */ #define ML5238_IMON_OUT_10X() {ml5238_write(ML5238_IMON, 0x10);delay_us(1000);}; #define ML5238_IMON_OUT_50X() {ml5238_write(ML5238_IMON, 0x11);delay_us(5000);}; //vim0 == xxx_OUT_ZERO_xxx, vim1 == xxx_OUT_V2000_xxx, vr == xxx_OUT_V100_xxx #define ML5238_GAIN(vim0, vim1, vr) ((vim1-vim0)/vr) //r_v :real voltage, gain == ML5238_GAIN #define ML5238_V_RSENSER(r_v, vim0, gain) ((vim0 - r_v)/gain) #endif /* _ML5238_H__ */