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、但未使用。
