现在想直接把6个page的NV全部读出来,这样把这6个NV写到别的协调器上,岂不是实现了协调器坏掉更换新的协调器这样的需求,所有的PANID以及network key之类的不都是在NV里面存储的吗,那直接拿出来NV换到别的器件上,不就完美更换了。
通过分析源码,我们知道,CC2530F256的NV是存储在flash的第121 page处,总共6个page存储了NV信息,那么问题是,有没有办法在电脑上用SmartRF Flash Programmer读取NV呢?
1、尝试了直接读取flash到.hex文件,结果发现文件是721KB,似乎和直接编译好的.hex大小不一,不知道中间哪里出了问题?
2、SmartRF Flash Programmer似乎和SmartRF Flash Programmer 2不一样,比较简陋,没法直接读取指定地址的数据啊
VV:
1, 这个是正常的,因为读出来的时候,Flash里面没有内容的地方,都用0xFF填充了,所以hex文件会比较大。
2, SmartRF Flash Programmer只能读取整个Flash,然后可以使用JFlash把NV区域裁剪出来。
miffy:
回复 VV:
最后我用没读.hex然后剪裁出NV这种方法,感觉比较费劲;
我用了SmartRF Flash Programmer安装目录下自带的SmartRFProgConsole.exe命令行程序,读出了6个page的NV数据,并合成了一个CC2530F256_121-126_NV_CONTENT.bin文件,然后WinHex打开都能看到其中的IEEE地址信息;
现在遇到的问题是,我有了这个包含所有NV信息的.bin文件,我怎么恢复到别的芯片上呢,例如我要恢复到全新的CC2538芯片上呢,试了好多方法,都不奏效;
已经读出来的6个page的.bin文件,细框是NV ID信息,粗框是写入NV的IEEE地址;
顺便贴上我自己写的一个.bat批处理文件,直接读取出CC2530 6个page里面的NV信息,并合并成一个.bin文件。
set SMART_RF=C:\"SMART_RFram Files (x86)"\"Texas Instruments"\"SmartRF Tools"\"Flash SMART_RFrammer"\bin\SmartRFSMART_RFConsole.exerem 读取CC2530F256 的 121~126 page的NV echo > %temp%\121.bin %SMART_RF% S RP=121 F="%temp%\121.bin"echo > %temp%\122.bin %SMART_RF% S RP=122 F="%temp%\122.bin"echo > %temp%\123.bin %SMART_RF% S RP=123 F="%temp%\123.bin"echo > %temp%\124.bin %SMART_RF% S RP=124 F="%temp%\124.bin"echo > %temp%\125.bin %SMART_RF% S RP=125 F="%temp%\125.bin"echo > %temp%\126.bin %SMART_RF% S RP=126 F="%temp%\126.bin"rem 合并成一个.bin文件,放入D盘根目录 copy /b %temp%\121.bin+%temp%\122.bin+%temp%\123.bin+%temp%\124.bin+%temp%\125.bin+%temp%\126.bin D:\CC2530F256_121-126_NV_CONTENT.binpause再回到目标协调器CC2538SF53上,我们知道,和CC2530不同,CC2538芯片的NV是从第249个page开始存储的,同样是6个page来存NV,每个page大小同样是2408字节,那么249*2048得出偏移地址是0x7C800,再加上0x00200000的基地址,就可以得出249 page是在0x0027C800地址处,所以,理论上我们把这包含6个page的.bin文件写入0x0027C800地址处,就可以完成NV的迁移了,问题是怎么写都不行,试了几种方法都不行,不知怎么破:
1、直接erase所有unprotected page,然后用Flash Programmer 2直接把.bin写到249 page地址0x0027C800处,再用Flash Programmer 2读取249-254 page,得到的信息和.bin文件完全对的上,说明的确写进去了,但是没有firmware,只写了NV也没用
2、先erase unprotected page,然后写入firmware,写完会自动重启,程序跑起来了,此时读取249-254 page,发现NV区域被改写了,这是正常的,OSAL启动了自然会写入一些配置信息,此时直接按照第一步直接把.bin写入0x0027C800地址处,发现写了之后再读出来还是没变,奇怪了,莫非必须先擦除再写不成?
3、先擦的话,用Flash Programmer 2每次只能擦除一个page(用其自带的命令行工具srfprog.exe的话,似乎可以同时擦除6个page,我也试过了,的确能擦除),好不容易把6个page都擦完了,又写了一遍,还是没用。
4、也尝试了编译时候生成.bin文件,然后再把包含NV的bin文件合并到0x0007C800文件偏移处再烧进去,结果OSAL启动不了,可能是.bin也有CRC校验,这样直接修改烧写似乎不行。
miffy:
回复 miffy:
尝试了很多方法,均不奏效,因为无论怎么写,因为根本无法让OSAL先停止运行,然后替换NV,然后再重启OSAL。
看来试图通过备份6个page的NV,然后恢复到别的协调器上,看起来可行,实际行不通。
只能考虑单独备份PANID、network key、TCLK、IEEE、网络表这几项,再想办法恢复到新的协调器上,以实现更换协调器的目的。