OTP 编程参考
OTP API 参考
API |
描述 |
操作区域 |
|---|---|---|
OTP_Read8 |
读取 OTP 物理区域单个字节 |
物理区域 |
OTP_Read32 |
读取 OTP 物理区域 4 个字节 |
物理区域 |
OTP_Write8 |
写入 OTP 物理区域单个字节 |
物理区域 |
OTP_LogicalRead |
按长度读取 OTP 逻辑映射区域 |
逻辑区域 |
OTP_LogicalWrite |
按长度写入 OTP 逻辑映射区域地址 |
逻辑区域 |
OTP_LogicalGetRemain |
获取逻辑映射区域中 OTP 剩余可用长度 |
逻辑区域 |
OTP_SetCRC |
设置安全区域的 CRC 校验值 |
物理区域 |
OTP_Read8
项目 |
描述 |
|---|---|
功能 |
读取 OTP 物理区域单个字节 |
参数 |
|
返回值 |
读操作结果
|
OTP_Read32
项目 |
描述 |
|---|---|
功能 |
读取 OTP 物理区域 4 字节 |
参数 |
|
返回值 |
读操作结果
|
OTP_Write8
项目 |
描述 |
|---|---|
功能 |
写入 OTP 物理区域单个字节 |
参数 |
|
返回值 |
写操作结果
|
OTP_LogicalRead
项目 |
描述 |
|---|---|
功能 |
按长度读取 OTP 逻辑映射区域 |
参数 |
|
返回值 |
读操作结果
|
OTP_LogicalWrite
项目 |
描述 |
|---|---|
功能 |
按长度写入 OTP 逻辑映射区域地址 |
参数 |
|
返回值 |
写操作结果
|
OTP_LogicalGetRemain
项目 |
描述 |
|---|---|
功能 |
获取逻辑映射区域中 OTP 剩余可用长度 |
参数 |
无 |
返回值 |
剩余可用长度 |
OTP_SetCRC
项目 |
描述 |
|---|---|
功能 |
设置安全区域的 CRC 校验值 |
参数 |
无 |
返回值 |
操作结果
|
OTP API 使用方法
逻辑区域
如果编程地址在 系统数据区域(0x000-0x01F) ,参考 系统数据区域 处理。
如果地址不在系统数据区域,假设要将逻辑地址 0x22[1] 的值编程为 1,按以下步骤操作:
读取逻辑地址 0x22 的原始值,并检查函数返回值。
u8 data_read; int ret; ret = OTP_LogicalRead(&data_read, 0x22, 1);
假设步骤 1 中读取的逻辑地址 0x22 数据为 0xA0 。将 0xA0 与目标位 0x22[1] 的值进行或操作,其余数据保持默认值。所以新写入的值为 0xA2。
写入新值 0xA2 到逻辑地址 0x22,并检查函数返回值。
u8 data_written = 0xA2; int ret; ret = OTP_LogicalWrite(0x22, 1, &data_written);
再次读取逻辑地址 0x22 的值,检查是否写入成功。
小心
编程系统数据区域(0x000-0x01F)时,参考 系统数据区域 处理,否则可能导致错误编程!
物理区域
将物理地址 0x02[1] 的值编程为 0,按以下步骤操作:
读取物理地址 0x02 的原始值, 并检查返回值。
u8 data_read; int ret; ret = OTP_Read8(0x2, &data_read);
假设步骤 1 中读取的物理地址 0x02 数据为 0xAF。将 0xAF 与目标位 0x02[1] 的值进行与操作,其余数据保持默认值。所以新写入的值为 0xAD。
写入新值 0xAD 到物理地址 0x02,并检查返回值。
u8 data_written = 0xAD; int ret; ret = OTP_Write8(0x2, data_written);
再次读取物理地址 0x02 的值,检查是否写入成功。
OTP 串口编程
可通过串口对 OTP 的物理区域和逻辑区域编程。
逻辑区域
通过以下命令可以对逻辑区域进行读写操作。
操作 |
命令 |
描述 |
|---|---|---|
读 |
AT+OTP=RMAP |
读取整个逻辑区域 |
写 |
AT+OTP=WMAP,<address>,<length>,<data> |
写入到逻辑区域的指定地址
备注 待写入数据的字符串长度必须为偶数,且不能带前缀 0x。 |
如果编程地址在 系统数据区域(0x000-0x01F) ,参考 系统数据区域 处理。
如果地址不在系统数据区域,假设要将逻辑地址 0x22[1] 的值编程为 1,按以下步骤操作:
读取逻辑映射,检查逻辑地址 0x22 的原始值。
AT+OTP=RMAP EFUSE[000]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff EFUSE[010]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff EFUSE[020]: ff ff a0 ff ff ff ff ff ff ff ff ff ff ff ff ff EFUSE[030]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ...
假设步骤 1 中读取的逻辑地址 0x22 数据为 0xA0。将 0xA0 与目标位 0x22[1] 的值进行或操作,其余数据保持默认值。所以新写入的值为 0xA2 。
写入新值 0xA2 到逻辑地址 0x22。
AT+OTP=WMAP,0x22,0x1,A2 [ATCMD_OTP-I] efuse wmap write len:1, string len:2
再次读取数据以验证写入是否成功。
AT+OTP=RMAP EFUSE[000]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff EFUSE[010]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff EFUSE[020]: ff ff a2 ff ff ff ff ff ff ff ff ff ff ff ff ff EFUSE[030]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ...
小心
编程系统数据区域(0x000-0x01F)时,参考 系统数据区域 处理,否则可能导致错误编程!
物理区域
通过以下命令可以对物理区域进行读写操作。
操作 |
命令 |
描述 |
|---|---|---|
读 |
AT+OTP=RRAW |
读取整个物理区域 |
写 |
AT+OTP=WRAW,<address>,<length>,<data> |
写入到物理区域的指定地址
备注 待写入数据的字符串长度必须为偶数,且不能带前缀 0x。 |
将物理地址 0x02[1] 的值编程为 0,按以下步骤操作:
读取物理映射,检查物理地址 0x02 的原始值。
AT+OTP=RRAW RawMap[000]: ff ff af ff ff ff ff ff ff ff ff ff ff ff ff ff RawMap[010]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff RawMap[020]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff RawMap[030]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ...
假设步骤 1 中读取的物理地址 0x02 数据为 0xAF。将 0xAF 与目标位 0x02[1] 的值进行与操作,其余数据保持默认值。所以新写入的值为 0xAD 。
写入新值 0xAD 到物理地址 0x02。
AT+OTP=WRAW,0x2,0x1,AD [ATCMD_OTP-I] efuse wraw write len:1, string len:2 wraw: 2 ad
再次读取数据以验证写入是否成功。
AT+OTP=RRAW RawMap[000]: ff ff ad ff ff ff ff ff ff ff ff ff ff ff ff ff RawMap[010]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff RawMap[020]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff RawMap[030]: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ...
备注
RF 校准工具会使用 iwpriv 命令来编程 OTP,但不建议其他工具使用该命令对 OTP 编程。