/*********************************************************************************** * @fn halSampleED * * @brief Sample Energy Detect * * @param uint8 channel - channel between 11 and 26 * uint16 sampleTime - sample time in us * * @return int8 - sampled RSSI value */ int8 halSampleED(uint8 channel, uint16 sampleTime) { int8 rssi=0; // Set channel halRfSetChannel(channel); // Set RX on halRfReceiveOn(); while (!RSSISTAT); // Enable energy scan mode, using peak signal strength FRMCTRL0 |= 0x10; // Spend sampleTime us accumulating the peak RSSI value halMcuWaitUs(sampleTime); rssi = RSSI; // Exit the current channel halRfReceiveOff(); // Disable ED scan mode FRMCTRL0 &= ~0x10; return rssi; }
/*********************************************************************************** * @fn basicRfReceiveOff * * @brief Turns off receiver on radio * * @param txState - file scope variable * * @return none */ void basicRfReceiveOff(void) { txState.receiveOn = FALSE; halRfReceiveOff(); }
/*********************************************************************************** * @fn basicRfSendPacket * * @brief Send packet * * @param destAddr - destination short address * pPayload - pointer to payload buffer. This buffer must be * allocated by higher layer. * length - length of payload * txState - file scope variable that keeps tx state info * mpdu - file scope variable. Buffer for the frame to send * * @return basicRFStatus_t - SUCCESS or FAILED */ uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length) { uint8 mpduLength; uint8 status; // Turn on receiver if its not on if(!txState.receiveOn) { halRfReceiveOn(); } // Check packet length length = min(length, BASIC_RF_MAX_PAYLOAD_SIZE); // Wait until the transceiver is idle halRfWaitTransceiverReady(); // Turn off RX frame done interrupt to avoid interference on the SPI interface halRfDisableRxInterrupt(); mpduLength = basicRfBuildMpdu(destAddr, pPayload, length); #ifdef SECURITY_CCM halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M); txState.frameCounter++; // Increment frame counter field #else halRfWriteTxBuf(txMpdu, mpduLength); #endif // Turn on RX frame done interrupt for ACK reception halRfEnableRxInterrupt(); // Send frame with CCA. return FAILED if not successful if(halRfTransmit() != SUCCESS) { status = FAILED; } // Wait for the acknowledge to be received, if any if (pConfig->ackRequest) { txState.ackReceived = FALSE; // We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished // The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small margin halMcuWaitUs((12 * BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATION) + (2 * BASIC_RF_SYMBOL_DURATION) + 10); // If an acknowledgment has been received (by RxFrmDoneIsr), the ackReceived flag should be set status = txState.ackReceived ? SUCCESS : FAILED; } else { status = SUCCESS; } // Turn off the receiver if it should not continue to be enabled if (!txState.receiveOn) { halRfReceiveOff(); } if(status == SUCCESS) { txState.txSeqNumber++; } #ifdef SECURITY_CCM halRfIncNonceTx(); // Increment nonce value #endif return status; }