ml5238.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #ifndef _ML5238_H__
  2. #define _ML5238_H__
  3. #include "bsp/clock.h"
  4. void ml5238_init(void);
  5. void ml5238_softreset(void);
  6. int ml5238_enable_discharger_mosfet(int enable);
  7. int ml5238_enable_charger_mosfet(int enable);
  8. int ml5238_short_current_detect(int mode);
  9. int ml5238_is_load_disconnect(void);
  10. int ml5238_enable_load_detect(int enable);
  11. void ml5238_cell_start_balance(uint16_t balance_mask);
  12. void ml5238_power_down(void);
  13. int ml5238_charger_is_disconnect(void);
  14. int ml5238_enable_charger_detect(int enable);
  15. typedef void (*ml5238_notify_hander)(int event);
  16. void ml5238_register_notify_handler(ml5238_notify_hander handler);
  17. #define ML5238_Event_Charger_Over_Current 1
  18. #define ML5238_Event_Short_Current 2
  19. #define ML5238_Event_Load_Disconnect 3
  20. #define SHORT_CURRENT_MODE_DISABLE -1
  21. #define SHORT_CURRENT_MODE_33_3A 0
  22. #define SHORT_CURRENT_MODE_66_6A 1
  23. #define SHORT_CURRENT_MODE_100A 2
  24. #define SHORT_CURRENT_MODE_133_3A 3
  25. /* ml5238 will amplify the vmon val by 0.5, so we need
  26. * multi 2 to the adc value, to get the real vol
  27. */
  28. #define cell_real_vol(v) (v * 2)
  29. #include "ml5238_reg.h"
  30. int ml5238_write(uint8_t regaddr, uint8_t data);
  31. /* disable the vmon output the cell voltage */
  32. #define ML5238_VMON_DISABLE() {ml5238_write(ML5238_VMON, 0x00);};
  33. /* select one cell (0-14) connect to vmon, so we can measure
  34. * the cell voltage from vmon pin
  35. */
  36. #define ML5238_SELECT_CELL(i) {ml5238_write(ML5238_VMON, i | VMON_OUT);};
  37. /* IMON output disable */
  38. #define ML5238_IMON_DISABLE() {ml5238_write(ML5238_IMON, 0x02);};
  39. /* IMON output 0V, used to cali the GAIN */
  40. #define ML5238_IMON_OUT_ZERO_10X() {ml5238_write(ML5238_IMON, 0x12);delay_us(1000);};
  41. #define ML5238_IMON_OUT_ZERO_50X() {ml5238_write(ML5238_IMON, 0x13);delay_us(5000);};
  42. /* IMON output 2V, used to cali the GAIN */
  43. #define ML5238_IMON_OUT_V2000_10X() {ml5238_write(ML5238_IMON, 0x14);delay_us(1000);};
  44. #define ML5238_IMON_OUT_V2000_50X() {ml5238_write(ML5238_IMON, 0x15);delay_us(5000);};
  45. /* IMON output 100mV, used to cali the GAIN */
  46. #define ML5238_IMON_OUT_V100_10X() {ml5238_write(ML5238_IMON, 0x1c);delay_us(1000);};
  47. #define ML5238_IMON_OUT_V100_50X() {ml5238_write(ML5238_IMON, 0x1d);delay_us(5000);};
  48. /* IMON output real pin's voltage */
  49. #define ML5238_IMON_OUT_10X() {ml5238_write(ML5238_IMON, 0x10);delay_us(1000);};
  50. #define ML5238_IMON_OUT_50X() {ml5238_write(ML5238_IMON, 0x11);delay_us(5000);};
  51. //vim0 == xxx_OUT_ZERO_xxx, vim1 == xxx_OUT_V2000_xxx, vr == xxx_OUT_V100_xxx
  52. #define ML5238_GAIN(vim0, vim1, vr) ((vim1-vim0)/vr)
  53. //r_v :real voltage, gain == ML5238_GAIN
  54. #define ML5238_V_RSENSER(r_v, vim0, gain) ((r_v-vim0)/gain)
  55. #endif /* _ML5238_H__ */