查看: 78925|回复: 97

“飞比”Zigbee论坛CC2530开发板学习教程(二)-- 例1.基于Basic RF的无线电灯控制

[复制链接]
outman 发表于 2010-7-5 11:59:29 | 显示全部楼层 |阅读模式
从本章开始,本教程将以实际的应用为例,逐一对前言所提到的例程进行剖析。本文所提供的并不单单是这些例子的简单罗列,而是希望读者能从其中学到每一个例子的精髓。如果对任何一个例程有疑问,请直接在相应的教程后跟帖。

  一加一远大于二,希望这里有一个互动跟共享的氛围,每个人都能从其中得到自己需要的。

  [注:本文源自www.feibit.com--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保留此行,并通知作者]

  每一个例程都会以下面的格式来进行介绍,另外,为了提高论坛人气,会在适当的位置设置一定的阅读门槛,希望大家能踊跃参与。

  [一]程序功能
  [二]操作说明
  [三]系统框架
  [四]网络结构及协议解析
  [五]扩展思考(本部分是基于例程基础上,底层的相关问题。由于本教程定位于应用,所以这部分只提出问题,后续的“奥特曼读书日记”将继续深入讨论)

  例1.基于Basic RF的无线电灯控制
  注:本例程的源代码来源于TI官方网站,为方便大家,贴子底部提供了下载地址。代码解压后请进入..\ide\srf05_cc2530\iar,打开light_switch工程文件进行编译、调试。另外,此例在Zstack2006中也有相同功能的例程,本教程均可适用。
  
  [一]程序功能  
  此例程是一个基本的点对点通信实验,实现了一个开关控制一个电灯的功能。每一个节点是用来做开关还是用来做灯的控制器,可能通过按键进行选择。本例程可以作为一个无线通信的入门级程序,同时为了增加对信号质量的理解,本站对原例程进行了部分修改,增加了Rssi值的显示,在每收到一个数据包的时候,灯控制器会在LCD上显示相应的dbm值。

  [二]操作说明
  将程序编译、下载至开发板后,按Reset键后,屏幕显示如下:



  此时,按下“S1”键,选择设备模式:



  用遥杆(Joystick)左右键在“开关”和“电灯”间选择,“S1”键进行确认。



  当选择为“开关”时,按遥杆中间键,发送控制信号,将打开或者关闭“电灯”板上的LED。此时“电灯”板上的LCD接收数据计数值加一,同时会显示接收RSSI值。

  [三]系统框架
  此平台采用的是典型的“死循环”结构,其中有一个循环等待用户按“S1”键,进行功能设置,设置完之后按功能不同分别进入“开关”和“灯”的死循环。如下代码:

  //循环等待用户按“S1”键进入设置菜单
    // Wait for user to press S1 to enter menu
    while (halButtonPushed()!=HAL_BUTTON_1);
    halMcuWaitMs(350);

  //设置完后分别进入不同循环
    // Transmitter application
    if(appMode == SWITCH) {
        // No return from here
        appSwitch();
    }
    // Receiver application
    else if(appMode == LIGHT) {
        // No return from here
        appLight();
    }

  [四]网络结构及协议解析
  Basic RF由TI公司提供,它包含了IEEE 802.15.4标准的数据包的收发。这个库只是用来演示无线设备是如何进行数据传输的,不包含完整功能的协议。但是它采用了与802.15.4 MAC兼容的数据包结构及ACK包结构,其功能如下:
  1. 不提供“多跳”、“设备扫描”及Beacon
  2. 不提供不同种的网络设备,如协调器、路由器等。所有节点同级,只实现点对点传输。
  3. 传输时会等待信道空闲,但不按802.15.4 CSMA-CA要求进行两次CCA检测。
  4. 不重传数据

其工作原理如下:

  启动:
  1. 创建一个basicRfCfg_t的数据结构,并初始化其中的成员
  2. 调用basicRfInit()函数进行协议的初始化

  数据发送:
  1. 创建一个buffer,把payload放入其中
  2. 调用basicRfSendPacket()函数发送

  数据接收:
  1. 上层通过basicRfPacketIsReady()函数来检查是否收到一个新的数据包
  2. 调用basicRfReceive()函数,把收到的数据复制到buffer中。

  数据桢结构:
