ZigBeeÎÞÏßͨÐÅÍøÂçÈí¼þ±ÏÒµÉè¼Æ - ͼÎÄ ÏÂÔØ±¾ÎÄ

// Successfully started a ZigBee network

if ( devState == DEV_COORD_STARTING ) {

devState = DEV_ZB_COORD; }

osal_pwrmgr_device( PWRMGR_ALWAYS_ON );

osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); }

¡­¡­ }

¢à ZDOʼþÂÖѯÖд¦ÀíZDO״̬¸Ä±äʼþ

void ZDO_UpdateNwkStatus( devStates_t state )

{

// Endpoint/Interface descriptor list. epList_t *epDesc = epList;

byte bufLen = sizeof(osal_event_hdr_t); osal_event_hdr_t *msgPtr;

ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr(); (void)NLME_GetExtAddr(); // Load the saveExtAddr pointer. while ( epDesc ) {

if ( epDesc->epDesc->endPoint != ZDO_EP ) {

msgPtr = (osal_event_hdr_t *)osal_msg_allocate( bufLen ); if ( msgPtr ) {

msgPtr->event = ZDO_STATE_CHANGE; // Command ID msgPtr->status = (byte)state;

osal_msg_send( *(epDesc->epDesc->task_id), (byte *)msgPtr ); } }

epDesc = epDesc->nextDesc; } }

£¨2£©ÎÞÏßת´®¿ÚÊý¾Ý´«Êä

Эµ÷ÔÚÍøÂçÆô¶¯ºó£¬¾Í¿ªÊ¼¼àÌýÎÞÏßÐźźʹ®¿ÚÐÅÏ¢¡£Ò»µ©Óнڵã¼ÓÈëµ½ÍøÂçµ±ÖУ¬Ð­µ÷Æ÷½«»á½«Ð¼ÓÈë½ÚµãµÄµØÖ·ÐÅÏ¢»ã±¨¸øÍø¹Ø¡£µ±Ð­µ÷Æ÷¼àÌýµ½·¢Ë͸ø×Ô¼ºÎÞÏßÐźÅʱ£¬½«´ÓÎÞÏßÐźŰüÖнâÎö³öÃüÁîÖ¡£¬ÔÚÈ·ÈÏÃüÁî¸ñʽÕýÈ·ÎÞÎóʱ£¬Ð­µ÷Æ÷½«¸ÃÃüÁî֡ͨ¹ý´®¿Ú·¢Ë͸øÍø¹Ø£¬ÆäʵÏÖ´úÂëÈçÏ£º

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )

