bq27220.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include <bq27220.h>
  2. #include <bq27220_reg.h>
  3. #include <i2c.h>
  4. #include <stdbool.h>
  5. uint16_t bq27220_read_word(uint8_t address) {
  6. uint8_t data[2] = { address };
  7. if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ27220_ADDRESS, data, 1, 2000) != HAL_OK) {
  8. return 0;
  9. }
  10. if (HAL_I2C_Master_Receive(&POWER_I2C, BQ27220_ADDRESS, data, 2, 2000) != HAL_OK) {
  11. return 0;
  12. }
  13. return *(uint16_t*)data;
  14. }
  15. bool bq27220_control(uint16_t control) {
  16. uint8_t data[3] = { CommandControl };
  17. data[1] = (control>>8) & 0xFF;
  18. data[2] = control & 0xFF;
  19. if (HAL_I2C_Master_Transmit(&POWER_I2C, BQ27220_ADDRESS, data, 3, 2000) != HAL_OK) {
  20. return false;
  21. }
  22. return true;
  23. }
  24. void bq27220_init() {
  25. bq27220_control(Control_ENTER_CFG_UPDATE);
  26. bq27220_control(Control_SET_PROFILE_2);
  27. bq27220_control(Control_EXIT_CFG_UPDATE);
  28. }
  29. uint16_t bq27220_get_voltage() {
  30. return bq27220_read_word(CommandVoltage);
  31. }
  32. int16_t bq27220_get_current() {
  33. return (int16_t)bq27220_read_word(CommandCurrent);
  34. }
  35. uint16_t bq27220_get_full_charge_capacity() {
  36. return bq27220_read_word(CommandFullChargeCapacity);
  37. }
  38. uint16_t bq27220_get_remaining_capacity() {
  39. return bq27220_read_word(CommandRemainingCapacity);
  40. }
  41. uint16_t bq27220_get_state_of_charge() {
  42. return bq27220_read_word(CommandStateOfCharge);
  43. }