USER GUIDE / SECURITY / EFUSE / PROCESS
流程
程序EFUSE 流程
写 otp 只有一种模式,即寄存器写模式。你应该配置 ctrl[28:21],这是要写入内容的第一位地址。然后, 代码将自动写入所有位,但在此之前,您应已将数据写入数据寄存器。
第一步:将想要的编程数据写入 EFUDATA 寄存器;
第二步:设置控制寄存器,指示要编程的地址和数据长度;
第三步:根据当前时钟频率设置配置寄存器。EFUSE 控制器默认支持 200Mhz,其他时钟频率需要根 据公式计算出合适的 WR_ADJ 和 WR_STROBE 调整时序;
举例:假设当前时钟频率为 210Mhz,一个时钟周期为 4.76ns。(772+WR_ADJ*2+1)*4 >=3800ns, 算出 WR_ADJ 为 13;10800ns<=(2400+WR_ADJ+WR_STROBE)*4.76<=13200ns,算出 WR_STROBE 为-144~360,受 WR_STROBE 位宽的限制,WR_STROBE 范围在-144~256。
第四步:连接 AVDD 管脚到 1.8V;
第五步:等待 1us;
第六步:将控制寄存器 WR_EN 位写 1;
第七步:等待状态寄存器 WR_DONE 变为 1,并写零清除;
第八步:将 AVDD 管脚的 1.8V 断开。
- 在 EFUSE 程序启动前,不要过早对 AVDD 预充电。向 AVDD 提供 1.8V 电压的最大时间必须严格控制在 1 秒以内。
- 如果要写入第 2 段(Protection),第 3 段(Special Function)、第 4 段(Protection Bak)、第 10 段(PSRAM_INIT_PROT)和第 37 段(Special Function),你应该在配置 EFUCFG 寄存器之前配置 EFUSPEEN 寄存器。在写完后,将其读出来相应信号才会生效,注意在读出来之前也要配置 EFUSPEEN 寄存器。
- 如果在写第 2 段时想要将相同的数据写入第 4 段,那么在步骤三,你需要去配置 EFUCTRL.Redn 为 1。
- 不可跨段写入。
读取EFUSE 流程
读取 otp 有两种模式,一种是寄存器读模式,另一种是通过 AHB 映射读模式。寄存器读模式:应配 置 ctrl[28:21],这是要读取数据的第一位地址。然后控制器将自动读取所有位。您可以读取数据寄存器来获 取读数据。AHB 映射读模式: EFUSE 2048 位映射到芯片内存地址,从 0x13540200 到 0x135402FF。
例如:如果要读取第 2 段,其映射地址为 0x20C,则可以读取 0x1354020C 的地址。
以下为寄存器读模式的配置要求。
第一步:设置控制寄存器,指示要读的地址和数据长度;
第二步:根据当前时钟频率设置配置寄存器。EFUSE 控制器默认支持 24Mhz,其他时钟频率需要根据 公式计算出合适的 RD_ADJ 和 RD_STROBE 调整时序;
假设当前时钟频率为 210Mhz, (101+RD_ADJ + 1)*4.76>=500ns,算出 RD_ADJ 至少为 3;(1 02+RD_ADJ+RD_STROBE+1)*4.76>=500ns,算出 RD_STROBE 至少为 0。
第三步:将控制寄存器 RD_EN 位写 1,并写零清除;
第四步:等待状态寄存器 RD_DONE 设置为 1 或 EFUSE 中断,软件应用程序即可读取 EFUDATA 寄存器。
- 芯片复位时,EFSUE 控制器将自动读取 第 1、2、3、4、10、37 段,并更新 EFUSE 状态寄存器。若保护段中 UKEY_RST_RD 为 0,自动读取完上述段后,还会读取 OS KEY 和 User Key 段。
- 第 2/3/4/10/37 段的信号被写 1 后,需执行一次寄存器读或映射读操作将信号加载到控制器内部寄 存器,才可以实现保护或使能作用。
注意事项
- 特殊的,控制器在复位释放后会自动读取 EFUSE,在 BOOTROM 阶段用户要等到 RD_DONE 为 1 才可以对 EFUSE 进行读写控制,否则会出现不可预测的错误。
- EFUSE 的读写不能同时进行。
- AES 直通读取 EFUSE,和 EFUSE 控制器直接读写 EFUSE 不能同时进行。也就是说在 AES 直 通读取 EFUSE 时,如果此时用户要用控制器读写 EFUSE 一定要等到 AES 直通读取结束;在用控制器读 写 EFUSE 时,如果此时用户要用 AES 直通读取 EFUSE 一定要等到控制器读写结束。