Transitions to State RX_ON [06]

This section describes how the state RX_ON is entered. In this state the receiver tries to detect 802.15.4 synchronization headers (SHR) on the current channel. The state RX_ON can generally be reached by writing the value CMD_RX_ON to the sub register SR_TRX_CMD. In case of any pending transmit or receive operation, e.g. if the radio transceiver is in one of the [BUSY] states, the state RX_ON is reached after the completion of this transaction.

The following state transitions are defined:


PHY_STATE_TRX_OFF__RX_ON

If the state RX_ON is requested from the state TRX_OFF, the PLL needs up to 180 us to lock to the configured channel.

inline_mscgraph_32
Code example
    trx_bit_write(SR_TRX_CMD, CMD_RX_ON);
    delay_us(180); /* TRX_IRQ_PLL_LOCK occurs within this period */
    trxstat = trx_bit_read(SR_TRX_STATUS);
    ASSERT(trxstat==RX_ON);

PHY_STATE_[PLL_ACTIVE]__RX_ON

If the state RX_ON is requested from one of the [PLL_ACTIVE] states, the transition occurs within 1us, because the PLL does not need to relock. Because the [PLL_ACTIVE] states include the state RX_ON itself, the software can keep track of this and can safe the register write operation in this case. Nevertheless, it is allowed to write CMD_RX_ON in state RX_ON, which simply causes no action in the radio transceiver.

inline_mscgraph_33
Code example
    trx_bit_write(SR_TRX_CMD, CMD_RX_ON);
    delay_us(1);
    trxstat = trx_bit_read(SR_TRX_STATUS);
    ASSERT(trxstat==RX_ON);

PHY_STATE_[BUSY]__RX_ON

If the command CMD_RX_ON is written to the sub register SR_TRX_CMD and the radio transceiver is in one of the [BUSY] states, the ongoing transmit or receive transaction is completed and the state change to RX_ON occurs within 1 us after the TRX_IRQ_TRX_END interrupt. Usually it is redundant to write CMD_RX_ON during state BUSY_RX, because the radio transceiver falls back automatically to state RX_ON, when the frame reception is done. Nevertheless this operation is allowed.

inline_mscgraph_34
Code example
    trx_bit_write(SR_TRX_CMD, CMD_RX_ON);
    /* TRX_IRQ_TRX_END occurs here */
    delay_us(1);
    trxstat = trx_bit_read(SR_TRX_STATUS);
    ASSERT(trxstat==RX_ON);

PHY_STATE_(BUSY_RX_AACK_NOMATCH)__RX_ON

The pseudo state (BUSY_RX_AACK_NOMATCH) means, that the radio transceiver is in the state BUSY_RX_AACK and no TRX_IRQ_TRX_END occurs, because the address filter does not match or the FCS is wrong. In this case, the state RX_ON is reached up to 4256 us after the state request. To avoid the long timeout, it is recommended, that the software polls the sub register SR_TRX_STATUS or use a transition via the state TRX_OFF using the CMD_FORCE_TRX_OFF (see PHY_FORCE_[ACTIVE]__TRX_OFF, PHY_STATE_TRX_OFF__RX_ON), which will be significantly faster but cancels the ongoing transaction.

inline_mscgraph_35
Code example
    trx_bit_write(SR_TRX_CMD, CMD_RX_ON);
    delay_us(4256);
    trxstat = trx_bit_read(SR_TRX_STATUS);
    ASSERT(trxstat==RX_ON);

Generated on Fri Aug 10 16:10:04 2007 for SWPM AT86RF230 Rev. A by  doxygen 1.5.2