CC1101_在TI_的_SimpliciTI_协议栈_移植学习

全是自己凭自己的理解写的,可能有理解或者错误错误的地方,欢迎大家指正。

先废话两句,好久没有写关于无线方面的程序了,今天兴致比较高,就把前一段时间一个项目上用到的SimpliciTI协议之的心得写一下,和大家一块分享,可以帮助新手更加快速入门,废话不多说了。

移植这个协议栈之前,最好有过CC1101或者CC2500等射频收发芯片的使用经验,要不然你会很头大,SimpliciTI协议栈主要针对TI的射频收发芯片,不是TI的需要修改的比较多一点,如果你是高手,可以不去用他提供的底层的,只用网络层,那样就和芯片没有关系了。

1、SimpliciTI协议栈包括了四个层,BSP,MRFI,NWK,NWK_APPLICATION,其中BSP是最基础的板级硬件,包括一些MCU相关的函数以及LED、按键之类的基础器件驱动,;MRFI是属于射频接口层,提供射频芯片的选择,射频芯片的配置参数,射频芯片的驱动以及通信接口,;NWK和NWK_APPLICATION是网络层和网络应用层,真正属于SimpliciTI协议栈的内容,包括网络的建立,网络地址的分配,网络数据帧结构、数据消息队列,数据消息处理,网络通信安全加密等一系列复杂机制。

2、用户一般只需要修改BSP和MRFI层即可实现SimpliciTI协议的移植和使用,BSP层要注意时钟初始化的选择,LED数目和接口,按键的数目和接口等,一般我们修改的比较多,主要是要和自己的板子相适应,MRFI层比如涵盖芯片初始化函数,发送函数,接收函数等,所以我说这里一般要有经验一点,不然很难理解的需要注意射频IC的选择,我选的是CC1101,以及射频芯片的配置,采用433MHz,配置文件需要进行修改。选择CC1101这个宏定义比较隐蔽,需要修改IAR,我这里截图一张。

3、在SimpliciTI中一般有四种类型,AP,也就是Access Pointer,?ED,也就是End Device,RE,也就是Range Extemder。其中AP就是我们常说的路由,网关,集线器,数据中心这类的意思,在无线传感网一般我们要确保AP电力,一般不采用干电池,不考虑AP功耗。ED就是节点,一般是带各种传感器的节点,考虑低功耗,一般用电池供电。RE是为了距离扩展才引入的,为了更远距离中转,另外一种更不常用。如果直接使用TI的工程,我们这里要对节点类型选择,选择节点类型如下图所示。

4、一般采用AP和ED组网时,多个ED节点和AP正确建立通信连接后,AP都会给ED分配一个相应的地址。当某个ED出现意外,比如电源问题,和AP断开连接,AP并不将该ED节点的地址消除。当该ED恢复正常,重新申请加入网络时,AP会检测该ED仍然分配原来的地址继续使用,如果是新的ED申请加入网络时,会分配一个新的网络地址。SimpliciTI协议也并非支持无线多个节点,肯定不会超过256个,因为AP为ED分配标号的Tid变量是8位的,好像官方数据说挂载30多节点吧,我就测试过挂载8个,个数限制中可以修改smpl_config.dat中的NUM_CONNECTIONS值。

5、关于节点地址,每个ED节点的4字节地址都不应相同,地址作为节点区分的标志,如果不使用软件自动分配给该节点地址,那么则应该修改相应的smpl_config.dat中的THIS_DEVICE_ADDRESS值,特别是网络中含多个ED节点,默认的使用都是同一个地址,不修改的话出第一个外是加入不了网络的。我们也可以使用读取Flash地址作为本机节点的地址,或者使用随机函数参数,则无需修改,如果使用随机地址作为节点地址,在SimpliciTI协议栈中必须要开启

I_WANT_TO_CHANGE_DEFAULT_ROM_DEVICE_ADDRESS_PSEUDO_CODE宏

6、SimpliciTI协议组成的网络实现过程一般是,AP先启动,初始化协议栈后,处于接收状态,等待ED加入网络和接收数据;ED启动后,向AP发送建立网络请求,然后一直处于这个请求建立网络状态,直到建立正常的网络连接为止。

