日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BLE-CC2640】CC2640之SNV

發(fā)布時(shí)間:2024/3/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BLE-CC2640】CC2640之SNV 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇博文最后修改時(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è)ID1000/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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。