使用了nv后数据掉电上电仍会丢失,重启却不会
使用了nv后数据掉电上电仍会丢失,重启却不会,无法理解,掉电上电和重启有区别吗?
我在系统初始化时调用了nv初始化和读,执行某个命令后写nv,但是发现一个奇怪的问题,写nv后我重启,ok没问题,打印出来的就是我想要写入的数据,但是我重新插拔之后,数据却全成了FF,怎么会这样呢
void SampleApp_Init( uint8 task_id )
{
//init nv
osal_nv_item_init(AppSetMul_NV,9,NULL);
osal_nv_read(AppSetMul_NV,0,9,&CmdMulRead);
osal_nv_item_init(AppSetNumLocation_NV,1,NULL);
osal_nv_read(AppSetNumLocation_NV,0,1,& NumLocationRead);
osal_nv_item_init(AppSetLightsOnArray_NV ,29,NULL);
osal_nv_read(AppSetLightsOnArray_NV ,0,29,& LightsOnArrayRead);
HalUARTWrite(0,(uint8*)& CmdMulRead,9);
HalUARTWrite(0,(uint8*)& CmdMulRead.N_Before_Auto,2);
HalUARTWrite(0,&NumLocationRead,1);
}
你好,我也遇到了这个问题。
重启从NV读出的数据没问题,断电后读出的数据就会出问题。
而且NV Items ID都换过几次,效果都差不多。我使用了0x0402和0x0F02,存储了80个字节的数据。
希望TI工程师帮忙解答下!
谢谢!
你插拔电源对CC2530供电的电压波动大么?
会不会电压突变导致Flash数据丢失
Hi VV:
我的测试是直接拉家里的强电箱的总电闸,然后在重新合上电闸。
Ok,那这里还有AC/DC的干扰问题,能不能用电池,或者直流电测试下,方便定位问题。
谢谢!
Hi VV:
我有一个设备是用的手机充电插头供电的,也会出现这种情况,因为有一条数据线(1米左右),因为可以排除电源的干扰了吧!
能不能在TI官方的协议栈上,就加入修改NV这个改动,看问题还是否会复现。
然后我这里可以去复现下。
是用的TI官方协议栈,z-stack mesh 1.0.0 core2.6.2。现象是偶尔会出现,不是每次拉闸都会出现。
涉及的函数为:
extern void osal_nv_init( void *p );
/*
* Initialize an item in NV
*/
extern uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf );
/*
* Read an NV attribute
*/
extern uint8 osal_nv_read( uint16 id, uint16 offset, uint16 len, void *buf );
/*
* Write an NV attribute
*/
extern uint8 osal_nv_write( uint16 id, uint16 offset, uint16 len, void *buf );
写NV的数据,有没有自己定义NV Item, 还是都是协议栈默认的那些NV操作。
另外是否在应用层自己有调用以上的Nv操作函数。
NV Items ID换过几次,效果都差不多。我使用了0x0402和0x0F02,存储了80个字节的数据。
写是在应用层写,读是在程序开始运行初始化NV后,在zmain_ext_addr();后面开始读自己的数据。
如果不加自己定义的这些NV Item,如果做同样的操作NV里面的数据会不会丢失?
另外能不能把你自己加的关于NV的操作的代码,贴一下看看是否有问题。
谢谢!
#define MY_ITEMS 0x0F02//0x0402
myUse my_use[20]={0};//myUse是一个4个uint8型的结构体。共80个字节
读数据,在zmain_ext_addr();后进行
osal_nv_item_init(MY_ITEMS ,80,my_use);
osal_nv_read(MY_ITEMS ,0,80,&my_use);
应用层写
//根据my_id来决定写偏移量
if( SUCCESS==osal_nv_write( MY_ITEMS, my_id*4, 4, (uint8*)&my_use[my_id] ) )
{
}
不要直接放在zmain_ext_addr();中进行初始化和读。
放在应用层的初始化函数中比较合适,另外检查下每次init和read函数的返回值是否都正确。
好的,我试试。然后回复您!