7、AP在协议初始化时会引入一个函数指针到协议初始化函数中SMPL_Init(sCB);这里的sCB就是这个函数指针,是指向SimpliciTI的中断回调函数的函数指针,sCB中断回调函数在无线收发的接收中断服务函数中会被调用一次。sCB中断回调函数是个非常重要的函数,收到数据分为节点加入网络请求数据和节点发送普通数据,通过lid识别区分,如果是加入网络请求,sJoinSem++;也就是SimpliciTI网络加入帧加一次,AP在主函数检测sJoinSem是否为0,不为0说明有节点请求加入网络,如果没有达到最大节点限制数目,AP就一直处于和该ED建立网络连接,直到建立正常网络连接为止。那么如果是普通数据,sPeerFrameSem++;也就是SimpliciTI网络节点数据帧加一次,AP在主函数检测sPeerFrameSem是否为0,不为0说明有节点发送数据包,就接收处理一下数据包,这个我们以前不用协议栈也是大致这样处理。

8、ED在协议初始化时不会引入一个函数指针到协议初始化函数中SMPL_Init(0);也就是没有中断回调函数,然后一直向AP发送网络请求帧,直到成功。这时连接指示标号Lid变量就为1,这个1就是指AP,ED以后通信参数lid都为1,不会变;而AP通信lid这个参数不一定为1,是几就表示第几个加入网络的节点,这里可能大家不太明白,如果自己研究后就会立马明白了。一般为了保证通信可靠性,ED每发送一次数据之前都和AP连接一次,确保自己处于网络中。

CC1101_在TI_的_SimpliciTI_协议栈_移植学习

时间: 2024-11-05 13:48:50

CC1101_在TI_的_SimpliciTI_协议栈_移植学习的相关文章

黑 马 程 序 员_视频学习总结<c语言>----03 指针

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是指针? 用来存放变量地址的变量,就称为"指针变量". 二.指针的定义 一般形式:类名标识符  *指针变量名; int *p; float *q; "*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的

黑 马 程 序 员_视频学习总结<c语言>----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----01 关键字、标识符、注释、 常量、变量

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.关键字 1.关键字就是C语言提供的有特殊含义的符号,有些地方也叫做“保留字”. 2.C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义. auto double int struct break else long switch case enum register typedef char extern return uni

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----06 枚举

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型.比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天.夏天.秋天.冬天.   二.枚举类型的定义 一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……}; en

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----07 static和extern关键字、typedef

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.外部函数 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数 二.内部函数 内部函数:如果在当前文件中定义的函数不允许其他文件访问.调用,只能在内部使用,就称为内部函数.C语言规定不同的源文件可以有同名的内部函数,并且互不干扰. 三.static.extern与函数的总结 1.在定

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----05 结构体

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是结构体 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型.为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的. 二.结构体的定义 结构体内部的元素,也就是

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----04 预处理指令

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号 3.预处理指令可以出现在程序的任何位置,它的

Deep Learning 十一_深度学习UFLDL教程:数据预处理(斯坦福大学深度学习教程)

理论知识:UFLDL数据预处理和http://www.cnblogs.com/tornadomeet/archive/2013/04/20/3033149.html 数据预处理是深度学习中非常重要的一步!如果说原始数据的获得,是深度学习中最重要的一步,那么获得原始数据之后对它的预处理更是重要的一部分. 1.数据预处理的方法: ①数据归一化: 简单缩放:对数据的每一个维度的值进行重新调节,使其在 [0,1]或[ − 1,1] 的区间内 逐样本均值消减:在每个样本上减去数据的统计平均值,用于平稳的数

黑 马 程 序 员_视频学习总结&lt;Objective-C&gt;----03 self、NSString、@property和@synthesize、id

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.self 1.谁调用了当前方法,self就代表谁.两种情况:self出现在对象方法里,self就代表对象:self出现在类方法里,self就代表类. 2.对象方法利用“self→成员变量名”访问当前对象内部成员变量. 3.[self 方法名]可以调用其它对象方法.类方法. 二.NSString 1.NSString简介:NSString是一