精简!基于CC2530(TI)Zigbee无线组网控制LED实验

最近应公司需求,学习Zigbee组网,网上教学鱼目混珠,质量参差不齐,新手入门苦于找资料,特此写一篇博客。

环境搭建以及一些基本准备事项在此不过多赘述,只讲在工程实际应用中我们应该添加的代码。

Zstack协议包安装:ZStack-CC2530-2.5.1a.rar
链接: https://pan.baidu.com/s/1yy2lpKbg35rlDv9hltTLag?pwd=7maz 提取码: 7maz

第一步:

按照路径ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB打开SampleApp.eww工程

打开SampleApp.c文件

第二步:

找到SampleApp_MessageMSGCB(接收数据函数)在里面添加如下:

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  uint16 flashTime;
  byte buf[3]; 

  switch ( pkt->clusterId ) //判断簇ID
  {
    case SAMPLEAPP_PERIODIC_CLUSTERID: //收到广播数据
      osal_memset(buf, 0 , 3);
      osal_memcpy(buf, pkt->cmd.Data, 2); //复制数据到缓冲区中
      
      if(buf[0]=='D' && buf[1]=='1')      //判断收到的数据是否为"D1"         
      {

          HalLedBlink(HAL_LED_1, 0, 50, 500);//如果是则Led1间隔500ms闪烁
#if defined(ZDO_COORDINATOR) //协调器收到"D1"后,返回"D1"给终端,让终端Led1也闪烁
          SampleApp_SendPeriodicMessage();
#endif

//上面这段#if #endif是编译器区分你是协调器还是终端的重要代码,
//该代码含义为:如果定义了协调器这个宏定义,那么就处理协调器的逻辑,否则不做处理

      }
      else
      {
          HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);                   
      }
      break;

    case SAMPLEAPP_FLASH_CLUSTERID: //收到组播数据
      flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
      HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
      break;
  }
}

我们的应用层代码直接在收到广播数据判断下写就好。

定义的LED1灯需要在hal_board_cfg.h文件下注册,HalLedBlink函数是HAL库封装好的闪烁函数,还有很多LED灯操作的函数可以自己去阅读源码调用。

HAL库封装的硬件抽象层,打开hal_board_cfg.h文件按照自己的开发板修改。

例如您的LED灯定义在P1_2端口,需要修改为:LED1_BV    BV(2)    LED1_SBIT  P1_2。

第三步:

找到SampleApp_SendPeriodicMessage(发送周期信息函数)在里面添加:

void SampleApp_SendPeriodicMessage( void )
{
  byte SendData[3]="D1";

  // 调用AF_DataRequest将数据无线广播出去
  if( AF_DataRequest( &SampleApp_Periodic_DstAddr,//发送目的地址+端点地址和传送模式
                       &SampleApp_epDesc,//源(答复或确认)终端的描述(比如操作系统中任务ID等)源EP
                       SAMPLEAPP_PERIODIC_CLUSTERID, //被Profile指定的有效的集群号
                       2,       // 发送数据长度
                       SendData,// 发送数据缓冲区
                       &SampleApp_TransID,     // 任务ID号
                       AF_DISCV_ROUTE,      // 有效位掩码的发送选项
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )  //传送跳数,通常设置为AF_DEFAULT_RADIUS
  {
  }
  else
  {
    HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
    // Error occurred in request to send.
  }
}

一个开发板下载协调器,一个开发板下载终端。


当两个开发板的LED1闪烁说明发送数据是正常的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值