AXP192.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. #include "AXP192.h"
  2. AXP192::AXP192() {
  3. }
  4. void AXP192::begin(void) {
  5. Wire1.begin(21, 22);
  6. Wire1.setClock(400000);
  7. // Set LDO2 & LDO3(TFT_LED & TFT) 3.0V
  8. Write1Byte(0x28, 0xcc);
  9. // Set ADC to All Enable
  10. Write1Byte(0x82, 0xff);
  11. // Bat charge voltage to 4.2, Current 100MA
  12. Write1Byte(0x33, 0xc0);
  13. // Enable Bat,ACIN,VBUS,APS adc
  14. Write1Byte(0x82, 0xff);
  15. // Enable Ext, LDO2, LDO3, DCDC1
  16. Write1Byte(0x12, Read8bit(0x12) | 0x4D);
  17. // 128ms power on, 4s power off
  18. Write1Byte(0x36, 0x0C);
  19. // Set RTC voltage to 3.3V
  20. Write1Byte(0x91, 0xF0);
  21. // Set GPIO0 to LDO
  22. Write1Byte(0x90, 0x02);
  23. // Disable vbus hold limit
  24. Write1Byte(0x30, 0x80);
  25. // Set temperature protection
  26. Write1Byte(0x39, 0xfc);
  27. // Enable RTC BAT charge
  28. Write1Byte(0x35, 0xa2);
  29. // Enable bat detection
  30. Write1Byte(0x32, 0x46);
  31. // ScreenBreath(80);
  32. }
  33. void AXP192::Write1Byte(uint8_t Addr, uint8_t Data) {
  34. Wire1.beginTransmission(0x34);
  35. Wire1.write(Addr);
  36. Wire1.write(Data);
  37. Wire1.endTransmission();
  38. }
  39. uint8_t AXP192::Read8bit(uint8_t Addr) {
  40. Wire1.beginTransmission(0x34);
  41. Wire1.write(Addr);
  42. Wire1.endTransmission();
  43. Wire1.requestFrom(0x34, 1);
  44. return Wire1.read();
  45. }
  46. uint16_t AXP192::Read12Bit(uint8_t Addr) {
  47. uint16_t Data = 0;
  48. uint8_t buf[2];
  49. ReadBuff(Addr, 2, buf);
  50. Data = ((buf[0] << 4) + buf[1]); //
  51. return Data;
  52. }
  53. uint16_t AXP192::Read13Bit(uint8_t Addr) {
  54. uint16_t Data = 0;
  55. uint8_t buf[2];
  56. ReadBuff(Addr, 2, buf);
  57. Data = ((buf[0] << 5) + buf[1]); //
  58. return Data;
  59. }
  60. uint16_t AXP192::Read16bit(uint8_t Addr) {
  61. uint16_t ReData = 0;
  62. Wire1.beginTransmission(0x34);
  63. Wire1.write(Addr);
  64. Wire1.endTransmission();
  65. Wire1.requestFrom(0x34, 2);
  66. for (int i = 0; i < 2; i++) {
  67. ReData <<= 8;
  68. ReData |= Wire1.read();
  69. }
  70. return ReData;
  71. }
  72. uint32_t AXP192::Read24bit(uint8_t Addr) {
  73. uint32_t ReData = 0;
  74. Wire1.beginTransmission(0x34);
  75. Wire1.write(Addr);
  76. Wire1.endTransmission();
  77. Wire1.requestFrom(0x34, 3);
  78. for (int i = 0; i < 3; i++) {
  79. ReData <<= 8;
  80. ReData |= Wire1.read();
  81. }
  82. return ReData;
  83. }
  84. uint32_t AXP192::Read32bit(uint8_t Addr) {
  85. uint32_t ReData = 0;
  86. Wire1.beginTransmission(0x34);
  87. Wire1.write(Addr);
  88. Wire1.endTransmission();
  89. Wire1.requestFrom(0x34, 4);
  90. for (int i = 0; i < 4; i++) {
  91. ReData <<= 8;
  92. ReData |= Wire1.read();
  93. }
  94. return ReData;
  95. }
  96. void AXP192::ReadBuff(uint8_t Addr, uint8_t Size, uint8_t *Buff) {
  97. Wire1.beginTransmission(0x34);
  98. Wire1.write(Addr);
  99. Wire1.endTransmission();
  100. Wire1.requestFrom(0x34, (int)Size);
  101. for (int i = 0; i < Size; i++) {
  102. *(Buff + i) = Wire1.read();
  103. }
  104. }
  105. void AXP192::ScreenBreath(int brightness) {
  106. if (brightness > 100 || brightness < 0) return;
  107. int vol = map(brightness, 0, 100, 2500, 3200);
  108. vol = (vol < 1800) ? 0 : (vol - 1800) / 100;
  109. uint8_t buf = Read8bit(0x28);
  110. Write1Byte(0x28, ((buf & 0x0f) | ((uint16_t)vol << 4)));
  111. }
  112. void AXP192::ScreenSwitch(bool state) {
  113. uint8_t brightness;
  114. if (state == false) {
  115. brightness = 0;
  116. } else if (state == true) {
  117. brightness = 12;
  118. }
  119. uint8_t buf = Read8bit(0x28);
  120. Write1Byte(0x28, ((buf & 0x0f) | (brightness << 4)));
  121. }
  122. bool AXP192::GetBatState() {
  123. if (Read8bit(0x01) | 0x20)
  124. return true;
  125. else
  126. return false;
  127. }
  128. //---------coulombcounter_from_here---------
  129. // enable: void EnableCoulombcounter(void);
  130. // disable: void DisableCOulombcounter(void);
  131. // stop: void StopCoulombcounter(void);
  132. // clear: void ClearCoulombcounter(void);
  133. // get charge data: uint32_t GetCoulombchargeData(void);
  134. // get discharge data: uint32_t GetCoulombdischargeData(void);
  135. // get coulomb val affter calculation: float GetCoulombData(void);
  136. //------------------------------------------
  137. void AXP192::EnableCoulombcounter(void) {
  138. Write1Byte(0xB8, 0x80);
  139. }
  140. void AXP192::DisableCoulombcounter(void) {
  141. Write1Byte(0xB8, 0x00);
  142. }
  143. void AXP192::StopCoulombcounter(void) {
  144. Write1Byte(0xB8, 0xC0);
  145. }
  146. void AXP192::ClearCoulombcounter(void) {
  147. Write1Byte(0xB8, 0xA0);
  148. }
  149. uint32_t AXP192::GetCoulombchargeData(void) {
  150. return Read32bit(0xB0);
  151. }
  152. uint32_t AXP192::GetCoulombdischargeData(void) {
  153. return Read32bit(0xB4);
  154. }
  155. float AXP192::GetCoulombData(void) {
  156. uint32_t coin = 0;
  157. uint32_t coout = 0;
  158. coin = GetCoulombchargeData();
  159. coout = GetCoulombdischargeData();
  160. // c = 65536 * current_LSB * (coin - coout) / 3600 / ADC rate
  161. // Adc rate can be read from 84H ,change this variable if you change the ADC
  162. // reate
  163. float ccc = 65536 * 0.5 * (int32_t)(coin - coout) / 3600.0 / 25.0;
  164. return ccc;
  165. }
  166. //----------coulomb_end_at_here----------
  167. uint16_t AXP192::GetVbatData(void) {
  168. uint16_t vbat = 0;
  169. uint8_t buf[2];
  170. ReadBuff(0x78, 2, buf);
  171. vbat = ((buf[0] << 4) + buf[1]); // V
  172. return vbat;
  173. }
  174. uint16_t AXP192::GetVinData(void) {
  175. uint16_t vin = 0;
  176. uint8_t buf[2];
  177. ReadBuff(0x56, 2, buf);
  178. vin = ((buf[0] << 4) + buf[1]); // V
  179. return vin;
  180. }
  181. uint16_t AXP192::GetIinData(void) {
  182. uint16_t iin = 0;
  183. uint8_t buf[2];
  184. ReadBuff(0x58, 2, buf);
  185. iin = ((buf[0] << 4) + buf[1]);
  186. return iin;
  187. }
  188. uint16_t AXP192::GetVusbinData(void) {
  189. uint16_t vin = 0;
  190. uint8_t buf[2];
  191. ReadBuff(0x5a, 2, buf);
  192. vin = ((buf[0] << 4) + buf[1]); // V
  193. return vin;
  194. }
  195. uint16_t AXP192::GetIusbinData(void) {
  196. uint16_t iin = 0;
  197. uint8_t buf[2];
  198. ReadBuff(0x5C, 2, buf);
  199. iin = ((buf[0] << 4) + buf[1]);
  200. return iin;
  201. }
  202. uint16_t AXP192::GetIchargeData(void) {
  203. uint16_t icharge = 0;
  204. uint8_t buf[2];
  205. ReadBuff(0x7A, 2, buf);
  206. icharge = (buf[0] << 5) + buf[1];
  207. return icharge;
  208. }
  209. uint16_t AXP192::GetIdischargeData(void) {
  210. uint16_t idischarge = 0;
  211. uint8_t buf[2];
  212. ReadBuff(0x7C, 2, buf);
  213. idischarge = (buf[0] << 5) + buf[1];
  214. return idischarge;
  215. }
  216. uint16_t AXP192::GetTempData(void) {
  217. uint16_t temp = 0;
  218. uint8_t buf[2];
  219. ReadBuff(0x5e, 2, buf);
  220. temp = ((buf[0] << 4) + buf[1]);
  221. return temp;
  222. }
  223. uint32_t AXP192::GetPowerbatData(void) {
  224. uint32_t power = 0;
  225. uint8_t buf[3];
  226. ReadBuff(0x70, 2, buf);
  227. power = (buf[0] << 16) + (buf[1] << 8) + buf[2];
  228. return power;
  229. }
  230. uint16_t AXP192::GetVapsData(void) {
  231. uint16_t vaps = 0;
  232. uint8_t buf[2];
  233. ReadBuff(0x7e, 2, buf);
  234. vaps = ((buf[0] << 4) + buf[1]);
  235. return vaps;
  236. }
  237. void AXP192::SetSleep(void) {
  238. uint8_t buf = Read8bit(0x31);
  239. buf = (1 << 3) | buf;
  240. Write1Byte(0x31, buf);
  241. Write1Byte(0x90, 0x00);
  242. Write1Byte(0x12, 0x09);
  243. // Write1Byte(0x12, 0x00);
  244. Write1Byte(0x12, Read8bit(0x12) & 0xA1); // Disable all outputs but DCDC1
  245. }
  246. uint8_t AXP192::GetWarningLeve(void) {
  247. Wire1.beginTransmission(0x34);
  248. Wire1.write(0x47);
  249. Wire1.endTransmission();
  250. Wire1.requestFrom(0x34, 1);
  251. uint8_t buf = Wire1.read();
  252. return (buf & 0x01);
  253. }
  254. // -- sleep
  255. void AXP192::DeepSleep(uint64_t time_in_us) {
  256. SetSleep();
  257. if (time_in_us > 0) {
  258. esp_sleep_enable_timer_wakeup(time_in_us);
  259. } else {
  260. esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER);
  261. }
  262. (time_in_us == 0) ? esp_deep_sleep_start() : esp_deep_sleep(time_in_us);
  263. }
  264. void AXP192::LightSleep(uint64_t time_in_us) {
  265. SetSleep();
  266. if (time_in_us > 0) {
  267. esp_sleep_enable_timer_wakeup(time_in_us);
  268. } else {
  269. esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER);
  270. }
  271. esp_light_sleep_start();
  272. }
  273. // 0 not press, 0x01 long press, 0x02 press
  274. uint8_t AXP192::GetBtnPress() {
  275. uint8_t state = Read8bit(0x46);
  276. if (state) {
  277. Write1Byte(0x46, 0x03);
  278. }
  279. return state;
  280. }
  281. uint8_t AXP192::GetWarningLevel(void) {
  282. return Read8bit(0x47) & 0x01;
  283. }
  284. float AXP192::GetBatVoltage() {
  285. float ADCLSB = 1.1 / 1000.0;
  286. uint16_t ReData = Read12Bit(0x78);
  287. return ReData * ADCLSB;
  288. }
  289. float AXP192::GetBatCurrent() {
  290. float ADCLSB = 0.5;
  291. uint16_t CurrentIn = Read13Bit(0x7A);
  292. uint16_t CurrentOut = Read13Bit(0x7C);
  293. return (CurrentIn - CurrentOut) * ADCLSB;
  294. }
  295. float AXP192::GetVinVoltage() {
  296. float ADCLSB = 1.7 / 1000.0;
  297. uint16_t ReData = Read12Bit(0x56);
  298. return ReData * ADCLSB;
  299. }
  300. float AXP192::GetVinCurrent() {
  301. float ADCLSB = 0.625;
  302. uint16_t ReData = Read12Bit(0x58);
  303. return ReData * ADCLSB;
  304. }
  305. float AXP192::GetVBusVoltage() {
  306. float ADCLSB = 1.7 / 1000.0;
  307. uint16_t ReData = Read12Bit(0x5A);
  308. return ReData * ADCLSB;
  309. }
  310. float AXP192::GetVBusCurrent() {
  311. float ADCLSB = 0.375;
  312. uint16_t ReData = Read12Bit(0x5C);
  313. return ReData * ADCLSB;
  314. }
  315. float AXP192::GetTempInAXP192() {
  316. float ADCLSB = 0.1;
  317. const float OFFSET_DEG_C = -144.7;
  318. uint16_t ReData = Read12Bit(0x5E);
  319. return OFFSET_DEG_C + ReData * ADCLSB;
  320. }
  321. float AXP192::GetBatPower() {
  322. float VoltageLSB = 1.1;
  323. float CurrentLCS = 0.5;
  324. uint32_t ReData = Read24bit(0x70);
  325. return VoltageLSB * CurrentLCS * ReData / 1000.0;
  326. }
  327. float AXP192::GetBatChargeCurrent() {
  328. float ADCLSB = 0.5;
  329. uint16_t ReData = Read12Bit(0x7A);
  330. return ReData * ADCLSB;
  331. }
  332. float AXP192::GetAPSVoltage() {
  333. float ADCLSB = 1.4 / 1000.0;
  334. uint16_t ReData = Read12Bit(0x7E);
  335. return ReData * ADCLSB;
  336. }
  337. float AXP192::GetBatCoulombInput() {
  338. uint32_t ReData = Read32bit(0xB0);
  339. return ReData * 65536 * 0.5 / 3600 / 25.0;
  340. }
  341. float AXP192::GetBatCoulombOut() {
  342. uint32_t ReData = Read32bit(0xB4);
  343. return ReData * 65536 * 0.5 / 3600 / 25.0;
  344. }
  345. void AXP192::SetCoulombClear() {
  346. Write1Byte(0xB8, 0x20);
  347. }
  348. void AXP192::SetLDO2(bool State) {
  349. uint8_t buf = Read8bit(0x12);
  350. if (State == true)
  351. buf = (1 << 2) | buf;
  352. else
  353. buf = ~(1 << 2) & buf;
  354. Write1Byte(0x12, buf);
  355. }
  356. // Cut all power, except for LDO1 (RTC)
  357. void AXP192::PowerOff() {
  358. Write1Byte(0x32, Read8bit(0x32) | 0x80); // MSB for Power Off
  359. }
  360. void AXP192::SetPeripherialsPower(uint8_t state) {
  361. if (!state)
  362. Write1Byte(0x10, Read8bit(0x10) & 0XFB);
  363. else if (state)
  364. Write1Byte(0x10, Read8bit(0x10) | 0X04);
  365. // uint8_t data;
  366. // Set EXTEN to enable 5v boost
  367. }