local i2c_id = 1 local ch224q_i2c_addr = 0x22 -- 受电分析芯片I2C地址 local ch224q_i2c_reg1 = 0x09 -- 快充协议激活情况(只读) local ch224q_i2c_reg2 = 0x0A -- 电压请求(只写,0:5V 1:9V 2:12V 3:15V 4:20V 5:28V) local ch224q_i2c_reg3 = 0x50 -- 最大电流参考值(只写,该寄存器仅PD协议有效) local bq25895_addr = 0x6A -- 充电芯片I2C地址 local bq25895_reg1 = 0x02 -- 控制ADC检测开关 local bq25895_reg2 = 0x09 -- bit5位可以控制VSYS到VBAT的通路开关(默认0导通,1关闭) local reg_addr_ADCCTL = 0x02 local reg_addr_BATV = 0x0E local reg_addr_SYSV = 0x0F local reg_addr_TSPCT = 0x10 local reg_addr_VBUSV = 0x11 local reg_addr_ICHGR = 0x12 local reg_addr_ICO = 0x13 local function get_value() local ret_val_BATV = i2c.readReg(i2c_id, bq25895_addr, reg_addr_BATV, 1) local ret_val_SYSV = i2c.readReg(i2c_id, bq25895_addr, reg_addr_SYSV, 1) local ret_val_TSPCT = i2c.readReg(i2c_id, bq25895_addr, reg_addr_TSPCT, 1) local ret_val_VBUSV = i2c.readReg(i2c_id, bq25895_addr, reg_addr_VBUSV, 1) local ret_val_ICHGR = i2c.readReg(i2c_id, bq25895_addr, reg_addr_ICHGR, 1) local ret_val_ICO = i2c.readReg(i2c_id, bq25895_addr, reg_addr_ICO, 1) local byte_BATV = (ret_val_BATV == "") and 0x00 or string.byte(ret_val_BATV) local byte_SYSV = (ret_val_SYSV == "") and 0x00 or string.byte(ret_val_SYSV) local byte_TSPCT = (ret_val_TSPCT == "") and 0x00 or string.byte(ret_val_TSPCT) local byte_VBUSV = (ret_val_VBUSV == "") and 0x00 or string.byte(ret_val_VBUSV) local byte_ICHGR = (ret_val_ICHGR == "") and 0x00 or string.byte(ret_val_ICHGR) local byte_ICO = (ret_val_ICO == "") and 0x00 or string.byte(ret_val_ICO) local s_BATV = (ret_val_BATV == "") and "nil" or string.format("%02X", byte_BATV) local s_SYSV = (ret_val_SYSV == "") and "nil" or string.format("%02X", byte_SYSV) local s_TSPCT = (ret_val_TSPCT == "") and "nil" or string.format("%02X", byte_TSPCT) local s_VBUSV = (ret_val_VBUSV == "") and "nil" or string.format("%02X", byte_VBUSV) local s_ICHGR = (ret_val_ICHGR == "") and "nil" or string.format("%02X", byte_ICHGR) local s_ICO = (ret_val_ICO == "") and "nil" or string.format("%02X", byte_ICO) local value_BATV = (byte_BATV == 0x00) and 0x00 or ((byte_BATV & 0x7F) * 20 + 2304) local value_SYSV = (byte_SYSV == 0x00) and 0x00 or ((byte_SYSV & 0x7F) * 20 + 2304) local value_TSPCT = (byte_TSPCT == 0x00) and 0x00 or ((byte_TSPCT & 0x7F) * 0.465 + 21) local value_VBUSV = (byte_VBUSV == 0x00) and 0x00 or ((byte_VBUSV & 0x7F) * 100 + 2600) local value_ICHGR = (byte_ICHGR == 0x00) and 0x00 or ((byte_ICHGR & 0x7F) * 50) local value_ICO = (byte_ICO == 0x00) and 0x00 or ((byte_ICO & 0x3F) * 50 + 100) local value_Pin = 0 local s_Pin = "nil" if (ret_val_VBUSV ~= "") and (ret_val_ICO ~= "") then value_Pin = value_VBUSV * value_ICO / 1000 s_Pin = string.format("%.1fmW", value_Pin) else value_Pin = 0 s_Pin = "nil" end local value_Pchgr = 0 local s_Pchgr = "nil" if (ret_val_BATV ~= "") and (ret_val_ICHGR ~= "") then value_Pchgr = value_BATV * value_ICHGR / 1000 s_Pchgr = string.format("%.1fmW", value_Pchgr) else value_Pchgr = 0 s_Pchgr = "nil" end local dbg_info_s1 = "" dbg_info_s1 = string.format("%02X=%s, %02X=%s, %02X=%s, %02X=%s, %02X=%s, %02X=%s=%dmA\n", reg_addr_BATV, s_BATV, reg_addr_SYSV, s_SYSV, reg_addr_TSPCT, s_TSPCT, reg_addr_VBUSV, s_VBUSV, reg_addr_ICHGR, s_ICHGR, reg_addr_ICO, s_ICO,value_ICO ) dbg_info_s1 = dbg_info_s1 .."\n" dbg_info_s1 = dbg_info_s1..string.format("iBat=%dmV;", value_BATV) dbg_info_s1 = dbg_info_s1..string.format("Sys=%dmV;", value_SYSV) dbg_info_s1 = dbg_info_s1..string.format("TS=%.2f%%;", value_TSPCT) dbg_info_s1 = dbg_info_s1..string.format("Bus=%dmV;", value_VBUSV) dbg_info_s1 = dbg_info_s1..string.format("Chg=%dmA;", value_ICHGR) dbg_info_s1 = dbg_info_s1 .."\n" -- dbg_info_s1 = dbg_info_s1.."iccid:"..(mobile.iccid() or "N/A")..";" -- dbg_info_s1 = dbg_info_s1.."imei:"..(mobile.imei() or "N/A")..";\n" -- dbg_info_s1 = dbg_info_s1.."csq:"..(mobile.csq() or "N/A") -- dbg_info_s1 = dbg_info_s1..";rssi:"..(mobile.rssi() or "N/A") -- dbg_info_s1 = dbg_info_s1..";rsrq:"..(mobile.rsrq() or "N/A") -- dbg_info_s1 = dbg_info_s1..";rsrp:"..(mobile.rsrp() or "N/A") -- dbg_info_s1 = dbg_info_s1..";snr:"..(mobile.snr() or "N/A") uart.write(1, dbg_info_s1) end sys.taskInit(function() sys.wait(200) local result = i2c.setup(i2c_id,i2c.SLOW) log.info("i2c 1", "setup", result) -- local data1 = i2c.readReg(i2c_id, ch224q_i2c_addr, ch224q_i2c_reg1, 1) -- local data2 = i2c.readReg(i2c_id, ch224q_i2c_addr, ch224q_i2c_reg3, 1) -- local result1 = i2c.writeReg(i2c_id, ch224q_i2c_addr, ch224q_i2c_reg2, string.char(0x01)) -- if result1 then -- uart.write(1, "成功写入数据") -- else -- uart.write(1, "写入数据失败") -- end -- log.info("i2c 请求电压",result1) -- uart.write(1, "充电协议:"..data1:toHex()) -- uart.write(1, "可用最大电流:"..data2:toHex()) local reg2_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_reg1, 1) local reg2_temp = (reg2_data == "") and 0x00 or string.byte(reg2_data) local reg2_data_result = reg2_temp | 0xC0 local reg2_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg1, string.char(reg2_data_result)) -- local reg02_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_reg1, 1) -- uart.write(1, "\nreg02:"..reg02_data:toHex().."\n") local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x44)) while true do sys.wait(3000) for i = 0, 20 do -- if i == 14 then -- 读取VBAT电压值 -- -- local reg09_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_reg2, 1) -- -- local reg09_data_temp = string.byte(reg2_data) -- -- local reg09_data_result = 0x64 -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x64)) -- sys.wait(500) -- local data = i2c.readReg(i2c_id, bq25895_addr, i, 1) -- local voltage = string.toValue(data) -- uart.write(1, "寄存器14状态,"..i..":"..data:toHex().." "..voltage.."\n") -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x44)) -- sys.wait(500) -- end -- local data = i2c.readReg(i2c_id, bq25895_addr, i, 1) -- uart.write(1, "寄存器状态,"..i..":"..data:toHex().."\n") end uart.write(1, "连通状态下:\n") get_value() -- sys.wait(1000) -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x64)) -- sys.wait(5000) -- uart.write(1, "断开状态下:\n") -- get_value() -- sys.wait(1000) -- local reg09_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_reg2, string.char(0x44)) end end ) -- local bq25895_wrong = 0x0C -- local bq25895_wdt = 0x03 -- local bq25895_wdt_reg = 0x07 -- local reg02_addr = 0x02 -- local reg0d_addr = 0x0d -- local wrong_state = i2c.readReg(i2c_id, bq25895_addr, bq25895_wrong, 1) -- uart.write(1, "错误寄存器状态:"..wrong_state:toHex()) -- local wdt_reg_data = i2c.readReg(i2c_id, bq25895_addr, bq25895_wdt_reg, 1) -- local wdt_data = string.byte(wdt_reg_data) -- local wdt_data_result = wdt_data & ~(0x30) -- local wdt_result = i2c.writeReg(i2c_id, bq25895_addr, bq25895_wdt_reg, string.char(wdt_data_result)) -- local reg2_data = i2c.readReg(i2c_id, bq25895_addr, reg02_addr, 1) -- local reg2_temp = string.byte(reg2_data) -- local reg2_data_result = (reg2_temp | 0xC0) & 0xFE -- local reg2_result = i2c.writeReg(i2c_id, bq25895_addr, reg02_addr, string.char(reg2_data_result)) -- local reg02_data = i2c.readReg(i2c_id, bq25895_addr, reg02_addr, 1) -- uart.write(1, "reg02:"..reg02_data:toHex()) -- local regd_data_result = 0x46 -- local regd_result = i2c.writeReg(i2c_id, bq25895_addr, reg0d_addr, string.char(regd_data_result)) -- function set_IINDPM(iindpm_setting) -- local IINDPM_REGISTER = 0x00 -- 输入电流限制寄存器REG00 -- local IINLIM_MASK = 0x3F -- IINLIM位掩码(Bit5~Bit0) -- local IINDPM_OFFSET = 0.100 -- 偏移量:100mA -- local IINDPM_SIZE = 0.050 -- 步长:50mA -- local reg_val = i2c.readReg(i2c_id, bq25895_addr, IINDPM_REGISTER, 1) -- reg_val = string.byte(reg_val) -- local reg_val_temp = reg_val & ~(0x3F) -- local iindpm = math.floor((iindpm_setting - IINDPM_OFFSET) / IINDPM_SIZE) -- local iindpm_temp = iindpm | reg_val_temp -- local write_ok = i2c.writeReg(i2c_id, bq25895_addr, IINDPM_REGISTER, string.char(iindpm_temp)) -- -- 5. 结果反馈 -- if write_ok then -- print(string.format("【成功】输入电流限制已设置为%.2fA(IINLIM值:0x%02X)", iindpm_setting, iindpm_temp)) -- return true -- else -- print("【错误】写入REG00失败,配置未生效") -- return false -- end -- end -- -- 调用函数:设置输入电流限制为3.00A -- set_IINDPM(3.00) -- function set_ICHG(ichg_setting) -- local ICHG_REGISTER = 0X04 -- local ICHG = 0X7F -- local ICHG_OFFSET = 0.000 -- local ICHG_SIZE = 0.064 -- local reg_04 = i2c.readReg(i2c_id, bq25895_addr, ICHG_REGISTER, 1) -- reg_04 = string.byte(reg_04) -- local reg_04_temp = reg_04 & ~(0x7F) -- local ichg_temp = math.floor((ichg_setting - ICHG_OFFSET) / ICHG_SIZE) -- local ichg_num = ichg_temp | reg_04_temp -- local set_ok = i2c.writeReg(i2c_id, bq25895_addr, ICHG_REGISTER, string.char(ichg_num)) -- -- 5. 结果反馈 -- if set_ok then -- print(string.format("【成功】(寄存器ICHG值:0x%02X)", ichg_num)) -- return true -- else -- print("【错误】写入REG04失败,配置未生效") -- return false -- end -- end -- set_ICHG(5.056)