【BLE-CC2640】CC2640之SNV
本篇博文最后修改時(shí)間:2017年06月02日,06:40。
一、簡介
本文以SimpleBLEPeripheral工程為例,介紹如何使用SNV。
二、實(shí)驗(yàn)平臺
協(xié)議棧版本:ble_cc26xx_2_01_00_44423
編譯軟件:IAR Embedded Workbench for ARM Version 7.40
硬件平臺:CC26xxDK開發(fā)板
仿真器:XDS100V3(香瓜)
三、版權(quán)聲明
博主:甜甜的大香瓜
聲明:喝水不忘挖井人,轉(zhuǎn)載請注明出處。
原文地址:http://blog.csdn.NET/feilusia
聯(lián)系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
香瓜單片機(jī)之STM8/STM32群:164311667香瓜單片機(jī)之Linux群:512598061
香瓜單片機(jī)之職場交流群:450154342
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、實(shí)驗(yàn)前提 1、在進(jìn)行本文步驟前,請先閱讀以下博文: 1)《CC2541之SNV》:http://blog.csdn.net/feilusia/article/details/50190859 2)《SWRU393_CC2640_BLE_Software_Developer's_Guide》(第3.10.4章節(jié)):C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Documents(協(xié)議棧路徑)
2、在進(jìn)行本文步驟前,請先實(shí)現(xiàn)以下博文:
暫無
五、基礎(chǔ)知識
1、CC2640的SNV是怎么樣的?
答:
1)總大小
兩頁,共4K(協(xié)議棧已使用一部分)。
2)可用SNV的ID號
// Customer NV Items - Range 0x80 - 0x8F - This must match the number of Bonding entries #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 IDs0x80~0x8F都可以用(包含0x80、0x8F),每個(gè)ID號最多一次可寫入252字節(jié)。
注:實(shí)際可以寫幾個(gè)ID取決于所剩余SNV空間,并不是說可以把所有ID號都寫滿252字節(jié)。
3)工程中可選的SNV大小
可在IAR的預(yù)編譯處寫入三種宏:
①OSAL_SNV=0:0個(gè)可寫SNV頁。工程中不使用SNV,由于綁定信息時(shí)需要SNV,該操作將導(dǎo)致無法使用綁定功能。
②OSAL_SNV=1:1個(gè)可寫SNV頁,共2K。
③OSAL_SNV=2(默認(rèn)):2個(gè)可寫SNV頁,共4K。
2、多次“仿真、退出仿真、仿真”的操作,是否會把SNV擦除?
答:實(shí)測不會。
注:CC2541使用仿真時(shí)會擦除SNV。
3、如果我想寫1K字節(jié)到SNV,怎么寫?
答:可以每個(gè)ID寫252字節(jié),一共需要4個(gè)ID(1000/252=3.96)。
4、為什么有些工程使用不了SNV(比如組網(wǎng)的例程)?
答:因?yàn)榻M網(wǎng)例程所需flash較大,因此該工程的SNV部分被充分利用在了組網(wǎng)部分。
可以看工程的預(yù)編譯中包含了“OSAL_SNV=0”。
六、實(shí)驗(yàn)步驟
1、編寫并添加自定義的SNV驅(qū)動(dòng)
1)寫一個(gè)驅(qū)動(dòng)GUA_SNV.c(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路徑下)
//****************************************************************************** //name: GUA_SNV.c //introduce: SNV驅(qū)動(dòng) //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜BLE之CC2640(557278427) //changetime: 2017.02.26 //****************************************************************************** #include "GUA_SNV.h" #include "osal_snv.h"//****************************************************************************** //name: GUA_SNV_Control //introduce: SNV的讀寫操作函數(shù) //parameter: nGUA_WriteReadFlag:GUA_SNV_READ or GUA_SNV_WRITE // npGUA_Data:數(shù)據(jù)首地址 // nGUA_Len:數(shù)據(jù)長度 //return: none //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜BLE之CC2640(557278427) //changetime: 2017.02.26 //****************************************************************************** GUA_U8 GUA_SNV_Control(GUA_U8 nGUA_SNV_ID, GUA_U8 nGUA_WriteReadFlag, GUA_U8 *npGUA_Data, GUA_U8 nGUA_Len) { //讀數(shù)據(jù) if(nGUA_WriteReadFlag == GUA_SNV_READ) { return osal_snv_read(nGUA_SNV_ID, nGUA_Len, npGUA_Data); } //寫數(shù)據(jù) else { return osal_snv_write(nGUA_SNV_ID, nGUA_Len, npGUA_Data); } }2)寫一個(gè)驅(qū)動(dòng)頭文件GUA_SNV.h(存放在“……\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application\GUA”路徑下)
//****************************************************************************** //name: GUA_SNV.c //introduce: SNV驅(qū)動(dòng)頭文件 //author: 甜甜的大香瓜 //email: 897503845@qq.com //QQ group 香瓜BLE之CC2640(557278427) //changetime: 2017.02.26 //****************************************************************************** #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 //SNV使用宏 #define GUA_SNV_READ 0x00 #define GUA_SNV_WRITE 0x01 /*********************外部函數(shù)************************/ 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設(shè)置中添加驅(qū)動(dòng)源文件路徑
$PROJ_DIR$/../../../Source/Application/GUA
2、應(yīng)用層調(diào)用
1)添加頭文件(simpleBLEperipheral.c中)
#include "GUA_SNV.h"2)定義一個(gè)數(shù)據(jù)緩存區(qū)(simpleBLEPeripheral.c中)
//數(shù)據(jù)緩沖區(qū) static uint8_t gbGUA_Data[256] = {0};
3)定義一個(gè)SNV的測試ID(simpleBLEPeripheral.c中) //SNV使用宏 #define GUA_SNV_TEST_ID 0x81
4)添加測試代碼(simpleBLEPeripheral.c的SimpleBLEPeripheral_Init函數(shù)末尾)
//GUAuint8_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){//設(shè)置緩沖區(qū)數(shù)值memset(gbGUA_Data, 0x38, sizeof(gbGUA_Data));//出廠設(shè)置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); //GUA
七、注意事項(xiàng)
暫無。
八、實(shí)驗(yàn)結(jié)果
rebuild all,設(shè)置斷點(diǎn)在測試代碼處,仿真并全速運(yùn)行。測試可發(fā)現(xiàn)如下現(xiàn)象:
1、當(dāng)該ID之前未寫過數(shù)據(jù)時(shí),讀取的返回值為“NV_OPER_FAILED”。
2、一次最多只能對一個(gè)ID寫252個(gè)字節(jié),寫多時(shí)雖然返回值仍然是“SUCCESS”,但實(shí)測讀出來的數(shù)據(jù)是錯(cuò)的。
3、再次仿真時(shí)不會將上次寫入的SNV數(shù)據(jù)擦除。
因此,實(shí)驗(yàn)成功。
總結(jié)
以上是生活随笔為你收集整理的【BLE-CC2640】CC2640之SNV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解决前端上线之后用户页面不刷新的问题
- 下一篇: 微信公众号对接影视资源接口分享