微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 使用了nv后数据掉电上电仍会丢失,重启却不会

使用了nv后数据掉电上电仍会丢失,重启却不会

时间:10-02 整理:3721RD 点击:

使用了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函数的返回值是否都正确。

好的,我试试。然后回复您!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top