关于在CC2430中基于ZIGBEE的串口通信.docx

上传人:b****8 文档编号:23787379 上传时间:2023-05-20 格式:DOCX 页数:20 大小:23.29KB
下载 相关 举报
关于在CC2430中基于ZIGBEE的串口通信.docx_第1页
第1页 / 共20页
关于在CC2430中基于ZIGBEE的串口通信.docx_第2页
第2页 / 共20页
关于在CC2430中基于ZIGBEE的串口通信.docx_第3页
第3页 / 共20页
关于在CC2430中基于ZIGBEE的串口通信.docx_第4页
第4页 / 共20页
关于在CC2430中基于ZIGBEE的串口通信.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

关于在CC2430中基于ZIGBEE的串口通信.docx

《关于在CC2430中基于ZIGBEE的串口通信.docx》由会员分享,可在线阅读,更多相关《关于在CC2430中基于ZIGBEE的串口通信.docx(20页珍藏版)》请在冰豆网上搜索。

关于在CC2430中基于ZIGBEE的串口通信.docx

关于在CC2430中基于ZIGBEE的串口通信

就跟我自己承诺的一样,我会发一篇关于zigbee串口通信的。

 虽然这个是我五月份就做的东西,但是现在看来,还是有那么一群人对这个纠缠不清。

但是,这个其实很简单。

 事实上zigbee协议栈2006是有自己集成好了串口函数的,就在MT层的SPIMgr.c文件里面。

这里是一部分的源码:

 

voidSPIMgr_Init()

{

 halUARTCfg_tuartConfig;

 

 App_TaskID=0;

 

 uartConfig.configured          =TRUE;

 uartConfig.baudRate            =SPI_MGR_DEFAULT_BAUDRATE;

 uartConfig.flowControl         =SPI_MGR_DEFAULT_OVERFLOW;

 uartConfig.flowControlThreshold=SPI_MGR_DEFAULT_THRESHOLD;

 uartConfig.rx.maxBufSize       =SPI_MGR_DEFAULT_MAX_RX_BUFF;

 uartConfig.tx.maxBufSize       =SPI_MGR_DEFAULT_MAX_TX_BUFF;

 uartConfig.idleTimeout         =SPI_MGR_DEFAULT_IDLE_TIMEOUT;

 uartConfig.intEnable           =TRUE;

#ifdefined(ZTOOL_P1)||defined(ZTOOL_P2)

 uartConfig.callBackFunc        =SPIMgr_ProcessZToolData;

#elifdefined(ZAPP_P1)||defined(ZAPP_P2)

 uartConfig.callBackFunc        =SPIMgr_ProcessZAppData;

#else

 uartConfig.callBackFunc        =NULL;

#endif

 

#ifdefined(SPI_MGR_DEFAULT_PORT)

 HalUARTOpen(SPI_MGR_DEFAULT_PORT,&uartConfig);

#else

 

 (void)uartConfig;

#endif

 

#ifdefined(ZAPP_P1)||defined(ZAPP_P2)

 

 SPIMgr_MaxZAppBufLen =1;

 SPIMgr_ZAppRxStatus  =SPI_MGR_ZAPP_RX_READY;

#endif

}

voidSPIMgr_RegisterTaskID(bytetaskID)

{

 App_TaskID=taskID;

}

byteSPIMgr_CalcFCS(uint8*msg_ptr,uint8len)

{

 bytex;

 bytexorResult;

 xorResult=0;

 for(x=0;x

   xorResult=xorResult^*msg_ptr;

 return(xorResult);

}

#ifdefined(ZTOOL_P1)||defined(ZTOOL_P2)

voidSPIMgr_ProcessZToolData(uint8port,uint8event)

{

 uint8 ch;

 

 if(event==HAL_UART_TX_FULL)

 {

   //DosomethingwhenTXiffull

   return;

 }

 if(event&(HAL_UART_RX_FULL|HAL_UART_RX_ABOUT_FULL|HAL_UART_RX_TIMEOUT))

 {

   while(Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT))

   {

     HalUARTRead(SPI_MGR_DEFAULT_PORT,&ch,1);

     switch(state)

     {

       caseSOP_STATE:

         if(ch==SOP_VALUE)

           state=CMD_STATE1;

         break;

       caseCMD_STATE1:

         CMD_Token[0]=ch;

         state=CMD_STATE2;

         break;

       caseCMD_STATE2:

         CMD_Token[1]=ch;

         state=LEN_STATE;

         break;

       caseLEN_STATE:

         LEN_Token=ch;

         if(ch==0)

           state=FCS_STATE;

         else

           state=DATA_STATE;

         tempDataLen=0;

         

         SPI_Msg=(mtOSALSerialData_t*)osal_msg_allocate(sizeof(mtOSALSerialData_t)+2+1+LEN_Token);

         if(SPI_Msg)

         {

           

           SPI_Msg->hdr.event=CMD_SERIAL_MSG;

           SPI_Msg->msg=(uint8*)(SPI_Msg+1);

           SPI_Msg->msg[0]=CMD_Token[0];

           SPI_Msg->msg[1]=CMD_Token[1];

           SPI_Msg->msg[2]=LEN_Token;

         }

         else

         {

           state=SOP_STATE;

           return;

         }

         break;

       caseDATA_STATE:

           SPI_Msg->msg[3+tempDataLen++]=ch;

           if(tempDataLen==LEN_Token)

             state=FCS_STATE;

         break;

       caseFCS_STATE:

         FSC_Token=ch;

         

         if((SPIMgr_CalcFCS((uint8*)&SPI_Msg->msg[0],2+1+LEN_Token)==FSC_Token))

         {

           osal_msg_send(MT_TaskID,(byte*)SPI_Msg);

         }

         else

         {

           

           osal_msg_deallocate((uint8*)SPI_Msg);

         }

         

         state=SOP_STATE;

         break;

       default:

        break;

     }

   }

 }

}

