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