全是自己凭自己的理解写的,可能有理解或者错误错误的地方,欢迎大家指正。
先废话两句,好久没有写关于无线方面的程序了,今天兴致比较高,就把前一段时间一个项目上用到的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_协议栈_移植学习