This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
C2000系列都有一块1Kx16的OTP存储,顾名思义只能编程一次。
对FLASH编程的时候只能从1编程到0,同一个地址,可以先编程0xFF00,然后再编程0x0000,想要变回0xFFFF就需要擦除操作。
看了下OTP的介绍,能否将OTP理解成一块不能擦除的FLASH?
如果可以理解成为一块不能擦除的FLASH,那么会有以下特性:
1)可以使用FLASH_API来操作OTP(擦除除外)
2)OTP可以多次编程,同一个地址可以先编程0xFF00,然后再编程0x0000,其余地址以此类推,直到所有地址都变为0x0000为止
还有一种理解就是,编程必须整个1Kx16内容全部为0xFFFF,编程任意一个地址以后, 整个OTP都不能再写入。
哪一种理解是正确的呢?
OTP是一次编程,也就是对每个位bit来说,只能单向的从1变成0,无法擦除成1;因此你可以多次调用Flash API对该区域进行操作,但相应的位只能从1变成0,当所有为全变成0了,就不能进行编程了。
不是OTP API,同样用Flash API的。
The flash array and One Time Programmable (OTP) block on the device are managed via CPU execution of algorithms in the Flash API library.
对于FLASH来说,对于同一个地址,不经过擦除直接多次编程设计可以增加灵活性,我在软件中也利用了FLASH的这个特性。写入错了大不了擦除就是了。
但是对于芯片内部的OTP来说,这样设计是很不合理的。从应用角度举几个例子:
1)OTP中写入一段代码,如果再次写入修改了某些位,写入的这段代码就彻底废掉了,对应OTP不能擦除,代码又不能用,等于废掉。
2)在OTP中写入唯一数据,比如我这次的应用场合,写入一个uuid作为芯片序列号,设计本意是写入就不能修改的,但是实际上写入后OTP仍然可以继续修改,直到所有地址都是0x0000
目前我写入uuid的操作是C2000内部代码实现的,写入uuid之前我会检查整个OTP是否全部为0xFFFF,尽量保证不会重复写入OTP,软件级这样做是不可靠的,别人写一段代码依然可以修改OTP,在器件级保证整个OTP全部为0xFFFF才能写入才是最可靠的。
非常感谢你的反馈,从你的应用角度来看,这样的设计确实会带来些不方便。
只是C2000产品设计这个OTP本来主要是希望提供一个存储固定数据或固定程序的小区间,因此并没有考虑后续还会去重新写入的问题。
实际上由于OTP的操作也需要调用FlashAPI,再次写入或误操作的可能性应该是较低的,而用户主动去操作它,必然是在应用程序中可控地对它进行处理。
有的用户可能需要可以多次写入的功能,而你提到的恰恰相反,所以可能根本上这本身就不是一个好的解决方案,只能用户从自己需要的角度去灵活使用它吧。
提供一个参考办法,
你可以把需要一次写入的编号,比如唯一号码,UUID,MAC等用原码和反码写进TOP的存储器。读取后,用原码和反码进行异或运算,结果为全FF就判断为正确,非全F就说明有二次改写。
这样可以最大限度确保你的编码不出问题。出了问题也可以及时发现。
:-)