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:        [email protected]       
  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:            [email protected]                 
  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:        [email protected]       
  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數據擦除。


因此,實驗成功。



發佈了67 篇原創文章 · 獲贊 22 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章