数据包结构(无加密情况)
    [Preambles (4)][SFD (1)][Length (1)][Frame control field (2)]
    [Sequence number (1)][PAN ID (2)][Dest. address (2)][Source address (2)]
    [Payload (Length - 2+1+2+2+2)][Frame check sequence (2)]

ACK包结构:
    [Preambles (4)][SFD (1)][Length = 5 (1)][Frame control field (2)]
    [Sequence number (1)][Frame check sequence (2)]

注:本协议同时提供加密方式传输(默认为关),其打开方式如下:
Project ==> option ==> C/C++ compiler ==> defined symbols 将xSECURITY_CCM改为SECURITY_CCM即可。

  设备寻址:
本例程实现的是两个点间的通信,各自的地址只因设置为“开关”或者“灯”而不同,不存在地址安排等一系列复杂的网络问题。如下代码:
static void appSwitch()  //开关
{
    … …
    // Initialize BasicRF
    basicRfConfig.myAddr = SWITCH_ADDR;
    … …
}

static void appLight() //灯
{
  … …
    // Initialize BasicRF
    basicRfConfig.myAddr = LIGHT_ADDR;
    … …
}

// BasicRF address definitions
#define PAN_ID                0x2007
#define SWITCH_ADDR           0x2520
#define LIGHT_ADDR            0xBEEF

  [五]扩展思考
  1. 802.15.4的整个数据包结构,数据是如何一个比特一个比特发出去并接收的,每组数据代表什么意思?
  2. 802.15.4的数据是如何进行加密的?

附件:TI Basic RF简单点对点传输协议源代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
xiaoxien 发表于 2014-9-22 20:12:18 | 显示全部楼层
vblyx 发表于 2010-7-20 09:03
我使用IAR 7.6编译light_switch.eww工作 提示出错
Error[e12]: Unable to open file 'lnk51ew_cc2530b.xc ...

1.选择project
2.右键—>Option
3.Linker
4.找到config

5.在Search Paths输入“$TOOLKIT_DIR$\config\devices\Texas Instruments\lnk51ew_cc2530F256.xcl”
6.注意选上override default

然后就可以了。
品味开心茶 发表于 2010-7-7 09:34:30 | 显示全部楼层
奥特曼,真神速
echo 发表于 2010-7-15 23:43:02 | 显示全部楼层
在 TI 官网的下载地址能否共享一个
vblyx 发表于 2010-7-19 17:18:19 | 显示全部楼层
谢谢,支持你!!!
vblyx 发表于 2010-7-20 09:03:14 | 显示全部楼层
我使用IAR 7.6编译light_switch.eww工作 提示出错
Error[e12]: Unable to open file 'lnk51ew_cc2530b.xcl'
                         请高手解答!!!
 楼主| outman 发表于 2010-7-20 10:07:08 | 显示全部楼层
见下图设置:


此处点击浏览,找到lnk51ew_cc2530b.xcl,具体在\Program Files\IAR Systems\Embedded Workbench 5.3\8051\config下。

然后再试下,不知道能不能帮到你

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
James1688 发表于 2010-7-28 15:12:02 | 显示全部楼层
感謝奥特曼--outman分享!!
xingqing 发表于 2010-7-29 23:58:26 | 显示全部楼层
六楼的兄弟提到的'lnk51ew_cc2530b.xcl这个东西 到底他的作用是什么呢?
xingqing 发表于 2010-7-30 00:19:08 | 显示全部楼层
有看到断言这里的程序,如下#define HAL_ASSERT(expr)   st( if (!( expr )) halAssertHandler(); )  其中的expr指的是什么呢
xingqing 发表于 2010-7-30 00:21:34 | 显示全部楼层
不好意思 我没看清楚 上面那个不是个问题 嘿嘿
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表