bq27220.c 2.1 KB

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