bq27220.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "bq27220.h"
  2. #include "bq27220_reg.h"
  3. #include <api-hal-i2c.h>
  4. #include <stdbool.h>
  5. uint16_t bq27220_read_word(uint8_t address) {
  6. uint8_t buffer[2] = {address};
  7. uint16_t ret;
  8. with_api_hal_i2c(
  9. uint16_t, &ret, () {
  10. if(api_hal_i2c_trx(
  11. POWER_I2C, BQ27220_ADDRESS, buffer, 1, buffer, 2, BQ27220_I2C_TIMEOUT)) {
  12. return *(uint16_t*)buffer;
  13. } else {
  14. return 0;
  15. }
  16. });
  17. return ret;
  18. }
  19. bool bq27220_control(uint16_t control) {
  20. bool ret;
  21. with_api_hal_i2c(
  22. bool, &ret, () {
  23. uint8_t buffer[3];
  24. buffer[0] = CommandControl;
  25. buffer[1] = (control >> 8) & 0xFF;
  26. buffer[2] = control & 0xFF;
  27. return api_hal_i2c_tx(POWER_I2C, BQ27220_ADDRESS, buffer, 3, BQ27220_I2C_TIMEOUT);
  28. });
  29. return ret;
  30. }
  31. void bq27220_init() {
  32. bq27220_control(Control_ENTER_CFG_UPDATE);
  33. bq27220_control(Control_SET_PROFILE_2);
  34. bq27220_control(Control_EXIT_CFG_UPDATE);
  35. }
  36. uint16_t bq27220_get_voltage() {
  37. return bq27220_read_word(CommandVoltage);
  38. }
  39. int16_t bq27220_get_current() {
  40. return bq27220_read_word(CommandCurrent);
  41. }
  42. uint8_t bq27220_get_battery_status(BatteryStatus* battery_status) {
  43. uint16_t data = bq27220_read_word(CommandBatteryStatus);
  44. if(data == BQ27220_ERROR) {
  45. return BQ27220_ERROR;
  46. } else {
  47. *(uint16_t*)battery_status = data;
  48. return BQ27220_SUCCESS;
  49. }
  50. }
  51. uint8_t bq27220_get_operation_status(OperationStatus* operation_status) {
  52. uint16_t data = bq27220_read_word(CommandOperationStatus);
  53. if(data == BQ27220_ERROR) {
  54. return BQ27220_ERROR;
  55. } else {
  56. *(uint16_t*)operation_status = data;
  57. return BQ27220_SUCCESS;
  58. }
  59. }
  60. uint16_t bq27220_get_temperature() {
  61. return bq27220_read_word(CommandTemperature);
  62. }
  63. uint16_t bq27220_get_full_charge_capacity() {
  64. return bq27220_read_word(CommandFullChargeCapacity);
  65. }
  66. uint16_t bq27220_get_remaining_capacity() {
  67. return bq27220_read_word(CommandRemainingCapacity);
  68. }
  69. uint16_t bq27220_get_state_of_charge() {
  70. return bq27220_read_word(CommandStateOfCharge);
  71. }
  72. uint16_t bq27220_get_state_of_health() {
  73. return bq27220_read_word(CommandStateOfHealth);
  74. }