生活随笔
收集整理的這篇文章主要介紹了
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 plaincopy
?? #define?BLE_NVID_CUST_START?0x80?//!<?Start?of?the?Customer's?NV?IDs?? #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個ID(1000/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 plaincopy
?? ?? ?? ?? ?? ?? ?? ?? #include?"GUA_SNV.h"???? #include?"osal_snv.h"?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? GUA_U8?GUA_SNV_Control(GUA_U8?nGUA_SNV_ID,?GUA_U8?nGUA_WriteReadFlag,?GUA_U8?*npGUA_Data,?GUA_U8?nGUA_Len)?????? {?????? ???? ??if(nGUA_WriteReadFlag?==?GUA_SNV_READ)?????? ??{?????? ????return?osal_snv_read(nGUA_SNV_ID,?nGUA_Len,?npGUA_Data);????? ??}?????? ???? ??else???? ??{?????? ????return?osal_snv_write(nGUA_SNV_ID,?nGUA_Len,?npGUA_Data);?????? ??}??????? }???? 2)寫一個驅動頭文件GUA_SNV.h(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路徑下)
[cpp]?view plaincopy
?? ?? ?? ?? ?? ?? ?? ?? #ifndef?_GUA_SNV_H_???? #define?_GUA_SNV_H_???? ???? /*********************宏定義************************/???? #ifndef?GUA_U8???????????? typedef?unsigned?char?GUA_U8;???????????? #endif???????? ???? #ifndef?GUA_8???????????? typedef?signed?char?GUA_8;???????????? #endif?????????? ?????????? #ifndef?GUA_U16???????????? typedef?unsigned?short?GUA_U16;???????????? #endif????? ???? #ifndef?GUA_16???????????? typedef?signed?short?GUA_16;???????????? #endif????????????? ?????????? #ifndef?GUA_U32???????????? typedef?unsigned?long?GUA_U32;???????????? #endif????? ???? #ifndef?GUA_32???????????? typedef?signed?long?GUA_32;??????????? #endif???? ???? #ifndef?GUA_U64???????? typedef?unsigned?long?long?GUA_U64;?????? #endif???? ???? #ifndef?GUA_64???????? typedef?signed?long?long?GUA_64;?????? #endif???? ???? ?? #define?GUA_SNV_READ????????????0x00?????? #define?GUA_SNV_WRITE???????????0x01???????? ?? ???? GUA_U8?GUA_SNV_Control(GUA_U8?nGUA_SNV_ID,?GUA_U8?nGUA_WriteReadFlag,?GUA_U8?*npGUA_Data,?GUA_U8?nGUA_Len);?? ???? #endif???? 3)工程中添加GUA_SNV.c
4)在IAR設置中添加驅動源文件路徑 [cpp]?view plaincopy
$PROJ_DIR$/../../../Source/Application/GUA???? 2、應用層調用
1)添加頭文件(simpleBLEperipheral.c中)
[cpp]?view plaincopy
#include?"GUA_SNV.h"??? 2)定義一個數據緩存區(simpleBLEPeripheral.c中)
[cpp]?view plaincopy
?? static?uint8_t?gbGUA_Data[256]?=?{0};??? 3)定義一個SNV的測試ID(simpleBLEPeripheral.c中) [cpp]?view plaincopy
?? #define?GUA_SNV_TEST_ID?????????0x81???? 4)添加測試代碼(simpleBLEPeripheral.c的SimpleBLEPeripheral_Init函數末尾)
[cpp]?view plaincopy
?? ???? ??uint8_t?nGUA_Ret?=?0;?? ???? ???? ??nGUA_Ret?=?GUA_SNV_Control(GUA_SNV_TEST_ID,?GUA_SNV_READ,?gbGUA_Data,?252);?? ??if(nGUA_Ret?==?NV_OPER_FAILED)?? ??{?? ?????? ????memset(gbGUA_Data,?0x38,?sizeof(gbGUA_Data));?? ???????? ?????? ????nGUA_Ret?=?GUA_SNV_Control(GUA_SNV_TEST_ID,?GUA_SNV_WRITE,?gbGUA_Data,?252);?? ??}?? ?? ???? ??memset(gbGUA_Data,?0x55,?sizeof(gbGUA_Data));?? ??nGUA_Ret?=?GUA_SNV_Control(GUA_SNV_TEST_ID,?GUA_SNV_WRITE,?gbGUA_Data,?252);??? ???? ???? ??memset(gbGUA_Data,?0x00,?sizeof(gbGUA_Data));???? ??nGUA_Ret?=?GUA_SNV_Control(GUA_SNV_TEST_ID,?GUA_SNV_READ,?gbGUA_Data,?252);??? ???? ?? 七、注意事項 暫無。
八、實驗結果
rebuild all,設置斷點在測試代碼處,仿真并全速運行。 測試可發現如下現象:
1、當該ID之前未寫過數據時,讀取的返回值為“NV_OPER_FAILED”。
2、一次最多只能對一個ID寫252個字節,寫多時雖然返回值仍然是“SUCCESS”,但實測讀出來的數據是錯的。
3、再次仿真時不會將上次寫入的SNV數據擦除。
因此,實驗成功。
總結
以上是生活随笔為你收集整理的CC2640 SNV的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。