This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ27220:不带 bqstudio 的 OTP 编程

Guru**** 2388220 points
Other Parts Discussed in Thread: BQ27220, BQSTUDIO
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1392506/bq27220-otp-program-without-bqstudio

器件型号:BQ27220
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、但未使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于数据存储器更新(适用于 RAM 中的数据、而不是 OTP -至少适用于写入)、更新 OTP 的过程比 TRM 中所述的过程更复杂。

    导出 Golden Image 时、您必须从 bqStudio 生成的.ot.fs 文件重新创建命令。 bqStudio 将根据通过 bqStudio 数据存储器视图编程到 RAM 中的配置、创建用于对 OTP 进行编程的命令。

    此.ot.fs 文件中的注释表示系统需要施加 OTP 编程电压的时间、因此您必须在.ot.fs 文件中这些注释之后的代码中添加控制逻辑。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dominik:

    您能否提供用于更新 OTP 存储器的.ot.fs 文件。 我们没有 bqStudio 生成黄金映像所需的硬件。 它们可以在演示模式下从 bqStudio 获取.ot.fs 文件、也可以在没有硬件的情况下获取。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果没有 bq27220 EVM、bqStudio 无法生成此.ot.fs 文件、因为它需要从电量计读取图像数据。 在没有硬件的情况下、无法在演示模式下生成此信号。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dominik:

    您能否提供用于更新 OTP 寄存器的.ot.fs 文件。

    我得到它们在该过程中需要7.4v 的编程电压、但您能指定它需要在哪个步骤提供、以及原理图中的路径和引脚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    bqStudio 生成的.ot.fs 文件包含何时施加编程电压的指令。 下面附上了一个示例。 该文件的生成很重要(没有 bqStudio 和 EVM 就无法轻松完成此操作)。 bqStudio 与 EVM 在 required.e2e.ti.com/.../0220_5F00_0_5F00_03_2D00_bq27220.ot.fs 中

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dominik:

    我有3个疑问、

    1.数据表中给出了 BAT 引脚的最大额定电压6V  

    它将如何处理该过程所必需的7.4V OTP 编程电压。

    2.这里是我们的定制电路板上的 BQ27220 IC 原理图。

      

    如果 IC 能够处理该7.4电压、我们如何在该原理图中为其提供7.4电压。

    在您共享的.ot.fs 文件中、在进入 ROM 模式后、器件地址如何从 AA 更改为16。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1:OTP 电压一定不能被施加到 BAT 上。 它被应用于 GPOUT。 数据表的限制不适用于此特定编程模式。

    2:您必须添加一个测试点或跳线/接头、以便将 GPOUT 临时连接到 OTP 编程电压(并将其与您的系统断开)。

    3:该命令指示电量监测计停止运行电量监测固件、并更改为 ROM 中用于对 OTP: W:AA 00 0F 进行编程的另一个固件。 电量监测计在0xAA 上停止响应、并使用0x16作为该命令之后的器件地址。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dominik:

    感谢您清除我们的疑虑、我能够将 OTP 配置文件1更改为您共享的.ot.fs 文件中提及的默认值。

    现在我要对其进行修改、以设置 FCC = 0x1770、DCAP = 0x1b58且电池低电量%= 0x00。

    您能告诉我们如何修改.ot.fs 文件中的代码才能进行此操作吗? 或者、如果可能、您可以与这些更改共享.ot.fs 文件。

    此外、我们可以更改每个 OTP 曲线多少次。 我们如何更改其他曲线、而不是仅更改 OTP 曲线1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对 OTP 进行编程的命令的文档并非公开的。 我不能在 E2E 上分享这个。

    该电量监测计的官方开发流程基于 bqStudio 和电量监测计 EVM。 我们的想法是您将使用 bqStudio、EVM、电池和系统测试电量计配置(例如、在您的系统和电池之间为 EVM 打补丁)、一旦此功能运行良好、bqStudio 将以.ot.fs 文件中的设置导出以进行生产。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一旦对默认 OTP 曲线进行编程、就无法更改该曲线。 您可以无限次地使用 SET_PROFILE_X 命令(这些命令将所选配置文件的 OTP 内容复制到 RAM 中、因此对次数没有限制)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dominik:
    我们已将 OTP 更改为自定义值。 您能告诉我我们可以为轮廓区域编程多少次吗? 我们能够再次对其进行更改、但它没有更新到我们想要的值。 此外、您能否指导我们如何在 OTP 中对配置文件2或3进行编程?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您可以逐位将这些值从0更改为1。 例如、您可以将值编程为0x02、然后您可以将相同的参数重新编程为0x03或0x0A、但不能是0x00或0x08。 因此、重写次数取决于程序的值。 这可能是0或相当大的数字。

    请在 TRM https://www.ti.com/lit/ug/sluubd4a/sluubd4a.pdf:中查看8.3.2

    对 OTP 曲线1进行编程:1. 使用所需的值填写 RAM 中的"CEDV Profile 1"部分。 2.为"CEDV Profile Select"→"Battery ID"写入4。 对 OTP 曲线2进行编程:1. 使用所需的值填写 RAM 中的"CEDV Profile 1"部分。 2.为"CEDV Profile Select"→"Battery ID"写入8。 对 OTP 曲线3进行编程:1. 使用所需的值填写 RAM 中的"CEDV Profile 1"部分。 2.为"CEDV Profile Select"→"Battery ID"写入16。