/*********************************************************************************** * @fn halRfTransmit * * @brief Transmit frame with Clear Channel Assessment. * * @param none * * @return uint8 - SUCCESS or FAILED */ uint8 halRfTransmit(void) { uint16 timeout = 500; // 500 x 100us = 50ms uint8 status = 0; // Wait for RSSI to become valid while (!CC2520_RSSI_VALID_PIN){}; // Reuse GPIO2 for TX_FRM_DONE exception CC2520_CFG_GPIO_OUT(2, 1 + CC2520_EXC_TX_FRM_DONE); // Wait for the transmission to begin before exiting (makes sure that this function cannot be called // a second time, and thereby canceling the first transmission. while (--timeout > 0) { CC2520_INS_STROBE(CC2520_INS_STXONCCA); if (CC2520_SAMPLED_CCA_PIN) { break; } chThdSleepMicroseconds(100); } if (timeout == 0) { status = FAILED; CC2520_INS_STROBE(CC2520_INS_SFLUSHTX); } else { status = SUCCESS; // Wait for TX_FRM_DONE exception while (!CC2520_TX_FRM_DONE_PIN) {}; CC2520_CLEAR_EXC(CC2520_EXC_TX_FRM_DONE); } // Reconfigure GPIO2 CC2520_CFG_GPIO_OUT(2, CC2520_GPIO_RSSI_VALID); return status; }
void halRfFlushRx(void) { /* Flush RX FIFO twice instead of once. See bug #1 in * http://www.ti.com/lit/er/swrz024/swrz024.pdf */ halRfDisableRxInterrupt(); CC2520_RXBUF8(); CC2520_INS_STROBE(CC2520_INS_SFLUSHRX); CC2520_INS_STROBE(CC2520_INS_SFLUSHRX); halRfEnableRxInterrupt(); }
/*********************************************************************************** * @fn halRfReceiveOn * * @brief Turn receiver on * * @param none * * @return none */ void halRfReceiveOn(void) { /* Flush RX FIFO if needed. * See bug #1 in http://www.ti.com/lit/er/swrz024/swrz024.pdf */ halRfDisableRxInterrupt(); CC2520_INS_STROBE(CC2520_INS_SFLUSHRX); uint8_t rx_fifo_cnt = CC2520_REGRD8(CC2520_RXFIFOCNT); CC2520_INS_STROBE(CC2520_INS_SRXON); if (rx_fifo_cnt != CC2520_REGRD8(CC2520_RXFIFOCNT)) { CC2520_INS_STROBE(CC2520_INS_SFLUSHRX); } halRfEnableRxInterrupt(); }
/*********************************************************************************** * @fn halRfTransmit * * @brief Transmit frame with Clear Channel Assessment. * * @param none * * @return uint8 - HAL_RF_SUCCESS or HAL_RF_FAILED */ uint8 halRfTransmit(void) { uint16 timeout = 2500; // 2500 x 20us = 50ms uint8 status=0; // DEBUG_MSG_FUNC_START; // Wait for RSSI to become valid while(!CC2520_RSSI_VALID_PIN); // Reuse GPIO2 for TX_FRM_DONE exception HAL_INT_OFF(); CC2520_CFG_GPIO_OUT(2, 1 + CC2520_EXC_TX_FRM_DONE); HAL_INT_ON(); // Wait for the transmission to begin before exiting (makes sure that this function cannot be called // a second time, and thereby cancelling the first transmission. while(--timeout > 0) { HAL_INT_OFF(); CC2520_INS_STROBE(CC2520_INS_STXONCCA); HAL_INT_ON(); if (CC2520_SAMPLED_CCA_PIN) break; #if 0 // POOH halMcuWaitUs(20); #else Delay(20); #endif } if (timeout == 0) { DEBUG_MSG_FUNC_ERROR; status = HAL_RF_FAILED; CC2520_INS_STROBE(CC2520_INS_SFLUSHTX); } else { status = HAL_RF_SUCCESS; // Wait for TX_FRM_DONE exception while(!CC2520_TX_FRM_DONE_PIN); HAL_INT_OFF(); CC2520_CLEAR_EXC(CC2520_EXC_TX_FRM_DONE); HAL_INT_ON(); } // Reconfigure GPIO2 HAL_INT_OFF(); CC2520_CFG_GPIO_OUT(2, CC2520_GPIO_RSSI_VALID); HAL_INT_ON(); return status; }
/*********************************************************************************** * @fn halRfReceiveOff * * @brief Turn receiver off * * @param none * * @return none */ void halRfReceiveOff(void) { /* Flush RX FIFO if needed. * See bug #1 in http://www.ti.com/lit/er/swrz024/swrz024.pdf */ halRfDisableRxInterrupt(); CC2520_INS_STROBE(CC2520_INS_SFLUSHRX); uint8_t rx_fifo_cnt = CC2520_REGRD8(CC2520_RXFIFOCNT); CC2520_INS_STROBE(CC2520_INS_SRFOFF); if (rx_fifo_cnt != CC2520_REGRD8(CC2520_RXFIFOCNT)) { CC2520_INS_STROBE(CC2520_INS_SFLUSHRX); // Software clean-up // Reset software for frame reception... } halRfEnableRxInterrupt(); }
uint8 WAIT_DPU_DONE_H(void) { int tries = 0; while (CC2520_INS_STROBE(CC2520_INS_SNOP) & DPU_ACTIVE_H_BM) { tries++; if (tries > 10000) { return 0; } } return 1; }
uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length) { uint8 mpduLength; uint8 status; // Check packet length length = length; mpduLength = basicRfBuildMpdu(destAddr, pPayload, length); CC2520_TXBUF(mpduLength,txMpdu); CC2520_INS_STROBE(CC2520_INS_STXONCCA);//CC2520_INS_STXON); status = SUCCESS; if(status == SUCCESS) { txState.txSeqNumber++; } return status; }
/*********************************************************************************** * @fn CC2520_STXCAL * * @brief STXCAL instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_STXCAL(void) { return CC2520_INS_STROBE(CC2520_INS_STXCAL); }
/*********************************************************************************** * @fn CC2520_SSAMPLECCA * * @brief Sample CCA instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SSAMPLECCA(void) { return CC2520_INS_STROBE(CC2520_INS_SSAMPLECCA); }
/*********************************************************************************** * @fn halRfGetStatusByte * * @brief Get chip status byte * * @param none * * @return uint8 - chip status byte */ uint8 halRfGetStatusByte(void) { return CC2520_INS_STROBE(CC2520_INS_SNOP); }
/*********************************************************************************** * @fn CC2520_STXON * * @brief STXON instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_STXON(void) { return CC2520_INS_STROBE(CC2520_INS_STXON); }
/*********************************************************************************** * @fn halRfReceiveOn * * @brief Turn receiver on * * @param none * * @return none */ void halRfReceiveOn(void) { CC2520_INS_STROBE(CC2520_INS_SRXON); }
/*********************************************************************************** * @fn halRfReceiveOff * * @brief Turn receiver off * * @param none * * @return none */ void halRfReceiveOff(void) { CC2520_INS_STROBE(CC2520_INS_SRFOFF); }
/*********************************************************************************** * @fn cc2520_receiveOff * * @brief Turn receiver off * * @param none * * @return none */ void cc2520_receiveOff(void) { txState.receiveOn = FALSE; CC2520_INS_STROBE(CC2520_INS_SRFOFF); }
/*********************************************************************************** * @fn CC2520_SFLUSHTX * * @brief SFLUSHTX instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SFLUSHTX(void) { return CC2520_INS_STROBE(CC2520_INS_SFLUSHTX); }
/*********************************************************************************** * @fn CC2520_SNOP * * @brief SNOP instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SNOP(void) { return CC2520_INS_STROBE(CC2520_INS_SNOP); }
/*********************************************************************************** * @fn cc2520_receiveOn * * @brief Turn receiver on * * @param none * * @return none */ void cc2520_receiveOn(void) { txState.receiveOn = TRUE; CC2520_INS_STROBE(CC2520_INS_SRXON); }
/*********************************************************************************** * @fn CC2520_SRXMASKBITSET * * @brief SRXMASKBITSET instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SRXMASKBITSET(void) { return CC2520_INS_STROBE(CC2520_INS_SRXMASKBITSET); }
/*********************************************************************************** * @fn CC2520_SNACK * * @brief SNACK instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SNACK(void) { return CC2520_INS_STROBE(CC2520_INS_SNACK); }
/*********************************************************************************** * @fn CC2520_SACKPEND * * @brief SACKPEND instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SACKPEND(void) { return CC2520_INS_STROBE(CC2520_INS_SACKPEND); }
/*********************************************************************************** * @fn CC2520_SIBUFEX * * @brief SIBUFEX instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SIBUFEX(void) { return CC2520_INS_STROBE(CC2520_INS_SIBUFEX); }
/*********************************************************************************** * @fn CC2520_STXONCCA * * @brief STXONCCA instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_STXONCCA(void) { return CC2520_INS_STROBE(CC2520_INS_STXONCCA); }
/*********************************************************************************** * @fn CC2520_SRXMASKBITCLR * * @brief SRXMASKBITCLR instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SRXMASKBITCLR(void) { return CC2520_INS_STROBE(CC2520_INS_SRXMASKBITCLR); }
/*********************************************************************************** * @fn CC2520_SXOSCOFF * * @brief SXOSCOFF instruction strobe * * @param none * * @return uint8 - status byte */ uint8 CC2520_SXOSCOFF(void) { return CC2520_INS_STROBE(CC2520_INS_SXOSCOFF); }