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 物理区域单个字节

参数

  • Addr:待读取的 OTP 物理区域地址

  • Data:OTP 数据读取缓冲区(1 字节)

返回值

读操作结果

  • RTK_SUCCESS:成功

  • RTK_FAIL:失败

OTP_Read32

项目

描述

功能

读取 OTP 物理区域 4 字节

参数

  • Addr:待读取的 OTP 物理区域地址

  • Data:OTP 数据读取缓冲区(4 字节)

返回值

读操作结果

  • RTK_SUCCESS:成功

  • RTK_FAIL:失败

OTP_Write8

项目

描述

功能

写入 OTP 物理区域单个字节

参数

  • Addr:待写入的 OTP 物理区域地址

  • Data:待写入的 1 字节数据

返回值

写操作结果

  • RTK_SUCCESS:成功

  • RTK_FAIL:失败

OTP_LogicalRead

项目

描述

功能

按长度读取 OTP 逻辑映射区域

参数

  • pbuf:OTP 逻辑映射区域使用的缓冲区

  • addr:待读取的 OTP 逻辑映射区域起始地址

  • len:待读取的 OTP 逻辑映射区域字节长度

返回值

读操作结果

  • RTK_SUCCESS:成功

  • RTK_FAIL:失败

OTP_LogicalWrite

项目

描述

功能

按长度写入 OTP 逻辑映射区域地址

参数

  • addr:待写入的 OTP 逻辑映射区域起始地址

  • cnts:待写入的 OTP 逻辑映射区域字节长度

  • data:待写入的数据

返回值

写操作结果

  • RTK_SUCCESS:成功

  • RTK_FAIL:失败

OTP_LogicalGetRemain

项目

描述

功能

获取逻辑映射区域中 OTP 剩余可用长度

参数

返回值

剩余可用长度

OTP_SetCRC

项目

描述

功能

设置安全区域的 CRC 校验值

参数

返回值

操作结果

  • RTK_SUCCESS:成功

  • RTK_FAIL:失败

OTP API 使用方法

逻辑区域

如果编程地址在 系统数据区域(0x000-0x01F) ,参考 系统数据区域 处理。

如果地址不在系统数据区域,假设要将逻辑地址 0x22[1] 的值编程为 1,按以下步骤操作:

  1. 读取逻辑地址 0x22 的原始值,并检查函数返回值。

    u8 data_read;
    int ret;
    ret = OTP_LogicalRead(&data_read, 0x22, 1);
    
  2. 假设步骤 1 中读取的逻辑地址 0x22 数据为 0xA0 。将 0xA0 与目标位 0x22[1] 的值进行或操作,其余数据保持默认值。所以新写入的值为 0xA2

  3. 写入新值 0xA2 到逻辑地址 0x22,并检查函数返回值。

    u8 data_written = 0xA2;
    int ret;
    ret = OTP_LogicalWrite(0x22, 1, &data_written);
    
  4. 再次读取逻辑地址 0x22 的值,检查是否写入成功。

小心

编程系统数据区域(0x000-0x01F)时,参考 系统数据区域 处理,否则可能导致错误编程!

物理区域

将物理地址 0x02[1] 的值编程为 0,按以下步骤操作:

  1. 读取物理地址 0x02 的原始值, 并检查返回值。

    u8 data_read;
    int ret;
    ret = OTP_Read8(0x2, &data_read);
    
  2. 假设步骤 1 中读取的物理地址 0x02 数据为 0xAF。将 0xAF 与目标位 0x02[1] 的值进行与操作,其余数据保持默认值。所以新写入的值为 0xAD

  3. 写入新值 0xAD 到物理地址 0x02,并检查返回值。

    u8 data_written = 0xAD;
    int ret;
    ret = OTP_Write8(0x2, data_written);
    
  4. 再次读取物理地址 0x02 的值,检查是否写入成功。

OTP 串口编程

可通过串口对 OTP 的物理区域和逻辑区域编程。

逻辑区域

通过以下命令可以对逻辑区域进行读写操作。

操作

命令

描述

AT+OTP=RMAP

读取整个逻辑区域

AT+OTP=WMAP,<address>,<length>,<data>

写入到逻辑区域的指定地址

  • address:待写入的起始逻辑地址(十六进制)

  • length: 待写入数据的字节数(十六进制)

  • data:待写入的数据(十六进制)

备注

待写入数据的字符串长度必须为偶数,且不能带前缀 0x

如果编程地址在 系统数据区域(0x000-0x01F) ,参考 系统数据区域 处理。

如果地址不在系统数据区域,假设要将逻辑地址 0x22[1] 的值编程为 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
    ...
    
  2. 假设步骤 1 中读取的逻辑地址 0x22 数据为 0xA0。将 0xA0 与目标位 0x22[1] 的值进行或操作,其余数据保持默认值。所以新写入的值为 0xA2

  3. 写入新值 0xA2 到逻辑地址 0x22。

    AT+OTP=WMAP,0x22,0x1,A2
    [ATCMD_OTP-I] efuse wmap write len:1, string len:2
    
  4. 再次读取数据以验证写入是否成功。

    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>

写入到物理区域的指定地址

  • address:待写入的起始物理地址(十六进制)

  • length: 待写入数据的字节数(十六进制)

  • data:待写入的数据(十六进制)

备注

待写入数据的字符串长度必须为偶数,且不能带前缀 0x

将物理地址 0x02[1] 的值编程为 0,按以下步骤操作:

  1. 读取物理映射,检查物理地址 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
    ...
    
  2. 假设步骤 1 中读取的物理地址 0x02 数据为 0xAF。将 0xAF 与目标位 0x02[1] 的值进行与操作,其余数据保持默认值。所以新写入的值为 0xAD

  3. 写入新值 0xAD 到物理地址 0x02。

    AT+OTP=WRAW,0x2,0x1,AD
    [ATCMD_OTP-I] efuse wraw write len:1, string len:2
    wraw: 2 ad
    
  4. 再次读取数据以验证写入是否成功。

    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 编程。