ZigBee : MC1322x node loses parent after Deep Sleep Wake up

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

ZigBee : MC1322x node loses parent after Deep Sleep Wake up

1,885 Views
Elisa
Contributor III

Hi, I'm working with with codebase 3.0.1 and I have more or less the same problem: I want' my MC1322x ( chip version 2.0) Low Power Node goes to sleep and sends a test message to coordinator when it wake up. But sometimes, after wake up it loses its parents and like in you case "the led 1 blinking, and although I press the button 1 it remains blinking, it doesn´t make anything and it is imposible to rejoin with the coordinator. What is happening?"

 

To send message I added  SendSampleMessage(TRUE); in DeepSleepWakeupStackProc function

 

/* Called each time deep sleep mode is exited. */
void DeepSleepWakeupStackProc
  (
  void
  )
{
   
  TS_SendEvent(gAppTaskID, gAppEvtSyncReq_c);    
  SendSampleMessage(TRUE);
  return;
}

 

and defined this function in BeeApp.c

 

void SendSampleMessage(  bool_t wakeup)
{
  afAddrInfo_t afAddrInfo;
  FLib_MemSet(&afAddrInfo, 0, sizeof(afAddrInfo));

  afAddrInfo.dstAddrMode = gZbAddrMode16Bit_c; /* direct-16 bit*/
  Set2Bytes(afAddrInfo.dstAddr.aNwkAddr, 0x0000); /* short address of coordinator */
  afAddrInfo.dstEndPoint = 0xFF;/*destination endpoint =0xFF : the receiving stack will deliver that message to every endpoint on the node*/
  Copy2Bytes(afAddrInfo.aClusterId, gZclClusterBinaryOutput_c);/* cluster to send it to */

  afAddrInfo.srcEndPoint = appEndPoint;

  afAddrInfo.txOptions = gZclTxOptions;//0; /* to ACK or not to ACK, that is the question... */
  afAddrInfo.radiusCounter = afDefaultRadius_c; /* radius */

  if (wakeup==FALSE)
  {
     AF_DataRequest( & afAddrInfo, 14, "\n Hello World\n" , NULL);

  }
  else
  {
     AF_DataRequest( & afAddrInfo, 14, "\n Goodmorning\n" , NULL); 

  }
}

Labels (1)
0 Kudos
Reply
3 Replies

615 Views
ImranChoudhary
Contributor I

Dear Elisa,

 

This is very annoying that we can't specify the destination address as in HEX formate directly it won't work out.

 

Actual problem is in the line

 

Set2Bytes(afAddrInfo.dstAddr.aNwkAddr, 0x0000); /* short address of coordinator */

 

 

To solve this problem you have to take the variable of type zbNwkAddr_t

ex: zbNwkAddr_t aDestAddress = {0x00, 0x00};

 

and use 

 

Copy2Bytes(afAddrInfo.dstAddr.aNwkAddr, aDestAddress);

 

This may solve the problem.

 

Cheer.

Imran

0 Kudos
Reply

615 Views
Elisa
Contributor III

Hi Imram,

sorry but I'm not sure you are right. The Set2Byte function is made to copy a 16 bit variable to a location, with the bytes swapped if little endian, as you can see in BeeCommon.h

 

/*copies a 16 bit variable to a location with the bytes swapped
  Note needed for big endian
*/
#if !(gBigEndian_c)
void Set2Bytes(void *ptr, uint16_t val);

 

and it is used, as I used, FOR EXAMPLE in  ZdpUtils.c

 

void GetAddressFromService
(
   ...
        case ZdoBackupBindingTableCache_c:
            if (!Cmp2BytesToZero(pPtr->aServerMask))
                Copy2Bytes(pNwkAddress, pPtr->aNwkAddress);
            else
                Set2Bytes(pNwkAddress, 0xffff);
        break;
        default:
            Set2Bytes(pNwkAddress, 0xffff);
        break;
    }
}

 

However,I tried to follows your indication but the problem,as I thought, didn't solve.

 

thanks anyway for your interest.
 
Bye,
Elisa

 

0 Kudos
Reply

615 Views
ImranChoudhary
Contributor I

Dear Elisa,

 

You are right Set2Byte is made to copy 16 bit variable. But I don't know why it is not working in while copying the address.

 

My working code looks like this

 

void TxMyData()
{
  afAddrInfo_t afAddrInfo;
  zbNwkAddr_t DestNwkAddr = { 0X00, 0X00 };
  if (!mTxZigBeeThrottleFlag)
  {
    TS_SendEvent(gAppTaskID, mAppRetryZigBeeDataTx_c);
    return;
  }

  FLib_MemSet(&afAddrInfo, 0, sizeof(afAddrInfo));
  zbTxDataBuffer.status = mBufStatusReadyToSend_c; 
  afAddrInfo.aClusterId[0] = (mDataClusterId_c & 0xFF);
  afAddrInfo.aClusterId[1] = (mDataClusterId_c >> 8);
   
  afAddrInfo.dstAddrMode = gZbAddrMode16Bit_c;
   
  Copy2Bytes(afAddrInfo.dstAddr.aNwkAddr, DestNwkAddr);
  
  afAddrInfo.dstEndPoint = 0xff;
  afAddrInfo.srcEndPoint = appEndPoint;

  /* Turn on security and leave it on. Harmless In a non-secure network. */
  afAddrInfo.txOptions = 0;
  afAddrInfo.radiusCounter = afDefaultRadius_c;
  /* The Wireless UART application on the remote node will ack or nak this */
  /* datagram (regardless of the reliability mode setting), so a confirm id */
  /* is not needed here. */

  AF_DataRequest(&afAddrInfo, zbTxDataBuffer.len, \
                 zbTxDataBuffer.data.structured.payload, NULL);
 ......

}

 

Hope this may help you.

 

Regards,

Imran

0 Kudos
Reply