#endif//ZTOOL

#ifdefined(ZAPP_P1)||defined(ZAPP_P2)

voidSPIMgr_ProcessZAppData(uint8port,uint8event)

{

 osal_event_hdr_t *msg_ptr;

 uint16length=0;

 uint16rxBufLen =Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);

 

 if((SPIMgr_MaxZAppBufLen!

=0)&&(SPIMgr_MaxZAppBufLen<=rxBufLen))

 {

   length=SPIMgr_MaxZAppBufLen;

 }

 else

 {

   length=rxBufLen;

 }

 

 if(event==HAL_UART_TX_FULL)

 {

   //DosomethingwhenTXiffull

   return;

 }

 if(event&(HAL_UART_RX_FULL|HAL_UART_RX_ABOUT_FULL|HAL_UART_RX_TIMEOUT))

 {

   if(App_TaskID)

   {

     

     if((SPIMgr_ZAppRxStatus==SPI_MGR_ZAPP_RX_READY)&&(length!

=0))

     {

       

        SPIMgr_AppFlowControl(SPI_MGR_ZAPP_RX_NOT_READY);

       

       msg_ptr=(osal_event_hdr_t*)osal_msg_allocate(length+sizeof(osal_event_hdr_t));

       if(msg_ptr)

       {

         msg_ptr->event=SPI_INCOMING_ZAPP_DATA;

         msg_ptr->status=length;

         

         HalUARTRead(SPI_MGR_DEFAULT_PORT,(uint8*)(msg_ptr+1),length);

         

         osal_msg_send(App_TaskID,(uint8*)msg_ptr);

       }

     }

   }

 }

}

voidSPIMgr_ZAppBufferLengthRegister(uint16maxLen)

{

 

 if(maxLen<=SPI_MGR_DEFAULT_MAX_RX_BUFF)

   SPIMgr_MaxZAppBufLen=maxLen;

 else

   SPIMgr_MaxZAppBufLen=1;

}

voidSPIMgr_AppFlowControl(boolstatus)

{

 

 if(status!

=SPIMgr_ZAppRxStatus)

 {

   SPIMgr_ZAppRxStatus=status;

 }

 

 if(status==SPI_MGR_ZAPP_RX_READY)

 {

   SPIMgr_ProcessZAppData(SPI_MGR_DEFAULT_PORT,HAL_UART_RX_TIMEOUT);

 }

}

#endif//ZAPP

 这些意思很明显,特别注意下有色彩背景的代码。

这个其实就是C语言的宏定义。

在zigbee协议栈,这个是用得很多的。

当然,本人自己也很喜欢用这个方法定义,因为简单,而且直观,更重要的是很方便,你可以随便定义你要的部分进行编译。

 呵呵,有点跑题了。

接下来就解释下把,:

 

 uartConfig.configured          =TRUE;

 uartConfig.baudRate            =SPI_MGR_DEFAULT_BAUDRATE;

 uartConfig.flowControl         =SPI_MGR_DEFAULT_OVERFLOW;

 uartConfig.flowControlThreshold=SPI_MGR_DEFAULT_THRESHOLD;

 uartConfig.rx.maxBufSize       =SPI_MGR_DEFAULT_MAX_RX_BUFF;

 uartConfig.tx.maxBufSize       =SPI_MGR_DEFAULT_MAX_TX_BUFF;

 uartConfig.idleTimeout         =SPI_MGR_DEFAULT_IDLE_TIMEOUT;

 uartConfig.intEnable           =TRUE;

#ifdefined(ZTOOL_P1)||defined(ZTOOL_P2)

 uartConfig.callBackFunc        =SPIMgr_ProcessZToolData;

#elifdefined(ZAPP_P1)||defined(ZAPP_P2)

 uartConfig.callBackFunc        =SPIMgr_ProcessZAppData;

