微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > CC2530F256中我用NV操作存自己的数据,但是有时候读出来发现数据不对

CC2530F256中我用NV操作存自己的数据,但是有时候读出来发现数据不对

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

要实现的功能如下:

拍照,拍到后会得到一大串数据,通过串口接收, 串口接收一段数据存入item为0x0401的NV区,第二次接收存入0x0402,以此类推;

然后读取的时候从0x0401开始把数据读取出来;

因为数据量不会大到存至0x0FFF,所以程序我暂时没做限制。

程序如下

首先申请了一个二维数组

//ZComDef.h
// NV Items Reserved for applications (user applications)
// 0x0401 ?0x0FFF
uint16 pg_len[20][2] = {{0x0401,0}};
uint16 pg_hdr = 0x0401; //从item为0x0401开始操作NV

然后再串口接收到数据后将数据存入

/*串口处理函数*/

void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)

{

uint8  *flash_cache  = NULL;

。。。

    pg_len[iw][0] = pg_hdr++;  //存item
    pg_len[iw][1] = len;              //存对应item中要写入的数据长度len
    
    osal_nv_item_init( pg_len[iw][0], len, NULL );          //每次读/写之前都需要init
    osal_nv_write( pg_len[iw][0], 0, len, str );                   //将串口接收到的数据str写入NV
    
    flash_cache = osal_mem_alloc(len);                         //给指针分配空间
    if ( flash_cache )
    {
      osal_nv_read( pg_len[iw][0], 0,len, flash_cache );  //开始读取
      HalUARTWrite( 1, flash_cache, len );
      osal_mem_free(flash_cache);
    }
    
    iw++;

。。。

}

这样子得到的数据是正确的,数据量大概是5K;

但是我实际应用当中不是边写边读的,边写边读完全不符合我的应用场景。

最后我的程序如下:

/*串口处理函数*/

void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)

{

uint8  *flash_cache  = NULL;

。。。

    pg_len[iw][0] = pg_hdr++;
    pg_len[iw][1] = len;
    
    osal_nv_item_init( pg_len[iw][0], len, NULL );
    osal_nv_write( pg_len[iw][0], offset, len, str+1 );
    
    iw++;
    
    if (osal_memfind(str+1, pdhdr, len, 5) == TRUE)//接收到帧标识说明一帧数据接收完成
    {
      iw_max = iw;
      iw = 0;
      pg_hdr = 0x0401;
      osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_CAM_PKG_EVT, SAMPLEAPP_CAM_DELAY_VALUE);
      //osal_set_event( SampleApp_TaskID, SAMPLEAPP_SEND_CAM_PKG_EVT );
    }

。。。

}

/*事件轮询函数*/

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{

。。。

  if ( events & SAMPLEAPP_SEND_CAM_PKG_EVT )
  {
    SampleApp_CAM_SendMessage();
    return (events ^ SAMPLEAPP_SEND_CAM_PKG_EVT);
  }

。。。

}

/*NV数据读取事件函数*/

void SampleApp_CAM_SendMessage( void )
{
  uint16 len;
  uint8  *flash_cache = NULL;  
  uint16 ik = 0x0000;
  uint16 pg = 0x0401;
 
  HAL_ENABLE_INTERRUPTS();
  for ( ik = 0; ik < iw_max; ik++ )
  {
    pg  = pg_len[ik][0];
    len = pg_len[ik][1];
    
    flash_cache = osal_mem_alloc( len );
    if ( flash_cache )
    {
      osal_nv_read( pg, offset, len, flash_cache );
      HalUARTWrite( 1, flash_cache, len );
      osal_mem_free( flash_cache );
    }
  }
  HAL_DISABLE_INTERRUPTS();
}

注释应该很清楚,我解释下,串口处理函数SampleApp_SerialCMD将每次接收到的数据存入指定的NV中,当检测到数据接收完之后设定一个定时事件

osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_CAM_PKG_EVT, SAMPLEAPP_CAM_DELAY_VALUE);

该事件为SAMPLEAPP_SEND_CAM_PKG_EVT,SAMPLEAPP_CAM_DELAY_VALUE(5000也就是5秒)时间后触发。

然后5秒后,事件轮询函数SampleApp_ProcessEvent轮询到刚才设定的事件,然后执行NV数据读取事件函数SampleApp_CAM_SendMessage开始读取NV中的数据,但是发现读取的数据前一段是对的,但是中间一大段没了,5K的数据我只能读取1K不到

希望给予帮助,之前有研究过用flash直接操作,但是单独读写没问题,放在串口接收函数中后,发现会影响串口接收。

有需要源码我可以上传

应该是因为写NV或者写Flash需要一定时间的缘故吧,这段时间内,摄像头还是在发出数据的,所以这段数据单片机就接收不到了

写Flash在时间上确实会长一点

但是我看到旧的协议栈版本比如2.3.0的,flash操作的函数是存在sram里的,大小正好是23字节,运行速度应该是非常之快的,但是新的协议栈没有将此段代码保存在这个sram里,我想知道为什么,新版协议栈做了此更改,另外就是假如和旧版协议栈一样的话那个写入速度具体是多快,能否满足我的要求

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

网站地图

Top