CC2640 SNV

转自:http://blog.csdn.net/feilusia/article/details/57374684

一、简介

本文以SimpleBLEPeripheral工程为例,介绍如何使用SNV


二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

编译软件:IAR Embedded Workbench for ARM Version 7.40

硬件平台:CC26xxDK开发板

仿真器:XDS100V3(香瓜)

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
1)《 CC2541之SNV 》: http://blog.csdn.net/feilusia/article/details/50190859
2)《SWRU393_CC2640_BLE_Software_Developer's_Guide》(第3.10.4章节):C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Documents(协议栈路径)

2、在进行本文步骤前,请先 实现以下博文:

暂无


五、基础知识

1、CC2640的SNV是怎么样的?

答:

1)总大小

两页,共4K(协议栈已使用一部分)。

2)可用SNV的ID号

[cpp]  view plain  copy
  1. // Customer NV Items - Range 0x80 - 0x8F - This must match the number of Bonding entries  
  2. #define BLE_NVID_CUST_START 0x80 //!< Start of the Customer's NV IDs  
  3. #define BLE_NVID_CUST_END 0x8F //!< End of the Customer's NV IDs  
0x80~0x8F都可以用(包含0x80、0x8F),每个ID号最多一次可写入252字节。

注:实际可以写几个ID取决于所剩余SNV空间,并不是说可以把所有ID号都写满252字节。

3)工程中可选的SNV大小

可在IAR的预编译处写入三种宏:

①OSAL_SNV=0:0个可写SNV页。工程中不使用SNV,由于绑定信息时需要SNV,该操作将导致无法使用绑定功能。

②OSAL_SNV=1:1个可写SNV页,共2K。

③OSAL_SNV=2(默认):2个可写SNV页,共4K。


2、多次“仿真、退出仿真、仿真”的操作,是否会把SNV擦除?

答:实测不会。

注:CC2541使用仿真时会擦除SNV。


3、如果我想写1K字节到SNV,怎么写?

答:可以每个ID写252字节,一共需要4个ID1000/252=3.96)。


4、为什么有些工程使用不了SNV(比如组网的例程)?

答:因为组网例程所需flash较大,因此该工程的SNV部分被充分利用在了组网部分。

可以看工程的预编译中包含了“OSAL_SNV=0”。


六、实验步骤

1、编写并添加自定义的SNV驱动

1)写一个驱动GUA_SNV.c(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路径下)

[cpp]  view plain  copy
  1. //******************************************************************************            
  2. //name:         GUA_SNV.c            
  3. //introduce:    SNV驱动       
  4. //author:       甜甜的大香瓜          
  5. //email:        897503845@qq.com       
  6. //QQ group      香瓜BLE之CC2640(557278427)     
  7. //changetime:   2017.02.26    
  8. //******************************************************************************    
  9. #include "GUA_SNV.h"    
  10. #include "osal_snv.h"  
  11.   
  12. //******************************************************************************                        
  13. //name:             GUA_SNV_Control                      
  14. //introduce:        SNV的读写操作函数                   
  15. //parameter:        nGUA_WriteReadFlag:GUA_SNV_READ or GUA_SNV_WRITE           
  16. //                  npGUA_Data:数据首地址      
  17. //                  nGUA_Len:数据长度      
  18. //return:           none                    
  19. //author:           甜甜的大香瓜                             
  20. //email:            897503845@qq.com                 
  21. //QQ group          香瓜BLE之CC2640(557278427)                                
  22. //changetime:       2017.02.26                              
  23. //******************************************************************************      
  24. GUA_U8 GUA_SNV_Control(GUA_U8 nGUA_SNV_ID, GUA_U8 nGUA_WriteReadFlag, GUA_U8 *npGUA_Data, GUA_U8 nGUA_Len)      
  25. {      
  26.   //读数据      
  27.   if(nGUA_WriteReadFlag == GUA_SNV_READ)      
  28.   {      
  29.     return osal_snv_read(nGUA_SNV_ID, nGUA_Len, npGUA_Data);     
  30.   }      
  31.   //写数据      
  32.   else    
  33.   {      
  34.     return osal_snv_write(nGUA_SNV_ID, nGUA_Len, npGUA_Data);      
  35.   }       
  36. }    

2)写一个驱动头文件GUA_SNV.h(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路径下)

