本篇博文最后修改时间:2017年06月02日,06:40。

一、简介

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

二、实验平台

协议栈版本:ble_cc26xx_2_01_00_44423

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

硬件平台:CC26xxDK开发板

仿真器:XDS100V3(香瓜)

版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
香瓜单片机之Linux群:512598061

香瓜单片机之职场交流群:450154342
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、实验前提
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号

// 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 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”路径下)

//******************************************************************************
//name:         GUA_SNV.c
//introduce:    SNV驱动
//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的读写操作函数
//parameter:        nGUA_WriteReadFlag:GUA_SNV_READ or GUA_SNV_WRITE
//                  npGUA_Data:数据首地址
//                  nGUA_Len:数据长度
//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)
{    //读数据    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”路径下)

//******************************************************************************
//name:         GUA_SNV.c
//introduce:    SNV驱动头文件
//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      /*********************外部函数************************/
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设置中添加驱动源文件路径
$PROJ_DIR$/../../../Source/Application/GUA  

2、应用层调用

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

#include "GUA_SNV.h" 

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

//数据缓冲区
static uint8_t gbGUA_Data[256] = {0}; 
3)定义一个SNV的测试ID(simpleBLEPeripheral.c中)
//SNV使用宏
#define GUA_SNV_TEST_ID         0x81  

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

//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){//设置缓冲区数值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); //GUA  
七、注意事项

暂无。

八、实验结果

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

测试可发现如下现象:

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

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

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

因此,实验成功。

【BLE-CC2640】CC2640之SNV相关推荐

  1. 【BLE】CC2541之SNV

    本篇博文最后修改时间:2017年01月06日,11:06. 一.简介 本文以SimpleBLEPeripheral工程为例,介绍SNV的使用. 二.实验平台 协议栈版本:BLE-CC254x-1.4. ...

  2. CC2640 SNV

    转自:http://blog.csdn.net/feilusia/article/details/57374684 一.简介 本文以SimpleBLEPeripheral工程为例,介绍如何使用SNV. ...

  3. 【BLE】CC2541之Large OAD

    本篇博文最后修改时间:2017年05月19日,03:33. 一.简介 本篇以SimpleBLEPeripheral工程为例,介绍如何进行Large OAD升级. 二.实验平台 协议栈版本:BLE-CC ...

  4. 【BLE】CC2541之SBL

    本篇博文最后修改时间:2016年12月23日,13:53. 一.简介 本文以SimpleBLEPeripheral工程为例,介绍如何使用串口方式下载. 二.实验平台 协议栈版本:BLE-CC254x- ...

  5. BLE】CC2541之通过RSSI测距

    本篇博文最后修改时间:2017年01月06日,11:06. 一.简介 本文介绍如何在SimpleBLEPeripheral工程中,通过RSSI粗略测距. 二.实验平台 协议栈版本:BLE-CC254x ...

  6. 【BLE】CC2541与CC2540的区别

    本篇博文最后修改时间:2017年01月06日,11:06. 一.简介 本文介绍CC2541与CC2540的区别. 二.实验平台 协议栈版本:BLE-CC254x-1.4.0 编译软件:IAR 8.20 ...

  7. 【BLE】CC2541之OAD

    本篇博文最后修改时间:2017年01月06日,11:06. 一.简介 本文以SimpleBLEPeripheral工程为例,介绍如何进行OAD升级. 二.实验平台 协议栈版本:BLE-CC254x-1 ...

  8. 【BLE】CC2541之动态广播加密数据

    本篇博文最后修改时间:2017年03月30日,16:33. 一.简介 本文以SimpleBLEPeripheral为例,每5S来动态更新广播一次16字节的加密数据,其中有效数据为1个字节的计数值. 二 ...

  9. 【BLE】CC2541之通信协议

    本篇博文最后修改时间:2016年12月12日,10:51. 一.简介 本文以SimpleBLEPeripheral工程为例,介绍如何在一个可读.可写.可通知.20字节长的特征值char6基础上,添加一 ...

最新文章

  1. 东北农业大学农学院程晓非教授荣获植物病毒学国家“优青”资助
  2. 使用log4jdbc记录SQL信息
  3. Java初学者习题20道(转)
  4. 贪心/动态规划 - 买卖股票的最佳时机含手续费
  5. 代理模式给我们带来的便利
  6. java事件监听器无效_Java的事件监听器学习心得
  7. 利用递归求某数的阶乘——C/C++
  8. TypeError: cannot convert the series to <class ‘float‘>问题解决
  9. 光信噪比 (OSNR) 的概念及其重要性
  10. 计算机教师专业知识,小学信息技术教师专业知识考试复习题及答案【精选】.doc...
  11. restful api和普通api有什么特点_Django REST Framework教程(1): 什么是序列化和RESTful的API
  12. Python天空颜色渐变
  13. JAVA 实现AES加密解密
  14. 程序员突然倒地!中软回应称系低血糖引发
  15. OpenWrt ADSL单线多拨,负载均衡(仅供参考)
  16. 爪哇国新游记之八----读写文件及数组排序
  17. 微信小程序全局音频设置,手机上播放不了音频的问题解决方案,微信小程序音频无法播放问题.
  18. pfamscan 的使用_基础工具-HMMER用法
  19. 报错:Parameter ‘XXX‘ implicitly has an ‘any‘ type.解决方法
  20. Pytorch分布式训练/多卡训练(二) —— Data Parallel并行(DDP)(2.2)(代码示例)(BN同步主卡保存梯度累加多卡测试inference随机种子seed)

热门文章

  1. 什么是Apache,Apache和PHP的关系
  2. NR, 8个问题全面了解5G关键技术Massive MIMO
  3. python监控机票价格_喜欢旅行又怕吃土?让Python来爬取最便宜机票吧!
  4. 某34岁程序员求助:从美团L7跳到阿里P7,涨薪30%,去不去?
  5. python打字机效果_零基础手把手教你用Python做一个怀旧打字机
  6. CS224n课程Assignment3参考答案
  7. dvd转wmv及wmv转flv参数(3M/1min)
  8. ffmpeg 转换flv压缩大小_ffmpeg转换参数和对几种视频格式的转换分析
  9. 工程机械设备电子监测仪软件测试研究
  10. Linux命令lsscsi详解