{

20

#ifdef COORD uint8 i;

memcpy(RfRx.RxBuf,pkt->cmd.Data,32);

if((RfRx.RXDATA.Head == '&') && (RfRx.RXDATA.LastByte == '*')) {

memcpy(UartTxBuf.TxBuf,RfRx.RxBuf,32); for(i=0; i<8; i++) {

UartTxBuf.TXDATA.Laddr[i] = RfRx.RXDATA.Laddr[i]; }

for(i=0; i<2; i++) {

UartTxBuf.TXDATA.Saddr[i] = RfRx.RXDATA.Saddr[1-i]; }

UartTxBuf.TXDATA.CRC = CheckUartData(&UartTxBuf.TxBuf[1],29); HalUARTWrite ( HAL_UART_PORT_0, UartTxBuf.TxBuf, 32); } #endif ¡­¡­ }

£¨3£©´®¿ÚתÎÞÏßÊý¾Ý´«Êä

Эµ÷Æ÷²»µ«Òª¼àÌýÎÞÏßÍøÂçÖеÄÊý¾ÝÖ¡£¬»¹ÒªÓëÍø¹Ø½øÐÐÊý¾Ý½»»¥£¬±¾ÏµÍ³ÊÇͨ¹ý´®¿ÚʵÏÖÓëÍø¹ØµÄͨÐŵġ£ÔÚZ-StackÖÐÐèҪʹÄÜMT¼à²âÈÎÎñ²ÅÄÜʵÏÖ¶Ô´®¿ÚÊý¾ÝµÄÊÕ·¢£¬²¿·Ö³õʼ»¯´úÂëÈçÏÂËùʾ:

void osalInitTasks( void ) {

??

#if defined( MT_TASK ) MT_TaskInit( taskID++ ); #endif ?? }

ÔÚMT_TaskInitº¯ÊýÖе÷ÓÃÁËMT_UartInitº¯Êý£¬¸Ãº¯Êý¾ÍÊÇ´®¿ÚµÄ³õʼ»¯º¯Êý¡£¾ßÌå³õʼ»¯°üÀ¨¶Ô´®¿ÚµÄ²¨ÌØÂÊ£¬»º´æÇø´óС£¬Á÷¿ØÖƵȽøÐÐÁËÅäÖã¬Ìرð¾ö¶¨ÁË´®¿ÚµÄ´¦Àí·½Ê½ÎªDMA·½Ê½£¬×îºó»¹Ö¸¶¨ÁË´®¿ÚÊý¾Ý´¦ÀíµÄ»Øµ÷º¯Êý¡£Í¨¹ýÉèÖÃHAL_UART_DMAºêΪ1£¬ÔÙµ÷ÓÃHalUARTOpenº¯Êý´ò¿ª´®¿Úʱ£¬ÅжϸÃÅäÖú꣬ѡÔñ²ÉÓÃDMA·½Ê½´ò¿ª´®¿Ú£¬¼´µ÷ÓÃHalUARTOpenDMAº¯Êý£¬³õʼ»¯DMA£¬´ò¿ª´®¿Ú¡£

Íê³É³õʼ»¯¹¤×÷ºó£¬È»ºóÔÚÏàÓ¦µÄ²ã×¢²áÒ»¸ö´®¿Úʼþ£¬¼´¿É½«´®¿ÚÊý¾Ý·´À¡µ½ÏàÓ¦µÄ²ã¡£±¾ÏµÍ³ÔÚÓ¦Óòã×¢²áÁË´®¿Úʼþ£¬ÔÚϵͳÏûÏ¢ÖжԴ®¿ÚÏûÏ¢½øÐÐ

21

ÁË´¦Àí£¬Æä´¦Àí´úÂëÈçÏ£º

void UartRxComCallBack(void) { uint16 DstAddr; if((UartRxBuf.RxBuf[0] == '&') && (UartRxBuf.RxBuf[31] == '*')) { memcpy(RfTx.TxBuf,UartRxBuf.RxBuf,32); DstAddr = RfTx.TXDATA.Saddr[0]; DstAddr <<= 8; DstAddr += RfTx.TXDATA.Saddr[1]; if(SendData(DstAddr, RfTx.TxBuf, 32) == 0)//·¢ËÍÊý¾Ýʧ°Ü { memset(&RfTx.TxBuf[4],'x',26); memcpy(RfTx.TXDATA.Laddr,UartRxBuf.RXDATA.Laddr,8);//¼ÓÈëµØÖ· RfTx.TXDATA.DataBuf[0] = 'E'; RfTx.TXDATA.DataBuf[1] = '1';//´®¿ÚÊä³öE1 memcpy(UartTxBuf.TxBuf,RfTx.TxBuf,32); UartTxBuf.TXDATA.CRC = CheckUartData(&UartTxBuf.TxBuf[1],29); HalUARTWrite(HAL_UART_PORT_0, UartTxBuf.TxBuf, 32);//´®¿ÚÊä³ö } else { P1_1 = !P1_1; } } memset(UartRxBuf.RxBuf,0,32); }

¶Ô´®¿ÚÏûÏ¢µÄ´¦ÀíÖУ¬Ð­µ÷Æ÷Ê×ÏȶÔÃüÁîÖ¡µÄ¸ñʽ½øÐÐÁËÈ·ÈÏ£¬È»ºóͨ¹ýmemcpy(RfTx.TxBuf,UartRxBuf.RxBuf,32)£»´Ó´®¿Ú½ÓÊÕ»º´æÇø½«Êý¾Ý¿½±´µ½ÎÞÏß·¢ËÍ»º´æÇø£¬´Ó»º´æÇøÌáÈ¡³öÄ¿µÄµØÖ·ºó£¬Í¨¹ýÎÞÏß·¢Ëͺ¯ÊýSendData½«Êý¾Ý·¢ËͳöÈ¥¡£

4.1.2 Öն˽ڵãÄ£¿éÈí¼þÉè¼Æ

ZigBee½ÚµãÈí¼þ°üÀ¨¼ÓÈëµ½ÎÞÏßͨÐÅÍøÂ磬²É¼¯¹â´«¸ÐÐÅÏ¢£¬¿ØÖÆLED̨µÆÒÔ¼°²éѯÁ´Â·Á¬½Ó״̬¡£Æä¹¤×÷Á÷³ÌͼÈçͼ18Ëùʾ£º

22

¿ªÊ¼Ó²¼þ³õʼ»¯ZigbeeЭÒéÕ»³õʼ»¯²éÕÒÍøÂçÓÐÍøÂç?YÉêÇë¼ÓÈëN¼ÓÈë³É¹¦?Y´¦ÀíÓû§Ê¼þN

ͼ18 ½ÚµãÈí¼þÉè¼ÆÁ÷³Ìͼ

£¨1£©¼ÓÈëÍøÂç

ÖÕ¶ËÉ豸µÄÆô¶¯ÓëЭµ÷Æ÷²»Í¬ÊÇ´ÓZDO_StartDeviceµÄµ÷ÓÿªÊ¼µÄ£¬¸Ãº¯ÊýÊ×ÏÈÅжÏÉ豸ÀàÐÍÊÇÖÕ¶ËÉ豸£¬È»ºóͨ¹ýµ÷ÓÃZDO_StartDevice º¯ÊýÆô¶¯É豸£¬¸Ãº¯Êýµ÷ÓÃÁËÍøÂç·¢ÏÖÇëÇóº¯ÊýNLME_NetworkDiscoveryRequestÀ´Ñ°ÕÒÒ»¸ö¿ÉÓÃÍøÂ磬ͬÑù£¬Ò²ÓÐÆä¶ÔÓ¦µÄÈ·ÈϺ¯ÊýZDO_NetworkDiscoveryConfirmCB£¬ÔÚÍøÂç·¢ÏÖÈ·ÈϺ¯ÊýÖУ¬¶ÔÍøÂçÐÅÏ¢½øÐÐУÑ飬ÔÙ·¢ËÍÒ»¸öÍøÂç·¢ÏÖÈ·ÈÏÏûÏ¢¸øZDO²ã£¬ZDO²ãµÃÖªÍøÂçÒѾ­·¢Ïֺ󣬻áµ÷ÓÃÍøÂç¼ÓÈëÇëÇóº¯ÊýNLME_JoinRequest£¬¼ÓÈëµ½ÍøÂçµ±ÖУ¬ÍøÂç¼ÓÈëÈ·ÈÏÔòÊÇÔÚ¸üÐÂÍøÂçÐÅÏ¢Ö®ºóÉèÖÃÁËZDO_STATE_CHANGE_EVT£¬Í¨¹ý¸Ãʼþ£¬×îºó»á·¢ËÍÏûÏ¢¸öAPI²ã£¬Í¨ÖªÆ÷½øÐÐÆô¶¯È·ÈÏ£¬´Ó¶øÍê³ÉÕû¸öÆô¶¯¹ý³Ì¡£

¢Ù ZDO_StartDeviceº¯Êý·¢ÏÖÍøÂ磺

void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder )

{

¡­¡­

#if !defined ( ZDO_COORDINATOR ) || defined( SOFT_START )

if ( logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE ) {

23