[cpp]  view plain  copy
  1. //******************************************************************************            
  2. //name:         GUA_SNV.c            
  3. //introduce:    SNV驱动头文件    
  4. //author:       甜甜的大香瓜          
  5. //email:        897503845@qq.com       
  6. //QQ group      香瓜BLE之CC2640(557278427)     
  7. //changetime:   2017.02.26    
  8. //******************************************************************************    
  9. #ifndef _GUA_SNV_H_    
  10. #define _GUA_SNV_H_    
  11.     
  12. /*********************宏定义************************/    
  13. #ifndef GUA_U8            
  14. typedef unsigned char GUA_U8;            
  15. #endif        
  16.     
  17. #ifndef GUA_8            
  18. typedef signed char GUA_8;            
  19. #endif          
  20.           
  21. #ifndef GUA_U16            
  22. typedef unsigned short GUA_U16;            
  23. #endif     
  24.     
  25. #ifndef GUA_16            
  26. typedef signed short GUA_16;            
  27. #endif             
  28.           
  29. #ifndef GUA_U32            
  30. typedef unsigned long GUA_U32;            
  31. #endif     
  32.     
  33. #ifndef GUA_32            
  34. typedef signed long GUA_32;           
  35. #endif    
  36.     
  37. #ifndef GUA_U64        
  38. typedef unsigned long long GUA_U64;      
  39. #endif    
  40.     
  41. #ifndef GUA_64        
  42. typedef signed long long GUA_64;      
  43. #endif    
  44.     
  45. //SNV使用宏      
  46. #define GUA_SNV_READ            0x00      
  47. #define GUA_SNV_WRITE           0x01        
  48.   
  49. /*********************外部函数************************/    
  50. GUA_U8 GUA_SNV_Control(GUA_U8 nGUA_SNV_ID, GUA_U8 nGUA_WriteReadFlag, GUA_U8 *npGUA_Data, GUA_U8 nGUA_Len);  
  51.     
  52. #endif    

3)工程中添加GUA_SNV.c



4)在IAR设置中添加驱动源文件路径
[cpp]  view plain  copy
  1. $PROJ_DIR$/../../../Source/Application/GUA    

2、应用层调用

1)添加头文件(simpleBLEperipheral.c中)

[cpp]  view plain  copy
  1. #include "GUA_SNV.h"   

2)定义一个数据缓存区(simpleBLEPeripheral.c中)

[cpp]  view plain  copy
  1. //数据缓冲区   
  2. static uint8_t gbGUA_Data[256] = {0};   

3) 定义一个SNV的测试ID(simpleBLEPeripheral.c中)
[cpp]  view plain  copy
  1. //SNV使用宏         
  2. #define GUA_SNV_TEST_ID         0x81    

4)添加测试代码 (simpleBLEPeripheral.c的SimpleBLEPeripheral_Init函数末尾)

[cpp]  view plain  copy
  1. //GUA  
  2.     
  3.   uint8_t nGUA_Ret = 0;  
  4.     
  5.   //读  
  6.   nGUA_Ret = GUA_SNV_Control(GUA_SNV_TEST_ID, GUA_SNV_READ, gbGUA_Data, 252);  
  7.   if(nGUA_Ret == NV_OPER_FAILED)  
  8.   {  
  9.     //设置缓冲区数值  
  10.     memset(gbGUA_Data, 0x38, sizeof(gbGUA_Data));  
  11.         
  12.     //出厂设置  
  13.     nGUA_Ret = GUA_SNV_Control(GUA_SNV_TEST_ID, GUA_SNV_WRITE, gbGUA_Data, 252);  
  14.   }  
  15.   
  16.   //写  
  17.   memset(gbGUA_Data, 0x55, sizeof(gbGUA_Data));  
  18.   nGUA_Ret = GUA_SNV_Control(GUA_SNV_TEST_ID, GUA_SNV_WRITE, gbGUA_Data, 252);   
  19.     
  20.   //读  
  21.   memset(gbGUA_Data, 0x00, sizeof(gbGUA_Data));    
  22.   nGUA_Ret = GUA_SNV_Control(GUA_SNV_TEST_ID, GUA_SNV_READ, gbGUA_Data, 252);   
  23.     
  24. //GUA    

七、注意事项

暂无。


八、实验结果

rebuild all, 设置断点在测试代码处, 仿真并全速运行。

测试可发现如下现象:

1、当该ID之前未写过数据时,读取的返回值为“NV_OPER_FAILED”。

2、一次最多只能对一个ID写252个字节,写多时虽然返回值仍然是“SUCCESS”,但实测读出来的数据是错的。

3、再次仿真时不会将上次写入的SNV数据擦除。


因此,实验成功。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值