Thread 中讨论的其他器件: BQSTUDIO
工具与软件:
我们要更新 FCC、DCAP 和 Battery LOW%的 OTP 寄存器。 我们已经执行了 BQ27220 Ic 的 TRM 中的6.1数据存储器参数更新示例中提到的步骤。 其显示的值为0x00、即使相应地更改了电池 ID 后、它们也不会产生影响。 您能告诉我们应遵循的正确步骤吗? 我们使用以下脚本写入它。
#!/bin/bash echo "Reading 0x3a/3b Reg..." sleep 1 value_3a=$(i2cget -y 0 0x55 0x3a b) sleep 1 value_3b=$(i2cget -y 0 0x55 0x3b b) echo "Value at register address 0x3a: $value_3a" echo "Value at register address 0x3b: $value_3b" operation_status=$(i2cget -y 0 0x55 0x3a) SEC1=$(($operation_status >> 2 & 1)) SEC0=$(($operation_status >> 1 & 1)) #if already in Unseal if [ $SEC1 -eq 1 ] && [ $SEC0 -eq 0 ]; then echo "Device already in UNSEAL IF BLOCK" echo "Reading 0x3a/3b Reg..." sleep 1 value_3a=$(i2cget -y 0 0x55 0x3a b) sleep 1 value_3b=$(i2cget -y 0 0x55 0x3b b) echo "Value at register address 0x3a: $value_3a" echo "Value at register address 0x3b: $value_3b" elif [ $SEC1 -eq 0 ] && [ $SEC0 -eq 1 ]; then echo "Device already in FULL ACCESS ELSE IF BLOCK" sleep 1 value_3a=$(i2cget -y 0 0x55 0x3a b) sleep 1 value_3b=$(i2cget -y 0 0x55 0x3b b) echo "Value at FA 0x3a: $value_3a" echo "Value at FA 0x3b: $value_3b" else echo "STEP 1" echo "Sending UNSEAL command...ELSE BLOCK" i2cset -y 0 0x55 0x00 0x14 b sleep 2 i2cset -y 0 0x55 0x01 0x04 b sleep 2 i2cset -y 0 0x55 0x00 0x72 b sleep 2 i2cset -y 0 0x55 0x01 0x36 b sleep 2 value_3a=$(i2cget -y 0 0x55 0x3a b) sleep 1 value_3b=$(i2cget -y 0 0x55 0x3b b) echo "Value at US 0x3a: $value_3a" echo "Value at US 0x3b: $value_3b" fi echo "STEP 2" echo "Getting FULL ACCESS..." i2cset -y 0 0x55 0x00 0xFF b sleep 1 i2cset -y 0 0x55 0x01 0xFF b sleep 1 i2cset -y 0 0x55 0x00 0xFF b sleep 1 i2cset -y 0 0x55 0x01 0xFF b sleep 1 echo "Reading Operation Status" sleep 5 value_3a=$(i2cget -y 0 0x55 0x3a b) sleep 5 value_3b=$(i2cget -y 0 0x55 0x3b b) echo "Value at register address 0x3a: $value_3a" echo "Value at register address 0x3b: $value_3b" #### Entering into Config Update ##### echo "STEP 3" echo "Entering configuration update mode..." sleep 2 i2cset -y 0 0x55 0x00 0x90 b sleep 2 i2cset -y 0 0x55 0x01 0x00 b echo "STEP 4" #Polling OperationStatus register until bit 2 is set, with a try limit of 100 times #try=0 #max_try=100 echo "Polling OperationStatus register for CFGUPDATE bit2..." operation_status=$(i2cget -y 0 0x55 0x3b) while [ $((operation_status & 0x04)) -eq 0 ]; do echo "Waiting for config update...." sleep 2 # Add a sleep to avoid high CPU usage in the loop done echo "CFGUPDATE mode confirmed." sleep 3 echo "Reading Operation Status" sleep 5 value_3a=$(i2cget -y 0 0x55 0x3a b) sleep 5 value_3b=$(i2cget -y 0 0x55 0x3b b) echo "Value at register address 0x3a: $value_3a" echo "Value at register address 0x3b: $value_3b" operation_status=$(i2cget -y 0 0x55 0x3a) SEC1=$(($operation_status >> 2 & 1)) SEC0=$(($operation_status >> 1 & 1)) if [ $SEC1 -ne 0 ] && [ $SEC0 -ne 1 ];then echo "Getting FULL ACCESS..." i2cset -y 0 0x55 0x00 0xFF b sleep 5 i2cset -y 0 0x55 0x01 0xFF b sleep 5 i2cset -y 0 0x55 0x00 0xFF b sleep 2 i2cset -y 0 0x55 0x01 0xFF b sleep 2 else echo "Else" fi ###### Design Capacity ######## echo "STEP 5" echo "FCC OTP Update" i2cset -y 0 0x55 0x3e 0xe9 b sleep 1 i2cset -y 0 0x55 0x3f 0x40 b sleep 1 i2cset -y 0 0x55 0x40 0x17 b sleep 1 i2cset -y 0 0x55 0x41 0x70 b sleep 1 echo "Design capacity COMMAND END." echo "STEP 6" result=$(( (0xff - (0x40 + 0xe9 + 0x17 + 0x70)) & 0xff )) # Print the result printf "0x%x\n" $result echo "The output of checksum is : $result" echo "STEP 7" i2cset -y 0 0x55 0x60 $result sleep 2 i2cset -y 0 0x55 0x61 0x06 sleep 2 echo "STEP 8" i2cset -y 0 0x55 0x00 0x91 sleep 2 i2cset -y 0 0x55 0x01 0x00 sleep 2 echo "Exit config Update" i2cset -y 0 0x55 0x00 0x14 b sleep 1 i2cset -y 0 0x55 0x01 0x04 b sleep 1 i2cset -y 0 0x55 0x00 0x72 b sleep 1 i2cset -y 0 0x55 0x01 0x36 b sleep 1 echo "UNSEAL process completed."
我们还尝试使用 ot.fs 文件根据8.3.2更改电池 ID、但未使用。