关于在CC2430中基于ZIGBEE的串口通信.docx
- 文档编号:9699915
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:20
- 大小:23.29KB
关于在CC2430中基于ZIGBEE的串口通信.docx
《关于在CC2430中基于ZIGBEE的串口通信.docx》由会员分享,可在线阅读,更多相关《关于在CC2430中基于ZIGBEE的串口通信.docx(20页珍藏版)》请在冰点文库上搜索。
关于在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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 关于 CC2430 基于 ZIGBEE 串口 通信
文档标签
- 基于C#串口通信
- 基于FPGA串口通信
- 基于MATLABMIMO通信
- 基于Labview串口通信
- 基于matlabFM通信
- EDA基于VHDL串口
- 基于SystemViewPSK通信
- 基于matlabMIMO通信
- 基于armuclinux串口
- 基于LABview串口通讯
- 基于MatlabMIMO通信
- 基于MatlabGUI串口通信
- 基于MATLABQDPSK通信
- 基于VBPC串口
- 基于MATLABWCDMA通信
- 基于VHDLRS232串口
- 基于DSP串行通信
- c++串口通信
- TMSFDSPPC串口通信
- VisualC++与串口通信C++串口
- 串口通信
- 通用串口通信
- RS232串口通信C++
- 18155LED串口通信
- 串口异步通信
- 串口通信论文