#else

 uartConfig.callBackFunc        =NULL;

#endif

 

 

这个就是串口的初始化部分,注意了,上面uartConfig.callBackFunc是一个函数指针,后面的就是这个串口的调用函数。

协议栈默认编了两个固化的,这两个是用于与zibgee的上位机通信的,有特定的协议,是由TI自己定的。

就是一位内TI定义了这个协议,使得如果我们自己编写的话就使用了。

 

这样。

有一种办法,就是跟着它的协议,一下是我得到的TI的串口通信协议:

'***********************************************************************************************

'*                                  协议数据单元的相关说明                                   *

'***********************************************************************************************

'

'   ARMSKY-ZLocation无线定位开发系统使用TI公司的ZigBee协议栈Z-Stackv1.4.2。

为了方便用户与使用

'Z-Stackv1.4.2的目标硬件进行数据交换,Z-Stackv1.4.2中定义了串口通信数据格式。

'

'   串口属性设置如下:

'

'       波特率:

38400bps

'       数据位:

8个

'       停止位:

1个

'       奇偶校验:

'

'   Z-Stackv1.4.2中串口通信数据格式如下:

'

'       ****************************************************

'       *  SOP  *  CMD  *  LEN  *  Data  *  FCS  *

'       ****************************************************

'

'       数据包由多个字段构成,每个字段由1个或多个字节构成。

多字节字段的高位字节首先被发送。

'

'       SOP(包起始):

该字段长度为1字节,值为0x02,表示数据包开始。

'       CMD(命令ID):

该字段长度为2字节,表示数据包的作用。

'       LEN(长度) :

该字段长度为1字节,表示Data字段的长度。

'       Data(数据):

该字段包含要被传输的实际数据,该字段的长度由LEN字段指定。

'       FCS(帧校验序列):

该字段长度为1字节,确保数据包的完整性。

FCS字段值的计算方法是:

'                          从CMD字段开始到Data字段结束,逐个字节进行XOR运算,结果即为FCS字段值。

'                          接收方收到数据包后,从Data字段开始到FCS字段结束,逐个字节进行XOR运算,

'                          结果为0表示接收正确,否则表示错误。

'

'       Z-Stackv1.4.2中定义了很多串口通信数据包,此处只描述定位应用中所需使用的串口通信数据包。

'       其他串口通信数据包格式定义请参看SerialPortInterface_F8W-2003-0001_.pdf。

'

'

'   下面给出4个本定位应用中需要用到的串口通信命令数据包的格式定义:

'

'       SYS_PING:

发送该命令给目标设备以检查设备的状态及能力。

格式定义如下:

'

'                 *****************************

'                 * CMD=0x0007 * LEN=0x00 *

'                 *****************************

'

'       SYS_PING_RESPONSE:

该命令是对SYS_PING命令的响应。

格式定义如下:

'

'                 **********************************************

'                 * CMD=0x1007 * LEN=0x02 * Capabilities *

'                 **********************************************

'

'                 Capabilities:

该字段长度为2字节。

该字段值表示目标设备可以处理的接口。

位掩码如下:

'

'                               MT_CAP_MAC0x0001

'                               MT_CAP_NWK0x0002

'                               MT_CAP_AF0x0004

'                               MT_CAP_ZDO0x0008

'                               MT_CAP_USER_TEST0x0010

'                               MT_CAP_SEQ0x0020

'                               MT_CAP_BOOTLOAD0x8000

'

'       SYS_GET_DEVICE_INFO:

发送该命令给目标设备以获得设备的信息。

格式定义如下:

'

'                 *****************************

'                 * CMD=0x0014 * LEN=0x00 *

'                 *****************************

'

'       SYS_GET_DEVICE_INFO_RESPONSE:

该命令是对SYS_GET_DEVICE_INFO命令的响应。

格式定义如下:

'

'                 *******************************************************************************************************************************

'                 *CMD=0x1014*LEN=0x03*Status*IEEEAddress*ShortAddress*DeviceType*DeviceState*NumAssocDevices*AssocDevicesList*

'                 *******************************************************************************************************************************

'

'                 LEN=0x03 SerialPortInterface_F8W-2003-0001_.pdf中第16页中有定义,但存在疑问,不过不影响本应用。

'                 Status:

该字段长度为1字节。

0表示成功,1表示失败。

如果IEEEAddress或/和ShortAddress不在有效范围内,则该字段值为1。

'                 IEEEAddress:

该字段长度为8字节。

'                 ShortAddress:

该字段长度为2字节。

'                 DeviceType:

该字段长度为1字节,用来表示设备类型。

位0到位2用来指示设备运行为协调器、路由器还是终端设备。

'                 DeviceState:

该字段长度为1字节,用来表示设备状态。

可能的设备状态请参看SerialPortInterface_F8W-2003-0001_.pdf中第16页中的定义。

'                 N

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1