power_init.lua 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. local i2c_id = 1
  2. local ch224q_i2c_addr = 0x22 -- 受电分析芯片I2C地址
  3. local ch224q_i2c_reg1 = 0x09 -- 快充协议激活情况(只读)
  4. local ch224q_i2c_reg2 = 0x0A -- 电压请求(只写,0:5V 1:9V 2:12V 3:15V 4:20V 5:28V)
  5. local ch224q_i2c_reg3 = 0x50 -- 最大电流参考值(只写,该寄存器仅PD协议有效)
  6. local bq25895_addr = 0x6A -- 充电芯片I2C地址
  7. local bq25895_reg1 = 0x02 -- 控制ADC检测开关
  8. local bq25895_reg2 = 0x09 -- bit5位可以控制VSYS到VBAT的通路开关(默认0导通,1关闭)
  9. local reg_addr_ADCCTL = 0x02
  10. local reg_addr_BATV = 0x0E
  11. local reg_addr_SYSV = 0x0F
  12. local reg_addr_TSPCT = 0x10
  13. local reg_addr_VBUSV = 0x11
  14. local reg_addr_ICHGR = 0x12
  15. local reg_addr_ICO = 0x13
  16. local function get_value()
  17. local ret_val_BATV = i2c.readReg(i2c_id, bq25895_addr, reg_addr_BATV, 1)
  18. local ret_val_SYSV = i2c.readReg(i2c_id, bq25895_addr, reg_addr_SYSV, 1)
  19. local ret_val_TSPCT = i2c.readReg(i2c_id, bq25895_addr, reg_addr_TSPCT, 1)
  20. local ret_val_VBUSV = i2c.readReg(i2c_id, bq25895_addr, reg_addr_VBUSV, 1)
  21. local ret_val_ICHGR = i2c.readReg(i2c_id, bq25895_addr, reg_addr_ICHGR, 1)
  22. local ret_val_ICO = i2c.readReg(i2c_id, bq25895_addr, reg_addr_ICO, 1)
  23. local byte_BATV = (ret_val_BATV == "") and 0x00 or string.byte(ret_val_BATV)
  24. local byte_SYSV = (ret_val_SYSV == "") and 0x00 or string.byte(ret_val_SYSV)
  25. local byte_TSPCT = (ret_val_TSPCT == "") and 0x00 or string.byte(ret_val_TSPCT)
  26. local byte_VBUSV = (ret_val_VBUSV == "") and 0x00 or string.byte(ret_val_VBUSV)
  27. local byte_ICHGR = (ret_val_ICHGR == "") and 0x00 or string.byte(ret_val_ICHGR)
  28. local byte_ICO = (ret_val_ICO == "") and 0x00 or string.byte(ret_val_ICO)
  29. local s_BATV = (ret_val_BATV == "") and "nil" or string.format("%02X", byte_BATV)
  30. local s_SYSV = (ret_val_SYSV == "") and "nil" or string.format("%02X", byte_SYSV)
  31. local s_TSPCT = (ret_val_TSPCT == "") and "nil" or string.format("%02X", byte_TSPCT)
  32. local s_VBUSV = (ret_val_VBUSV == "") and "nil" or string.format("%02X", byte_VBUSV)
  33. local s_ICHGR = (ret_val_ICHGR == "") and "nil" or string.format("%02X", byte_ICHGR)
  34. local s_ICO = (ret_val_ICO == "") and "nil" or string.format("%02X", byte_ICO)
  35. local value_BATV = (byte_BATV == 0x00) and 0x00 or ((byte_BATV & 0x7F) * 20 + 2304)
  36. local value_SYSV = (byte_SYSV == 0x00) and 0x00 or ((byte_SYSV & 0x7F) * 20 + 2304)
  37. local value_TSPCT = (byte_TSPCT == 0x00) and 0x00 or ((byte_TSPCT & 0x7F) * 0.465 + 21)
  38. local value_VBUSV = (byte_VBUSV == 0x00) and 0x00 or ((byte_VBUSV & 0x7F) * 100 + 2600)
  39. local value_ICHGR = (byte_ICHGR == 0x00) and 0x00 or ((byte_ICHGR & 0x7F) * 50)
  40. local value_ICO = (byte_ICO == 0x00) and 0x00 or ((byte_ICO & 0x3F) * 50 + 100)
  41. local value_Pin = 0
  42. local s_Pin = "nil"
  43. if (ret_val_VBUSV ~= "") and (ret_val_ICO ~= "") then
  44. value_Pin = value_VBUSV * value_ICO / 1000
  45. s_Pin = string.format("%.1fmW", value_Pin)
  46. else
  47. value_Pin = 0
  48. s_Pin = "nil"
  49. end
  50. local value_Pchgr = 0
  51. local s_Pchgr = "nil"
  52. if (ret_val_BATV ~= "") and (ret_val_ICHGR ~= "") then
  53. value_Pchgr = value_BATV * value_ICHGR / 1000
  54. s_Pchgr = string.format("%.1fmW", value_Pchgr)
  55. else
  56. value_Pchgr = 0
  57. s_Pchgr = "nil"
  58. end
  59. local dbg_info_s1 = ""
  60. dbg_info_s1 = string.format("%02X=%s, %02X=%s, %02X=%s, %02X=%s, %02X=%s, %02X=%s=%dmA\n",
  61. reg_addr_BATV, s_BATV,
  62. reg_addr_SYSV, s_SYSV,
  63. reg_addr_TSPCT, s_TSPCT,
  64. reg_addr_VBUSV, s_VBUSV,
  65. reg_addr_ICHGR, s_ICHGR,
  66. reg_addr_ICO, s_ICO,value_ICO
  67. )
  68. dbg_info_s1 = dbg_info_s1 .."\n"
  69. dbg_info_s1 = dbg_info_s1..string.format("iBat=%dmV;", value_BATV)
  70. dbg_info_s1 = dbg_info_s1..string.format("Sys=%dmV;", value_SYSV)
  71. dbg_info_s1 = dbg_info_s1..string.format("TS=%.2f%%;", value_TSPCT)
  72. dbg_info_s1 = dbg_info_s1..string.format("Bus=%dmV;", value_VBUSV)
  73. dbg_info_s1 = dbg_info_s1..string.format("Chg=%dmA;", value_ICHGR)
  74. dbg_info_s1 = dbg_info_s1 .."\n"
  75. -- dbg_info_s1 = dbg_info_s1.."iccid:"..(mobile.iccid() or "N/A")..";"
  76. -- dbg_info_s1 = dbg_info_s1.."imei:"..(mobile.imei() or "N/A")..";\n"
  77. -- dbg_info_s1 = dbg_info_s1.."csq:"..(mobile.csq() or "N/A")
  78. -- dbg_info_s1 = dbg_info_s1..";rssi:"..(mobile.rssi() or "N/A")
  79. -- dbg_info_s1 = dbg_info_s1..";rsrq:"..(mobile.rsrq() or "N/A")
  80. -- dbg_info_s1 = dbg_info_s1..";rsrp:"..(mobile.rsrp() or "N/A")
  81. -- dbg_info_s1 = dbg_info_s1..";snr:"..(mobile.snr() or "N/A")
  82. uart.write(1, dbg_info_s1)
  83. end
  84. sys.taskInit(function()
  85. sys.wait(200)
  86. local result = i2c.setup(i2c_id,i2c.SLOW)
  87. log.info("i2c 1", "setup", result)
  88. -- local data1 = i2c.readReg(i2c_id, ch224q_i2c_addr, ch224q_i2c_reg1, 1)
  89. -- local data2 = i2c.readReg(i2c_id, ch224q_i2c_addr, ch224q_i2c_reg3, 1)
  90. -- local result1 = i2c.writeReg(i2c_id, ch224q_i2c_addr, ch224q_i2c_reg2, string.char(0x01))
  91. -- if result1 then
  92. -- uart.write(1, "成功写入数据")
  93. -- else
  94. -- uart.write(1, "写入数据失败")
  95. -- end
  96. -- log.info("i2c 请求电压",result1)
  97. -- uart.write(1, "充电协议:"..data1:toHex())
  98. -- uart.write(1, "可用最大电流:"..data2:toHex())
  99. local reg2_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_reg1, 1)
  100. local reg2_temp = (reg2_data == "") and 0x00 or string.byte(reg2_data)
  101. local reg2_data_result = reg2_temp | 0xC0
  102. local reg2_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg1, string.char(reg2_data_result))
  103. -- local reg02_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_reg1, 1)
  104. -- uart.write(1, "\nreg02:"..reg02_data:toHex().."\n")
  105. local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x44))
  106. while true do
  107. sys.wait(3000)
  108. for i = 0, 20 do
  109. -- if i == 14 then -- 读取VBAT电压值
  110. -- -- local reg09_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_reg2, 1)
  111. -- -- local reg09_data_temp = string.byte(reg2_data)
  112. -- -- local reg09_data_result = 0x64
  113. -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x64))
  114. -- sys.wait(500)
  115. -- local data = i2c.readReg(i2c_id, bq25895_addr, i, 1)
  116. -- local voltage = string.toValue(data)
  117. -- uart.write(1, "寄存器14状态,"..i..":"..data:toHex().." "..voltage.."\n")
  118. -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x44))
  119. -- sys.wait(500)
  120. -- end
  121. -- local data = i2c.readReg(i2c_id, bq25895_addr, i, 1)
  122. -- uart.write(1, "寄存器状态,"..i..":"..data:toHex().."\n")
  123. end
  124. uart.write(1, "连通状态下:\n")
  125. get_value()
  126. -- sys.wait(1000)
  127. -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x64))
  128. -- sys.wait(5000)
  129. -- uart.write(1, "断开状态下:\n")
  130. -- get_value()
  131. -- sys.wait(1000)
  132. -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x44))
  133. end
  134. end
  135. )
  136. -- local bq25895_wrong = 0x0C
  137. -- local bq25895_wdt = 0x03
  138. -- local bq25895_wdt_reg = 0x07
  139. -- local reg02_addr = 0x02
  140. -- local reg0d_addr = 0x0d
  141. -- local wrong_state = i2c.readReg(i2c_id, bq25895_addr, bq25895_wrong, 1)
  142. -- uart.write(1, "错误寄存器状态:"..wrong_state:toHex())
  143. -- local wdt_reg_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_wdt_reg, 1)
  144. -- local wdt_data = string.byte(wdt_reg_data)
  145. -- local wdt_data_result = wdt_data & ~(0x30)
  146. -- local wdt_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_wdt_reg, string.char(wdt_data_result))
  147. -- local reg2_data = i2c.readReg(i2c_id, bq25895_addr, reg02_addr, 1)
  148. -- local reg2_temp = string.byte(reg2_data)
  149. -- local reg2_data_result = (reg2_temp | 0xC0) & 0xFE
  150. -- local reg2_result = i2c.writeReg(i2c_id, bq25895_addr, reg02_addr, string.char(reg2_data_result))
  151. -- local reg02_data = i2c.readReg(i2c_id, bq25895_addr, reg02_addr, 1)
  152. -- uart.write(1, "reg02:"..reg02_data:toHex())
  153. -- local regd_data_result = 0x46
  154. -- local regd_result = i2c.writeReg(i2c_id, bq25895_addr, reg0d_addr, string.char(regd_data_result))
  155. -- function set_IINDPM(iindpm_setting)
  156. -- local IINDPM_REGISTER = 0x00 -- 输入电流限制寄存器REG00
  157. -- local IINLIM_MASK = 0x3F -- IINLIM位掩码(Bit5~Bit0)
  158. -- local IINDPM_OFFSET = 0.100 -- 偏移量:100mA
  159. -- local IINDPM_SIZE = 0.050 -- 步长:50mA
  160. -- local reg_val = i2c.readReg(i2c_id, bq25895_addr, IINDPM_REGISTER, 1)
  161. -- reg_val = string.byte(reg_val)
  162. -- local reg_val_temp = reg_val & ~(0x3F)
  163. -- local iindpm = math.floor((iindpm_setting - IINDPM_OFFSET) / IINDPM_SIZE)
  164. -- local iindpm_temp = iindpm | reg_val_temp
  165. -- local write_ok = i2c.writeReg(i2c_id, bq25895_addr, IINDPM_REGISTER, string.char(iindpm_temp))
  166. -- -- 5. 结果反馈
  167. -- if write_ok then
  168. -- print(string.format("【成功】输入电流限制已设置为%.2fA(IINLIM值:0x%02X)", iindpm_setting, iindpm_temp))
  169. -- return true
  170. -- else
  171. -- print("【错误】写入REG00失败,配置未生效")
  172. -- return false
  173. -- end
  174. -- end
  175. -- -- 调用函数:设置输入电流限制为3.00A
  176. -- set_IINDPM(3.00)
  177. -- function set_ICHG(ichg_setting)
  178. -- local ICHG_REGISTER = 0X04
  179. -- local ICHG = 0X7F
  180. -- local ICHG_OFFSET = 0.000
  181. -- local ICHG_SIZE = 0.064
  182. -- local reg_04 = i2c.readReg(i2c_id, bq25895_addr, ICHG_REGISTER, 1)
  183. -- reg_04 = string.byte(reg_04)
  184. -- local reg_04_temp = reg_04 & ~(0x7F)
  185. -- local ichg_temp = math.floor((ichg_setting - ICHG_OFFSET) / ICHG_SIZE)
  186. -- local ichg_num = ichg_temp | reg_04_temp
  187. -- local set_ok = i2c.writeReg(i2c_id, bq25895_addr, ICHG_REGISTER, string.char(ichg_num))
  188. -- -- 5. 结果反馈
  189. -- if set_ok then
  190. -- print(string.format("【成功】(寄存器ICHG值:0x%02X)", ichg_num))
  191. -- return true
  192. -- else
  193. -- print("【错误】写入REG04失败,配置未生效")
  194. -- return false
  195. -- end
  196. -- end
  197. -- set_ICHG(5.056)