Chinaunix首页 | 论坛 | 博客
  • 博客访问: 281379
  • 博文数量: 59
  • 博客积分: 1346
  • 博客等级: 中尉
  • 技术积分: 461
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-06 17:17
文章分类

全部博文(59)

文章存档

2012年(9)

2011年(50)

分类: 嵌入式

2011-04-16 09:19:15

zigbee无线数据透明传输系统1.4.3和1.4.2的差不多。
 
协调器工程设置选项
CC2430EB          
COORDINATOR_BINDING
HAL_UART              串口
SERIAL_APP_PORT=0     串口号,初始化中位0
xLCD_SUPPORTED       没有lcd,取消预编译
 
REFLECTOR          1.4.3中多了这个绑定,
 
路由和终端设备工程选项设置
 
CC2430EB
NWK_AUTO_POLL   //自动加入网络
HAL_UART
SERIAL_APP_PORT=0
xLCD_SUPPORTED
xPOWER_SAVING
 
任务和事件
#define SERIALAPP_MSG_RTRY_EVT       0x0001 //重发数据事件
#define SERIALAPP_RSP_RTRY_EVT       0x0002 //重发响应信息事件
#define SERIALAPP_MSG_SEND_EVT       0x0004 //发送数据事件
//#define SERIALAPP_AUTO_FIND_EVT      0x0008 //自动寻找目的设备事件,14.3用的是广播描述符绑定Match_Desc_rsp,这两个都是直接地址模式。
 
static void SerialApp_SendData( uint8 *buf, uint8 len ) 发送事件
 
 
信道和PANID
 
在f8wConfig.cfg中有信道和PANID的设置
 
信道设置
//-DDEFAULT_CHANLIST=0x04000000  // 26 - 0x1A
//-DDEFAULT_CHANLIST=0x02000000  // 25 - 0x19
//-DDEFAULT_CHANLIST=0x01000000  // 24 - 0x18
//-DDEFAULT_CHANLIST=0x00800000  // 23 - 0x17
//-DDEFAULT_CHANLIST=0x00400000  // 22 - 0x16
//-DDEFAULT_CHANLIST=0x00200000  // 21 - 0x15
//-DDEFAULT_CHANLIST=0x00100000  // 20 - 0x14
//-DDEFAULT_CHANLIST=0x00080000  // 19 - 0x13
//-DDEFAULT_CHANLIST=0x00040000  // 18 - 0x12
//-DDEFAULT_CHANLIST=0x00020000  // 17 - 0x11
//-DDEFAULT_CHANLIST=0x00010000  // 16 - 0x10
//-DDEFAULT_CHANLIST=0x00008000  // 15 - 0x0F
//-DDEFAULT_CHANLIST=0x00004000  // 14 - 0x0E
//-DDEFAULT_CHANLIST=0x00002000  // 13 - 0x0D
//-DDEFAULT_CHANLIST=0x00001000  // 12 - 0x0C
-DDEFAULT_CHANLIST=0x00000800  // 11 - 0x0B
 
zigbee系统有11个信道协调器将在其中一个默认信道上建立网络,路由器和终端节点也将选择自己的一个默认信道加入网络,路由器和终端节的默认信道和协调器的一致,这样通过改变信道就能建立不同的网络,避免干扰。
 
PANID设置
 
zigbee还有一个方法解决干扰问题,PANID,PANID指网络编号,范围是0x0001-0xFFFF,可通过给不同的网络
设置不同的PANID来区分网络,避免干扰。在f8wConfig.cfg中可以设置DZDAPP_CONFIG_PAN_ID值,本系统设置-DZDAPP_CONFIG_PAN_ID=0x1001,1.4.3一般都是oxFFFF。终端节点和路由器的DZDAPP_CONFIG_PAN_ID与协调器一样。
 
命令和簇
本系统需要定义两个命令,一个用于传输,另一个用于接收数据响应。
#define SERIALAPP_MAX_CLUSTERS       2
#define SERIALAPP_CLUSTERID1         1      //数据传输
#define SERIALAPP_CLUSTERID2         2       //接收数据响应
 
命令列表
const cId_t SerialApp_ClusterList[SERIALAPP_MAX_CLUSTERS] =
{
  SERIALAPP_CLUSTERID1, //数据传输
  SERIALAPP_CLUSTERID2  //接收数据响应
};
 
建网与入网

串口设置

#if !defined( SERIAL_APP_PORT )
#define SERIAL_APP_PORT  0 //串口号
#endif

#if !defined( SERIAL_APP_BAUD )
// CC2430 only allows 38.4k or 115.2k.
#define SERIAL_APP_BAUD  HAL_UART_BR_38400 //串口波特率
//#define SERIAL_APP_BAUD  HAL_UART_BR_115200
#endif

串口初始化
 
halUARTCfg_t uartConfig; //串口配置信息
 
  SerialApp_MsgID = 0x00;
  SerialApp_SeqRx = 0xC3; //接收序列号
  SerialApp_TaskID = task_id; //任务
 
  SerialApp_DstAddr.endPoint = 0; //目的设备端口
  SerialApp_DstAddr.addr.shortAddr = 0; //目的地址
  SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent; //目的地址模式
 
  SerialApp_RspDstAddr.endPoint = 0;
  SerialApp_RspDstAddr.addr.shortAddr = 0;
  SerialApp_RspDstAddr.addrMode = (afAddrMode_t)AddrNotPresent;
 
  afRegister( (endPointDesc_t *)&SerialApp_epDesc ); //注册端口描述符
 
  RegisterForKeys( task_id ); //注册按键事件
 
  uartConfig.configured           = TRUE;              // 2430 don't care.
  uartConfig.baudRate             = SERIAL_APP_BAUD;   //波特率
  uartConfig.flowControl          = FALSE;        //流量控制
  uartConfig.flowControlThreshold = SERIAL_APP_THRESH; //流控阈值
  uartConfig.rx.maxBufSize        = SERIAL_APP_RX_MAX; //最大接收量
  uartConfig.tx.maxBufSize        = SERIAL_APP_TX_MAX; //最大发送量
  uartConfig.idleTimeout          = SERIAL_APP_IDLE;   // 2430 don't care.
  uartConfig.intEnable            = TRUE;              // 2430 don't care.
