亲爱的支持团队,
我试着写一些东西到OTP。
我正在使用“otp_write_words”函数来写OTP。
我写了一些数据到地址0x7F8FDF0在我的代码如下步骤…
1.写入0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01
2.读取地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 ==>正确
3.写入0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02
4.读取地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 ==>正确,因为(0x01 | 0x02) = 0x03
然而,我发现有时这很奇怪。
我已经将数据写入OTP,但读取后变成0x00。一些字节我写0x00,但它变成了0x80。
1.写0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x11
2.读取地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x11 ==>正确
3.写0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x22 0x00
4.读取地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x22 0x00 ==>错误,应该是0x22 0x11和一个字节变成0x80??
为什么?我不知道。
经过一轮又一轮的阅读和写作,我无法从OTP上读到任何东西。
我跟踪代码,发现它卡在“hw_otpc_manual_read_on”函数的“ASSERT_WARNING_OTPC_MODE(HW_OTPC_MODE_STBY);”中。
我怎样才能恢复呢?
顺便说一下,我使用Product Line Tool来写一些数据,比如“XTAL16M振荡器的Trim Value”。
我应该写一些代码来读取它并设置值吗?
非常感谢。

嗨stanley_yeh,
您确定这是代码在您所描述的断言中结束的地方吗?如果你已经在设备的相同地址上读和写,我希望设备将结束在硬故障,而不是在任何类型的断言。被设计成提供的OTP只写一次,不是在写,机制,提供了一个错误的检测和双错误位,将导致hardfault它也提供了一种机制,可以正确的OTP 8字。综上所述,你有8个额外的单词,最大的空闲时间,你可以用它来纠正OTP的条目,在那之后你就不能了。如果在条目中有错误,它们被OTP的逻辑检测到,并且系统最终陷入硬故障,因为OTP读取中的错误会在AHB总线上产生一个错误。
由于MT_dialog
嗨MT_Dialog,
谢谢你的回复。
我确信代码以断言结束。
如果我注释掉断言,它将在读取OTP(例如memcpy(&dev_bdaddr, (uint8_t *) OTP_HDR_BDADDR_BACKUP_ADDR, sizeof(dev_bdaddr));)
抱歉,还有一个问题,如果我使用产品线工具写一些数据,如“修剪值的XTAL16M振荡器”。
我应该写一些代码来读取它并设置值吗?我找不到任何函数读取的价值在我的SDK。
非常感谢。
嗨stanley_yeh,
我已经尝试复制你正在经历的,通过遵循你的指示,我不能强迫设备在那一点上被卡住,发生断言是因为OTP不在待机模式时,你正在执行设备的读取,您可以通过内存窗口检查OTPC_MODE_REG的OTPC_MODE_MODE的值,并可能是由于前面的命令导致的。正常情况下,在执行hw_otpc_manual_read_on()之前,hw_otpc_init()函数会在HW_OTPC_MODE_STBY中设置设备。
我不太明白第二个问题,尽管,prod测试工具支持一些命令,包括修剪水晶命令(读,写,测试等),修剪水晶应该在生产期间完成,因此,您应该能够通过批处理文件使用prod_test.exe的命令,以便找到和刻录您所使用的XTAL的修剪值。
由于MT_dialog
嗨MT_dialog,
嗯,即使我使用智能片段,我也无法读取OTP中的数据。也许我做错了什么。
我已经换了另一个板,它工作得很好。我会观察这个问题,谢谢。
我为没有把我的观点表达清楚而道歉。
我的问题是,如果我使用PLT(生产线工具,不是产品测试工具,我知道,它们是不同的,对吗?)做一些校准,结果会写在OTP头,对吗?
使用PLT后,当设备启动时,ROM中的引导加载程序将代码从FLASH移动到SRAM,应用程序启动,哪个函数会从OTP读取数据并使用校准值?
在SDK中,我只发现“read_otp_header()”函数将读取OTP,但只读取bd地址,IQ修剪值和低功率时钟源。
哪个功能将读取其他数据,如修剪值为XTAL16M?
非常感谢。
嗨stanley_yeh,
生产线工具是用于量产的板,prod_test工具是GU (Golden Unit)使用的fw,是的,在OTP报头字段中有校准和烧毁修剪值或晶体的功能。当设备准备好了(在你的情况中校准值计算并应用于OTP和弗兰克-威廉姆斯在flash)和靴子,校准值最初应用于晶体修剪登记,这种functionallity通过罗橄榄球员在启动执行,而不是通过SDK如果这就是你正在寻找的。
由于MT_dialog
非常感谢。:)