亲爱的支持团队,
我正在尝试写一些东西到OTP。
我使用函数“otp_write_words”来写OTP。
我在代码中按照以下步骤将一些数据写到地址0x7F8FDF0中……
1.写0x00 0x00 0x00 0x00 0x00 0x00 0x00
2.读地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 ==>正确
3.写0x00 0x00 0x00 0x00 0x00 0x00 0x00
4.读地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 ==>正确,因为(0x01 | 0x02) = 0x03
然而,我发现有时这很奇怪。
我已经把数据写进了OTP,但是读了之后变成了0x00。一些字节,我写的是0x00,但它变成了0x80。
1.写0x00 0x00 0x00 0x00 0x00 0x00 0x00
2.读地址,得到0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x11 ==>正确
3.写0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
4.读地址,得到0x00 0x00 0x00 0x00 0x80 0x22 0x00 ==>不正确,它应该是0x22 0x11和一个字节变成0x80?
为什么?我不知道。
经过几轮的阅读和写作,我还是读不懂OTP。
我跟踪了代码,发现它卡在了“ASSERT_WARNING_OTPC_MODE(HW_OTPC_MODE_STBY);”的“hw_otpc_manual_read_on”函数。
我怎样才能找回它?
顺便说一下,我用产品线工具写了一些数据,如“XTAL16M振荡器的修剪值”。
我应该写一些代码来读取它并设置值吗?
非常感谢。
嗨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_MODE OTPC_MODE_REG和原因,或许是由于前一个命令。通常,在执行hw_otpc_manual_read_on()之前,hw_otpc_init()函数在HW_OTPC_MODE_STBY中设置设备。
我不明白第二个问题,推动测试工具支持一些命令,包括晶体的修剪命令(读、写、测试等),水晶的修剪应在生产过程中完成的,所以你应该能够使用的命令prod_test.exe通过批处理文件来找到并把削减晶体有使用价值。
由于MT_dialog
嗨MT_dialog,
嗯,即使我使用smartsnippets,我也不能在OTP中读取数据。也许我做错了什么。
我换了另一块板,效果很好。我会注意这个问题的,谢谢。
我很抱歉没有把我的观点讲清楚。
我的问题是,如果我使用PLT(生产线工具,不是prod测试工具,我知道它们是不同的,对吧?)做一些校准,结果会写在OTP头,对吧?
使用PLT后,设备启动后,ROM中的bootloader将代码从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
非常感谢。:)