/*********************************************************************************** * @fn SMPL_Init * * @brief Initialize the SimpliciTI stack. * * input parameters * @param f - Pointer to call back function. Function called by NWK when * user application frame received. The callback is done in the * ISR thread. Argument is Link ID associated with frame. Function * returns 0 if frame is to be kept by NWK, otherwise 1. Frame * should be kept if application will do a SMPL_Receive() in the * user thread (recommended). Pointer may be NULL. * * output parameters * * @return Status of operation: * SMPL_SUCCESS * SMPL_NO_JOIN No Join reply. AP possibly not yet up. * SMPL_NO_CHANNEL Only if Frequency Agility enabled. Channel scan * failed. AP possibly not yet up. */ smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t)) { smplStatus_t rc; if (!sInit_done) { /* set up radio. */ MRFI_Init(); /* initialize network */ if ((rc=nwk_nwkInit(f)) != SMPL_SUCCESS) { return rc; } MRFI_WakeUp(); #if defined( FREQUENCY_AGILITY ) { freqEntry_t chan; chan.logicalChan = 0; /* ok to set default channel explicitly now that MRFI initialized. */ nwk_setChannel(&chan); } #endif /* don't turn Rx on if we're an end device that isn't always on. */ /* but do turn the radio on for PLL operations */ #if !defined( END_DEVICE ) || defined( NWK_PLL ) MRFI_RxOn(); #endif #if defined( END_DEVICE ) /* All except End Devices are in promiscuous mode */ MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress()); MRFI_EnableRxAddrFilter(); #endif } sInit_done = 1; #ifdef NWK_PLL /* If the PLL is enabled then it must get running before the join * request or the system may lock up in the join request becuase * PLL is not locked in. */ // turn on the PLL SMPL_Ioctl(IOCTL_OBJ_PLL, IOCTL_ACT_ON, NULL); // reference clocks are by definition always locked. #ifndef NWK_PLL_REFERENCE_CLOCK // wait for a 5ms failure rate to be achieved while( nwk_pllIsLocked( 0 ) == false ) nwk_pllBackgrounder( false ); #endif #endif /* Join. if no AP or Join fails that status is returned. */ rc = nwk_join(); return rc; }
/*********************************************************************************** * @fn SMPL_Init * * @brief Initialize the SimpliciTI stack. * * input parameters * @param f - Pointer to call back function. Function called by NWK when * user application frame received. The callback is done in the * ISR thread. Argument is Link ID associated with frame. Function * returns 0 if frame is to be kept by NWK, otherwise 1. Frame * should be kept if application will do a SMPL_Receive() in the * user thread (recommended). Pointer may be NULL. * * output parameters * * @return Status of operation: * SMPL_SUCCESS * SMPL_NO_JOIN No Join reply. AP possibly not yet up. * SMPL_NO_CHANNEL Only if Frequency Agility enabled. Channel scan * failed. AP possibly not yet up. */ smplStatus_t SMPL_Init(uint8_t (*f)(linkID_t)) { smplStatus_t rc; if (!sInit_done) { /* set up radio. */ MRFI_Init(); /* initialize network */ if ((rc=nwk_nwkInit(f)) != SMPL_SUCCESS) { return rc; } MRFI_WakeUp(); #if defined( FREQUENCY_AGILITY ) { freqEntry_t chan; chan.logicalChan = 0; /* ok to set default channel explicitly now that MRFI initialized. */ nwk_setChannel(&chan); } #endif /* don't turn Rx on if we're an end device that isn't always on. */ #if !defined( END_DEVICE ) MRFI_RxOn(); #endif #if defined( END_DEVICE ) /* All except End Devices are in promiscuous mode */ MRFI_SetRxAddrFilter((uint8_t *)nwk_getMyAddress()); MRFI_EnableRxAddrFilter(); #endif } sInit_done = 1; /* Join. if no AP or Join fails that status is returned. */ rc = nwk_join(); return rc; }
/****************************************************************************** * @fn mrfiLinkInit * * @brief Initialise the MRFI layer. Selects RF channel and addresses. * * @param src - source address (16 bit) * * @param dst - destination address (16 bit) * * @return void * */ void mrfiLinkInit(uint16 src, uint16 dst, uint8 mrfiChannel) { #ifdef USB_SUSPEND_HOOKS // Register USB hooks if necessary pFnSuspendEnterHook= MRFI_Sleep; pFnSuspendExitHook= linkRestore; #endif // Make sure the timer is initialised BSP_INIT_BOARD(); // Initialise the addresses src_addr[0]= LO_UINT16(MRFI_LINK_PAN_ID); src_addr[1]= HI_UINT16(MRFI_LINK_PAN_ID); src_addr[2]= LO_UINT16(src); src_addr[3]= HI_UINT16(src); dest_addr[0]= LO_UINT16(MRFI_LINK_PAN_ID); dest_addr[1]= HI_UINT16(MRFI_LINK_PAN_ID); dest_addr[2]= LO_UINT16(dst); dest_addr[3]= HI_UINT16(dst); // Initialise MRFI link housekeeping data mrfiPktRdy= FALSE; fAckRdy= FALSE; seqSend= 0; seqRecv= 0; // Initialise MRFI MRFI_Init(); MRFI_WakeUp(); MRFI_SetLogicalChannel(mrfiChannel); MRFI_RxOn(); MRFI_SetRxAddrFilter(src_addr); MRFI_EnableRxAddrFilter(); }
/************************************************************************************************** * @fn MRFI_WakeUp * * @brief Wake up radio from off/sleep state. * * @param none * * @return none ************************************************************************************************** */ void MRFI_WakeUp(void) { /* if radio is asleep, wake it up */ if(mrfiRadioState == MRFI_RADIO_STATE_OFF) { /* enter idle mode */ mrfiRadioState = MRFI_RADIO_STATE_IDLE; /* turn on radio power */ Mrfi_TurnOnRadioPower(); /* Configure the radio registers. All radio settings that are lost * on MRFI_Sleep() call must be restored here. Since we are putting the * radio in LPM2 power mode, all register and memory values that are * different from reset must be restored. */ MRFI_BOARD_CONFIG_RADIO_GPIO(); #ifdef MRFI_PA_LNA_ENABLED /* Init ports */ MRFI_BOARD_PA_LNA_CONFIG_PORTS(); if(mrfiLnaHighGainMode) { /* Set LNA to High Gain Mode */ MRFI_BOARD_PA_LNA_HGM(); } else { /* Set LNA to Low Gain Mode */ MRFI_BOARD_PA_LNA_LGM(); } #endif /* Set FIFO_P threshold to max (127). Thus a FIFO_P signal is set whenever * a full frame is received. */ mrfiSpiWriteReg(FIFOPCTRL, 0x7F); /* Accept only DATA frames. Reject CMD/BECAON/ACK frames. */ mrfiSpiWriteReg(FRMFILT1, 0x10); /* Restore the address filter settings */ if(mrfiAddrFilterStatus & MRFI_FILTER_ADDRESS_SET) { MRFI_SetRxAddrFilter(mrfiFilterAddr); } if(mrfiAddrFilterStatus & MRFI_FILTER_ADDRESS_ENABLED) { MRFI_EnableRxAddrFilter(); } else { MRFI_DisableRxAddrFilter(); } /* Following values need to be changed from their reset value. * See Table-21 CC2520 datasheet. */ #ifdef MRFI_PA_LNA_ENABLED /* This value is not in datasheet yet. */ mrfiSpiWriteReg(TXPOWER, 0xE1); #else mrfiSpiWriteReg(TXPOWER, 0x32); #endif mrfiSpiWriteReg(CCACTRL0, 0xF8); mrfiSpiWriteReg(MDMCTRL0, 0x85); mrfiSpiWriteReg(MDMCTRL1, 0x14); mrfiSpiWriteReg(RXCTRL, 0x3F); mrfiSpiWriteReg(FSCTRL, 0x5A); mrfiSpiWriteReg(FSCAL1, 0x2B); mrfiSpiWriteReg(AGCCTRL1, 0x11); mrfiSpiWriteReg(ADCTEST0, 0x10); mrfiSpiWriteReg(ADCTEST1, 0x0E); mrfiSpiWriteReg(ADCTEST2, 0x03); /* set default channel */ MRFI_SetLogicalChannel(mrfiCurrentLogicalChannel); } }