#if SERIAL_APP_LOOPBACK
  uartConfig.callBackFunc         = rxCB_Loopback;
#else
  uartConfig.callBackFunc         = rxCB; //接收回调函数
#endif
  HalUARTOpen (SERIAL_APP_PORT, &uartConfig); //打开串口
 

数据通信
当按键绑定后,通过上位机给串口发送数据,接收上位机的串口会调用接收回调函数rxCB,初始化中有函数
#if SERIAL_APP_LOOPBACK
  uartConfig.callBackFunc         = rxCB_Loopback;
#else
  uartConfig.callBackFunc         = rxCB; //接收回调函数
#endif
 
当zigbee的串口缓存器中接收到数据 len = HalUARTRead( port, buf+1, SERIAL_APP_RX_CNT-1 );读一个buffer到串口。这时就会通过函数osal_set_event( SerialApp_TaskID,SERIALAPP_MSG_SEND_EVT );触发SERIALAPP_MSG_SEND_EVT事件,无线数据发送函数被调用void SerialApp_SendData( uint8 *buf, uint8 len )。将无线数据发送到接收节点。
 
重发机制
 
接收节点收到接收数据命令SERIALAPP_CLUSTERID1后,利用函数 HalUARTWrite将数据发送到串口。
发送节点在发送完数据之后会等待接收节点返回接收数据响应,接收节点返回接收数据响应的函数为  stat = AF_DataRequest( &(pkt->srcAddr), (endPointDesc_t*)&SerialApp_epDesc,
                          SERIALAPP_CLUSTERID2, SERIAL_APP_RSP_CNT , rspBuf,
                          &SerialApp_MsgID, 0, AF_DEFAULT_RADIUS );
当发送节点收到返回接收数据响应命令SERIALAPP_CLUSTERID2后,会判断接收节点串口状态,函数
case SERIALAPP_CLUSTERID2:
    if ( (pkt->cmd.Data[1] == SerialApp_SeqTx) &&
        ((pkt->cmd.Data[0] == OTA_SUCCESS) ||         //表示接收成功,发送节点不用重发
         (pkt->cmd.Data[0] == OTA_DUP_MSG)) )        //接收节点串口繁忙,启动重发机制
 
 
 
osal_start_timerEx( SerialApp_TaskID, SERIALAPP_RSP_RTRY_EVT,
                         SERIALAPP_RSP_RTRY_TIMEOUT );   //接收节点重发数据接收响应事件
 
 osal_stop_timerEx( SerialApp_TaskID, SERIALAPP_MSG_RTRY_EVT ); //发送节点重发数据事件。
 
 
四种地址模式(绑定)
 
1 直接地址模式
 
ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
                        SERIALAPP_PROFID,
                        SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
                        SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
                        FALSE );
也叫匹配描述符绑定,一般相当于广播绑定,网络中可能有一个或多个与本节点端口匹配的设备,本节点只接受其中一个节点的设备信息,既一对一绑定。处理函数是:
 
 case Match_Desc_rsp:
      {
        ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
        if ( pRsp )
        {
          if ( pRsp->status == ZSuccess && pRsp->cnt )
          {
            SerialApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
            SerialApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
            // Take the first endpoint, Can be changed to search through endpoints
            SerialApp_DstAddr.endPoint = pRsp->epList[0];
           
            // Light LED
            HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
          }
          osal_mem_free( pRsp );
        }
      }
  
2 间接地址模式
 
也叫终端绑定,当按键按下时,调用函数
 ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
                            SerialApp_epDesc.endPoint,
                            SERIALAPP_PROFID,
                            SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
                            SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
                            FALSE );
 
终端绑定实际上是两个终端设备通过与协调器绑定,实现两个终端设备之间互相通信。处理函数
 
  case End_Device_Bind_rsp:
 
3 广播模式
 
广播模式一般采用匹配符绑定方式,和直接地址模式相似,只是在发送函数中加入下列语句
  SerialApp_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//自己添加
   SerialApp_DstAddr.addr.shortAddr = 0xffff;//自己修改,用于协调器广播
然后会调用 AF_DataRequest函数,这样既可以将协调器数据发给网络中的所有设备。
 
4 组模式(组播模式)
 
 aps_Group_t SerialApp_Group;
  SerialApp_Group.ID = 0x0001;
  osal_memcpy(SerialApp_Group.name,"Broad Group",11);
 
  static afAddrType_t SerialApp_GrpDstAddr;
  SerialApp_GrpDstAddr.addrMode = (afAddrMode_t)afAddrGroup;
  SerialApp_GrpDstAddr.endPoint = SERIALAPP_ENDPOINT;
  SerialApp_GrpDstAddr.addr.shortAddr = SerialApp_Group.ID;
 
aps_AddGroup(SERIALAPP_ENDPOINT,&SerialApp_Group);
阅读(2620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~