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.

OTP能不能理解成一块不能擦除的FLASH?

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好像没有?
  • 不是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吧?
    名字 One-Time Program有一定误导性,实际上OTP是可以多次编程的,只不过不能擦除而已。
    由于C2000没有内部的唯一 ID,我本来相在OTP写入一个UUID作为器件的唯一ID,希望这个ID写入一次就不能修改了,现在看实际上还是可以修改的。

  • 你把onetime编程看着针对bit理解就OK了。

  • 你的理解还是比较深刻的,C2000的OTP是一块不能擦除的FLASH,可以多次编程,使用FlashAPI,所以第二种理解完全正确。

  • 对于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就说明有二次改写。

    这样可以最大限度确保你的编码不出问题。出了问题也可以及时发现。

    :-)

  • 加16位的CRC校验就可以了。实际中eeprom中存储数据经常这么用。