1、关于在CC2430中基于ZIGBEE的串口通信就跟我自己承诺的一样,我会发一篇关于zigbee串口通信的。虽然这个是我五月份就做的东西,但是现在看来,还是有那么一群人对这个纠缠不清。但是,这个其实很简单。事实上zigbee协议栈2006是有自己集成好了串口函数的,就在MT层的SPIMgr.c文件里面。这里是一部分的源码:void SPIMgr_Init () halUARTCfg_t uartConfig; App_TaskID = 0; uartConfig.configured = TRUE; uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;
2、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
3、= TRUE;#if defined (ZTOOL_P1) | defined (ZTOOL_P2) uartConfig.callBackFunc = SPIMgr_ProcessZToolData;#elif defined (ZAPP_P1) | defined (ZAPP_P2) uartConfig.callBackFunc = SPIMgr_ProcessZAppData;#else uartConfig.callBackFunc = NULL;#endif#if defined (SPI_MGR_DEFAULT_PORT) HalUARTOpen (SPI_MGR_DEFAULT
4、_PORT, &uartConfig);#else (void)uartConfig;#endif#if defined (ZAPP_P1) | defined (ZAPP_P2) SPIMgr_MaxZAppBufLen = 1; SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;#endifvoid SPIMgr_RegisterTaskID( byte taskID ) App_TaskID = taskID;byte SPIMgr_CalcFCS( uint8 *msg_ptr, uint8 len ) byte x; byte xorResult
5、; xorResult = 0; for ( x = 0; x hdr.event = CMD_SERIAL_MSG; SPI_Msg-msg = (uint8*)(SPI_Msg+1); SPI_Msg-msg0 = CMD_Token0; SPI_Msg-msg1 = CMD_Token1; SPI_Msg-msg2 = LEN_Token; else state = SOP_STATE; return; break; case DATA_STATE: SPI_Msg-msg3 + tempDataLen+ = ch; if ( tempDataLen = LEN_Token ) stat
6、e = FCS_STATE; break; case FCS_STATE: FSC_Token = ch; if (SPIMgr_CalcFCS (uint8*)&SPI_Msg-msg0, 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#if defined (ZAPP_P1) | de
7、fined (ZAPP_P2)void SPIMgr_ProcessZAppData ( uint8 port, uint8 event ) osal_event_hdr_t *msg_ptr; uint16 length = 0; uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT); if (SPIMgr_MaxZAppBufLen != 0) & (SPIMgr_MaxZAppBufLen event = SPI_INCOMING_ZAPP_DATA; msg_ptr-status = length; HalUARTRead(
8、 SPI_MGR_DEFAULT_PORT, (uint8 *)(msg_ptr + 1), length ); osal_msg_send( App_TaskID, (uint8 *)msg_ptr ); void SPIMgr_ZAppBufferLengthRegister ( uint16 maxLen ) if (maxLen = SPI_MGR_DEFAULT_MAX_RX_BUFF) SPIMgr_MaxZAppBufLen = maxLen; else SPIMgr_MaxZAppBufLen = 1;void SPIMgr_AppFlowControl ( bool stat
9、us ) 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协议栈,这个是用得很多的。当然,本人自己也很喜欢用这个方法定义,因为简单,而且直观,更重要的是很方便,你可以随便定义你要的部分进行编译。
10、呵呵,有点跑题了。接下来就解释下把,: 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
11、_DEFAULT_MAX_TX_BUFF; uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT; uartConfig.intEnable = TRUE;#if defined (ZTOOL_P1) | defined (ZTOOL_P2) uartConfig.callBackFunc = SPIMgr_ProcessZToolData;#elif defined (ZAPP_P1) | defined (ZAPP_P2) uartConfig.callBackFunc = SPIMgr_ProcessZAppData;#else ua
12、rtConfig.callBackFunc = NULL;#endif这个就是串口的初始化部分,注意了, 上面 uartConfig.callBackFunc是一个函数指针,后面的就是这个串口的调用函数。协议栈默认编了两个固化的,这两个是用于与zibgee的上位机通信的,有特定的协议,是由TI自己定的。就是一位内TI定义了这个协议,使得如果我们自己编写的话就使用了。这样。有一种办法,就是跟着它的协议,一下是我得到的TI的串口通信协议:* 协议数据单元的相关说明 * ARMSKY-ZLocation无线定位开发系统使用TI公司的ZigBee协议栈Z-Stack v1.4.2。为了方便用户与使用Z
13、-Stack v1.4.2的目标硬件进行数据交换,Z-Stack v1.4.2中定义了串口通信数据格式。 串口属性设置如下: 波 特 率:38400bps 数 据 位:8个 停 止 位:1个 奇偶校验:无 Z-Stack v1.4.2中串口通信数据格式如下: * * SOP * CMD * LEN * Data * FCS * * 数据包由多个字段构成,每个字段由1个或多个字节构成。多字节字段的高位字节首先被发送。 SOP(包起始):该字段长度为1字节,值为0x02,表示数据包开始。 CMD(命令ID):该字段长度为2字节,表示数据包的作用。 LEN(长度) :该字段长度为1字节,表示Data
14、字段的长度。 Data(数据) :该字段包含要被传输的实际数据,该字段的长度由LEN字段指定。 FCS(帧校验序列):该字段长度为1字节,确保数据包的完整性。FCS字段值的计算方法是: 从CMD字段开始到Data字段结束,逐个字节进行XOR运算,结果即为FCS字段值。 接收方收到数据包后,从Data字段开始到FCS字段结束,逐个字节进行XOR运算, 结果为0表示接收正确,否则表示错误。 Z-Stack v1.4.2中定义了很多串口通信数据包,此处只描述定位应用中所需使用的串口通信数据包。 其他串口通信数据包格式定义请参看Serial Port Interface_F8W-2003-0001_.
15、pdf。 下面给出4个本定位应用中需要用到的串口通信命令数据包的格式定义: SYS_PING:发送该命令给目标设备以检查设备的状态及能力。格式定义如下: * * CMD=0x0007 * LEN=0x00 * * SYS_PING_RESPONSE:该命令是对SYS_PING命令的响应。格式定义如下: * * CMD=0x1007 * LEN=0x02 * Capabilities * * Capabilities:该字段长度为2字节。该字段值表示目标设备可以处理的接口。位掩码如下: MT_CAP_MAC 0x0001 MT_CAP_NWK 0x0002 MT_CAP_AF 0x0004 MT
16、_CAP_ZDO 0x0008 MT_CAP_USER_TEST 0x0010 MT_CAP_SEQ 0x0020 MT_CAP_BOOTLOAD 0 x 8000 SYS_GET_DEVICE_INFO:发送该命令给目标设备以获得设备的信息。格式定义如下: * * CMD=0x0014 * LEN=0x00 * * SYS_GET_DEVICE_INFO_RESPONSE:该命令是对SYS_GET_DEVICE_INFO命令的响应。格式定义如下: * * CMD=0x1014 * LEN=0x03 * Status * IEEEAddress * ShortAddress * DeviceT
17、ype * DeviceState * NumAssocDevices * AssocDevicesList * * LEN=0x03 Serial Port Interface_F8W-2003-0001_.pdf中第16页中有定义,但存在疑问,不过不影响本应用。 Status:该字段长度为1字节。0表示成功,1表示失败。如果IEEEAddress或/和ShortAddress不在有效范围内,则该字段值为1。 IEEEAddress:该字段长度为8字节。 ShortAddress:该字段长度为2字节。 DeviceType:该字段长度为1字节,用来表示设备类型。位0到位2用来指示设备运行为协调器、路由器还是终端设备。 DeviceState:该字段长度为1字节,用来表示设备状态。可能的设备状态请参看Serial Port Interface_F8W-2003-0001_.pdf中第16页中的定义。 N
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1