24constexpr uint8_t i2cObjectIndex = 0;
27constexpr bool usesStopBit =
true;
29constexpr uint16_t DEVICE_ID = 0x88;
30constexpr uint16_t MANUFACTURER_ID = 0x40;
32constexpr uint16_t CHARGE_CURRENT_ADDR = 0x02;
33constexpr uint16_t MAX_CHARGE_VOLTAGE_ADDR = 0x04;
34constexpr uint16_t MINIMUM_SYSTEM_VOLTAGE_ADDR = 0x0C;
36constexpr uint16_t OTG_VOLTAGE_ADDR = 0x06;
37constexpr uint16_t OTG_CURRENT_ADDR = 0x08;
39constexpr uint16_t INPUT_VOLTAGE_ADDR = 0x0A;
40constexpr uint16_t IIN_HOST_ADDR = 0x0E;
41constexpr uint16_t IIN_DPM_ADDR = 0x24;
43constexpr uint16_t CHARGE_OPTION_0_ADDR = 0x00;
44constexpr uint16_t CHARGE_OPTION_1_ADDR = 0x30;
45constexpr uint16_t CHARGE_OPTION_2_ADDR = 0x32;
46constexpr uint16_t CHARGE_OPTION_3_ADDR = 0x34;
48constexpr uint16_t PROCHOT_OPTION_0_ADDR = 0x36;
49constexpr uint16_t PROCHOT_OPTION_1_ADDR = 0x38;
51constexpr uint16_t ADC_OPTION_ADDR = 0x3A;
52constexpr uint16_t CHARGE_STATUS_ADDR = 0x20;
53constexpr uint16_t PROCHOT_STATUS_ADDR = 0x22;
54constexpr uint16_t ADC_VBUS_PSYS_ADC_ADDR = 0x26;
55constexpr uint16_t ADC_IBAT_ADDR = 0x28;
56constexpr uint16_t CMPIN_ADC_ADDR = 0x2A;
57constexpr uint16_t VBAT_ADC_ADDR = 0x2C;
59constexpr uint16_t MANUFACTURER_ID_ADDR = 0x2E;
60constexpr uint16_t DEVICE_ID_ADDR = 0x2F;
62constexpr uint16_t OTG_ENABLE_CELL_LOW_VOLTAGE =
70 static const byte BQ25713addr = 0x6B;
72 template<
typename T>
bool readRegEx(T& dataParam)
76 constexpr uint8_t arrLen = 2;
78 byte valBytes[arrLen];
80 if (readDataReg(dataParam.addr, valBytes, arrLen))
83 dataParam.val0 = (byte)valBytes[0];
84 dataParam.val1 = (byte)valBytes[1];
90 template<
typename T>
static bool writeRegEx(T dataParam)
93 valBytes[0] = dataParam.val0;
94 valBytes[1] = dataParam.val1;
95 return writeData(dataParam.addr, 2, valBytes);
98#define GETMASK(index, size) (((1 << (size)) - 1) << (index))
100#define READFROM(data, index, size) (((data) & GETMASK((index), (size))) >> (index))
102#define WRITETO(data, index, size, value) ((data) = ((data) & (~GETMASK((index), (size)))) | ((value) << (index)))
107#define FIELD(data, name, index, size) \
108 inline decltype(data) name() { return READFROM(data, index, size); } \
109 inline void set_##name(decltype(data) value) { WRITETO(data, index, size, value); }
113#define FIELD_RO(data, name, index, size) \
114 inline decltype(data) name() { return READFROM(data, index, size); }
117 inline static bool isFlagRaised =
false;
124 virtual uint16_t address()
const = 0;
126 virtual uint16_t minVal()
const = 0;
127 virtual uint16_t maxVal()
const = 0;
128 virtual float resolution()
const = 0;
130 virtual uint8_t bitLenght()
const = 0;
131 virtual uint8_t offset()
const = 0;
133 uint16_t mask()
const
137 mask <<= (bitLenght() + 1);
144 if (readDataReg(address(), valBytes, 2))
147 byte val0 = (byte)valBytes[0];
148 byte val1 = (byte)valBytes[1];
151 uint16_t res = val1 << 8 | val0;
156 return res * resolution() + minVal();
166 uint16_t set(
const uint16_t value)
169 uint16_t constraint = value;
170 if (constraint < minVal())
171 constraint = minVal();
172 else if (constraint > maxVal())
173 constraint = maxVal();
174 constraint -= minVal();
176 constraint = round(constraint / resolution());
179 uint16_t binaryWord = constraint;
180 binaryWord &= mask();
181 binaryWord <<= offset();
183 if (!writeData16(address(), binaryWord))
189 return (constraint * resolution()) + minVal();
196 virtual uint16_t address()
const = 0;
198 virtual uint16_t minVal0()
const = 0;
199 virtual uint16_t maskVal0()
const = 0;
200 virtual uint16_t resolutionVal0()
const = 0;
202 virtual uint16_t minVal1()
const = 0;
203 virtual uint16_t maskVal1()
const = 0;
204 virtual uint16_t resolutionVal1()
const = 0;
209 if (readDataReg(address(), valBytes, 2))
212 byte val0 = (byte)valBytes[0];
214 uint16_t res = val0 & maskVal0();
216 return res * resolutionVal0() + minVal0();
226 if (readDataReg(address(), valBytes, 2))
229 byte val1 = (byte)valBytes[1];
231 uint16_t res = val1 & maskVal1();
233 return res * resolutionVal1() + minVal1();
245 uint8_t addr = CHARGE_OPTION_0_ADDR;
249 FIELD(val0, SYS_SHORT_DISABLE, 0x06, 0x01)
251 FIELD(val0, EN_LEARN, 0x05, 0x01)
253 FIELD(val0, IADPT_GAIN, 0x04, 0x01)
255 FIELD(val0, IBAT_GAIN, 0x03, 0x01)
257 FIELD(val0, EN_LDO, 0x02, 0x01)
259 FIELD(val0, EN_IDPM, 0x01, 0x01)
261 FIELD(val0, CHRG_INHIBIT, 0x00, 0x01)
263 FIELD(val1, EN_LWPWR, 0x07, 0x01)
268 FIELD(val1, WDTMR_ADJ, 0x05, 0x02)
270 FIELD(val1, IDPM_AUTO_DISABLE, 0x04, 0x01)
272 FIELD(val1, OTG_ON_CHRGOK, 0x03, 0x01)
274 FIELD(val1, EN_OOA, 0x02, 0x01)
276 FIELD(val1, PWM_FREQ, 0x01, 0x01)
278 FIELD(val1, LOW_PTM_RIPPLE, 0x00, 0x01)
282 uint8_t addr = CHARGE_OPTION_1_ADDR;
286 FIELD(val0, CMP_REF, 0x07, 0x01)
288 FIELD(val0, CMP_POL, 0x06, 0x01)
290 FIELD(val0, CMP_DEG, 0x04, 0x02)
292 FIELD(val0, FORCE_LATCHOFF, 0x03, 0x01)
294 FIELD(val0, EN_SHIP_DCHG, 0x01, 0x01)
297 FIELD(val0, AUTO_WAKEUP_EN, 0x00, 0x01)
299 FIELD(val1, EN_IBAT, 0x07, 0x01)
302 FIELD(val1, EN_PROCHOT_LPWR, 0x05, 0x02)
304 FIELD(val1, EN_PSYS, 0x04, 0x01)
306 FIELD(val1, RSNS_RAC, 0x03, 0x01)
308 FIELD(val1, RSNS_RSR, 0x02, 0x01)
310 FIELD(val1, PSYS_RATIO, 0x01, 0x01)
314 FIELD(val1, PTM_PINSEL, 0x00, 0x01)
318 uint8_t addr = CHARGE_OPTION_2_ADDR;
322 FIELD(val0, EN_EXTILIM, 0x07, 0x01)
324 FIELD(val0, EN_ICHG_IDCHG, 0x06, 0x01)
327 FIELD(val0, Q2_OCP, 0x05, 0x01)
330 FIELD(val0, ACX_OCP, 0x04, 0x01)
332 FIELD(val0, EN_ACOC, 0x03, 0x01)
335 FIELD(val0, ACOC_VTH, 0x02, 0x01)
337 FIELD(val0, EN_BATOC, 0x01, 0x01)
339 FIELD(val0, BATOC_VTH, 0x00, 0x01)
341 FIELD(val1, PKPWR_TOVLD_DEG, 0x06, 0x02)
343 FIELD(val1, EN_PKPWR_IDPM, 0x05, 0x01)
345 FIELD(val1, EN_PKPWR_VSYS, 0x04, 0x01)
347 FIELD(val1, PKPWR_OVLD_STAT, 0x03, 0x01)
349 FIELD(val1, PKPWR_RELAX_STAT, 0x02, 0x01)
352 FIELD(val1, PKPWR_TMAX, 0x00, 0x02)
356 uint8_t addr = CHARGE_OPTION_3_ADDR;
362 FIELD(val0, EN_CON_VAP, 0x06, 0x01)
366 FIELD(val0, OTG_VAP_MODE, 0x05, 0x01)
372 FIELD(val0, IL_AVG, 0x03, 0x02)
376 FIELD(val0, OTG_RANGE_LOW, 0x02, 0x01)
378 FIELD(val0, BATFETOFF_HIZ, 0x01, 0x01)
381 FIELD(val0, PSYS_OTG_IDCHG, 0x00, 0x01)
383 FIELD(val1, EN_HIZ, 0x07, 0x01)
385 FIELD(val1, RESET_REG, 0x06, 0x01)
387 FIELD(val1, RESET_VINDPM, 0x05, 0x01)
390 FIELD(val1, EN_OTG, 0x04, 0x01)
392 FIELD(val1, EN_ICO_MODE, 0x03, 0x01)
396 uint8_t addr = PROCHOT_OPTION_0_ADDR;
407 FIELD(val0, VSYS_TH1, 0x04, 0x03)
417 FIELD(val0, VSYS_TH2, 0x02, 0x02)
419 FIELD(val0, INOM_DEG, 0x01, 0x01)
425 FIELD(val0, LOWER_PROCHOT_VDPM, 0x00, 0x01)
428 FIELD(val1, ILIM2_VTH, 0x03, 0x05)
431 FIELD(val1, ICRIT_DEG, 0x01, 0x02)
437 FIELD(val1, PROCHOT_VDPM_80_90, 0x00, 0x00)
441 uint8_t addr = PROCHOT_OPTION_1_ADDR;
446 FIELD(val0, PROCHOT_PROFILE_VDPM, 0x07, 0x01)
448 FIELD(val0, PROCHOT_PROFILE_COMP, 0x06, 0x01)
450 FIELD(val0, PROCHOT_PROFILE_ICRIT, 0x05, 0x01)
452 FIELD(val0, PROCHOT_PROFILE_INOM, 0x04, 0x01)
455 FIELD(val0, PROCHOT_PROFILE_IDCHG, 0x03, 0x01)
457 FIELD(val0, PROCHOT_PROFILE_VSYS, 0x02, 0x01)
460 FIELD(val0, PROCHOT_PROFILE_BATPRES, 0x01, 0x01)
463 FIELD(val0, PROCHOT_PROFILE_ACOK, 0x00, 0x01)
465 FIELD(val1, IDCHG_VTH, 0x02, 0x06)
467 FIELD(val1, IDCHG_DEG, 0x00, 0x02)
471 uint8_t addr = ADC_OPTION_ADDR;
475 FIELD(val0, EN_ADC_CMPIN, 0x07, 0x01)
477 FIELD(val0, EN_ADC_VBUS, 0x06, 0x01)
480 FIELD(val0, EN_ADC_PSYS, 0x05, 0x01)
482 FIELD(val0, EN_ADC_IIN, 0x04, 0x01)
485 FIELD(val0, EN_ADC_IDCHG, 0x03, 0x01)
487 FIELD(val0, EN_ADC_ICHG, 0x02, 0x01)
489 FIELD(val0, EN_ADC_VSYS, 0x01, 0x01)
491 FIELD(val0, EN_ADC_VBAT, 0x00, 0x01)
493 FIELD(val1, ADC_CONV, 0x07, 0x01)
495 FIELD(val1, ADC_START, 0x06, 0x01)
497 FIELD(val1, ADC_FULLSCALE, 0x05, 0x01)
501 uint8_t addr = CHARGE_STATUS_ADDR;
504 FIELD_RO(val0, Fault_ACOV, 0x07, 0x01)
506 FIELD_RO(val0, Fault_BATOC, 0x06, 0x01)
508 FIELD_RO(val0, Fault_ACOC, 0x05, 0x01)
511 FIELD(val0, SYSOVP_STAT, 0x04, 0x01)
513 FIELD(val0, Fault_SYS_SHORT, 0x03, 0x01)
515 FIELD_RO(val0, Fault_Latchoff, 0x02, 0x01)
518 FIELD_RO(val0, Fault_OTG_OVP, 0x01, 0x01)
521 FIELD_RO(val0, Fault_OTG_UVP, 0x00, 0x01)
523 FIELD_RO(val1, AC_STAT, 0x07, 0x01)
525 FIELD_RO(val1, ICO_DONE, 0x06, 0x01)
527 FIELD_RO(val1, IN_VAP, 0x05, 0x01)
529 FIELD_RO(val1, IN_VINDPM, 0x04, 0x01)
531 FIELD_RO(val1, IN_IINDPM, 0x03, 0x01)
533 FIELD_RO(val1, IN_FCHRG, 0x02, 0x01)
535 FIELD_RO(val1, IN_PCHRG, 0x01, 0x01)
537 FIELD_RO(val1, IN_OTG, 0x00, 0x01)
541 uint8_t addr = PROCHOT_STATUS_ADDR;
544 FIELD_RO(val0, STAT_VDPM, 0x07, 0x01)
546 FIELD_RO(val0, STAT_COMP, 0x06, 0x01)
548 FIELD_RO(val0, STAT_ICRIT, 0x05, 0x01)
551 FIELD_RO(val0, STAT_INOM, 0x04, 0x01)
553 FIELD_RO(val0, STAT_IDCHG, 0x03, 0x01)
555 FIELD_RO(val0, STAT_VSYS, 0x02, 0x01)
557 FIELD_RO(val0, STAT_Battery_Removal, 0x01, 0x01)
559 FIELD_RO(val0, STAT_Adapter_Removal, 0x00, 0x01)
566 FIELD(val1, EN_PROCHOT_EXIT, 0x06, 0x01)
573 FIELD(val1, PROCHOT_WIDTH, 0x04, 0x02)
578 FIELD(val1, PROCHOT_CLEAR, 0x03, 0x01)
586 FIELD(val1, STAT_VAP_FAIL, 0x01, 0x01)
592 FIELD(val1, STAT_EXIT_VAP, 0x00, 0x01)
596 uint16_t address()
const override {
return CHARGE_CURRENT_ADDR; }
598 virtual uint16_t minVal()
const override {
return 0; }
599 virtual uint16_t maxVal()
const override {
return 8128; }
600 virtual float resolution()
const override {
return 64; }
602 virtual uint8_t bitLenght()
const override {
return 7; }
603 virtual uint8_t offset()
const override {
return 6; }
607 uint16_t address()
const override {
return MAX_CHARGE_VOLTAGE_ADDR; }
610 virtual uint16_t minVal()
const override {
return 0; }
611 virtual uint16_t maxVal()
const override {
return 19200; }
612 virtual float resolution()
const override {
return 8; }
614 virtual uint8_t bitLenght()
const override {
return 12; }
615 virtual uint8_t offset()
const override {
return 3; }
619 uint16_t address()
const override {
return MINIMUM_SYSTEM_VOLTAGE_ADDR; }
622 virtual uint16_t minVal()
const override {
return 0; }
623 virtual uint16_t maxVal()
const override {
return 16128; }
624 virtual float resolution()
const override {
return 256; }
626 virtual uint8_t bitLenght()
const override {
return 6; }
627 virtual uint8_t offset()
const override {
return 8; }
632 uint16_t address()
const override {
return IIN_HOST_ADDR; }
634 virtual uint16_t minVal()
const override {
return 50; }
635 virtual uint16_t maxVal()
const override {
return 6400; }
636 virtual float resolution()
const override {
return 50; }
638 virtual uint8_t bitLenght()
const override {
return 7; }
639 virtual uint8_t offset()
const override {
return 8; }
645 uint16_t address()
const override {
return IIN_DPM_ADDR; }
647 virtual uint16_t minVal()
const override {
return 50; }
648 virtual uint16_t maxVal()
const override {
return 6400; }
649 virtual float resolution()
const override {
return 50; }
651 virtual uint8_t bitLenght()
const override {
return 7; }
652 virtual uint8_t offset()
const override {
return 8; }
658 uint16_t address()
const override {
return INPUT_VOLTAGE_ADDR; }
660 virtual uint16_t minVal()
const override {
return 3200; }
661 virtual uint16_t maxVal()
const override {
return 19584; }
662 virtual float resolution()
const override {
return 64; }
664 virtual uint8_t bitLenght()
const override {
return 8; }
665 virtual uint8_t offset()
const override {
return 6; }
669 uint16_t address()
const override {
return OTG_VOLTAGE_ADDR; }
671 uint16_t get(
bool isLowVoltageMode)
674 minValue = isLowVoltageMode ? 0 : 1280;
676 return IBaseRegister::get();
679 uint16_t set(uint16_t val,
bool isLowVoltageMode)
682 minValue = isLowVoltageMode ? 0 : 1280;
684 return IBaseRegister::set(val);
688 virtual uint16_t minVal()
const override {
return minValue; }
689 virtual uint16_t maxVal()
const override {
return 20800; }
690 virtual float resolution()
const override {
return 8.1328125; }
692 virtual uint8_t bitLenght()
const override {
return 12; }
693 virtual uint8_t offset()
const override {
return 2; }
695 uint16_t minValue = 0;
701 uint16_t address()
const override {
return OTG_CURRENT_ADDR; }
703 virtual uint16_t minVal()
const override {
return 0; }
704 virtual uint16_t maxVal()
const override {
return 6400; }
705 virtual float resolution()
const override {
return 50; }
707 virtual uint8_t bitLenght()
const override {
return 7; }
708 virtual uint8_t offset()
const override {
return 8; }
713 uint16_t address()
const override {
return ADC_VBUS_PSYS_ADC_ADDR; };
715 uint16_t minVal0()
const override {
return 0; };
716 uint16_t maskVal0()
const override {
return 0b11111111; }
717 uint16_t resolutionVal0()
const override {
return 12; };
719 uint16_t minVal1()
const override {
return 3200; };
720 uint16_t maskVal1()
const override {
return 0b11111111; }
721 uint16_t resolutionVal1()
const override {
return 64; };
724 uint16_t get_VBUS() {
return getVal1(); }
726 uint16_t get_PSYS() {
return getVal0(); }
731 uint16_t address()
const override {
return ADC_IBAT_ADDR; };
733 uint16_t minVal0()
const override {
return 0; };
734 uint16_t maskVal0()
const override {
return 0b01111111; }
735 uint16_t resolutionVal0()
const override {
return 256; };
737 uint16_t minVal1()
const override {
return 0; };
738 uint16_t maskVal1()
const override {
return 0b01111111; }
739 uint16_t resolutionVal1()
const override {
return 64; };
742 uint16_t get_ICHG() {
return getVal1(); }
744 uint16_t get_IDCHG() {
return getVal0(); }
748 uint16_t address()
const override {
return CMPIN_ADC_ADDR; };
750 uint16_t minVal0()
const override {
return 0; };
751 uint16_t maskVal0()
const override {
return 0b11111111; }
752 uint16_t resolutionVal0()
const override {
return 12; };
754 uint16_t minVal1()
const override {
return 0; };
755 uint16_t maskVal1()
const override {
return 0b11111111; }
756 uint16_t resolutionVal1()
const override {
return 50; };
760 uint8_t addr = CMPIN_ADC_ADDR;
762 uint16_t get_IIN() {
return getVal1(); }
764 uint16_t get_CMPIN() {
return getVal0(); }
768 uint16_t address()
const override {
return VBAT_ADC_ADDR; };
770 uint16_t minVal0()
const override {
return 2880; };
771 uint16_t maskVal0()
const override {
return 0b11111111; }
772 uint16_t resolutionVal0()
const override {
return 64; };
774 uint16_t minVal1()
const override {
return 2880; };
775 uint16_t maskVal1()
const override {
return 0b11111111; }
776 uint16_t resolutionVal1()
const override {
return 64; };
779 uint16_t get_VSYS() {
return getVal1(); }
781 uint16_t get_VBAT() {
return getVal0(); }
787 uint8_t addr = MANUFACTURER_ID_ADDR;
788 byte get_manufacturerID()
792 readDataReg(addr, valBytes, 1);
793 return (
byte)valBytes[0];
799 uint8_t addr = DEVICE_ID_ADDR;
804 readDataReg(addr, valBytes, 1);
805 return (
byte)valBytes[0];
811 static bool readDataReg(
const byte regAddress,
byte* dataVal,
const uint8_t arrLen)
814 return ::lampda::platform::i2c::i2c_readData(
815 i2cObjectIndex, BQ25713addr, regAddress, arrLen, dataVal, usesStopBit ? 1 : 0) == 0;
818 static bool writeData(
const byte regAddress, uint8_t lenght, uint8_t* data)
821 return ::lampda::platform::i2c::i2c_writeData(
822 i2cObjectIndex, BQ25713addr, regAddress, lenght, data, usesStopBit ? 1 : 0) == 0;
825 static bool writeData16(
const byte regAddress, uint16_t val)
828 data[0] = val & 0xFF;
829 data[1] = (val >> 8) & 0xFF;
832 return writeData(regAddress, 2, data);
Definition: BQ25713.h:121
Definition: BQ25713.h:165
Definition: BQ25713.h:195
Definition: BQ25713.h:730
Definition: BQ25713.h:747
Definition: BQ25713.h:470
Definition: BQ25713.h:712
Definition: BQ25713.h:767
Definition: BQ25713.h:595
Definition: BQ25713.h:244
Definition: BQ25713.h:281
Definition: BQ25713.h:317
Definition: BQ25713.h:355
Definition: BQ25713.h:500
Definition: BQ25713.h:797
Definition: BQ25713.h:644
Definition: BQ25713.h:631
Definition: BQ25713.h:785
Definition: BQ25713.h:606
Definition: BQ25713.h:618
Definition: BQ25713.h:700
Definition: BQ25713.h:668
Definition: BQ25713.h:395
Definition: BQ25713.h:440
Definition: BQ25713.h:540
Definition: BQ25713.h:242