cc1310 wireless sending and receiving status switching

Regarding the wireless sending and receiving status switching of cc1310, friends who are just getting in touch with it also have some doubts. I’ll make a personal note, hoping I won’t forget it in the future:
1. Complete the wireless configuration (be sure to understand this structure)

//! Proprietary Mode Transmit Command
struct __RFC_STRUCT rfc_CMD_PROP_RX_s {<!-- -->
   uint16_t commandNo; //!<the command ID number 0x3802
   uint16_t status; //!< \brief An integer telling the status of the command. This value is
                                        //!< updated by the radio CPU during operation and may be read by the
                                        //!< system CPU at any time.
   rfc_radioOp_t *pNextOp; //!< Pointer to the next operation to run after this operation is done
   ratmr_t startTime; //!< Absolute or relative start time (depending on the value of <code>startTrigger</code>)
   struct {<!-- -->
      uint8_t triggerType:4; //!<the type of trigger
      uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command<br>
                                        //!< 1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2; //!<the trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!< 1: A trigger in the past is triggered as soon as possible
   } startTrigger; //!< Identification of the trigger that starts the operation
   struct {<!-- -->
      uint8_t rule:4; //!< Condition for running next command: Rule for how to proceed
      uint8_t nSkip:4; //!< Number of skips + 1 if the rule involves skipping. 0: same, 1: next, 2: skip next, ...
   } condition;
   struct {<!-- -->
      uint8_t bFsOff:1; //!< \brief 0: Keep frequency synth on after command<br>
                                        //!< 1: Turn frequency synth off after command
      uint8_t bRepeatOk:1; //!< \brief 0: End operation after receiving a packet correctly<br>
                                        //!< 1: Go back to sync search after receiving a packet correctly
      uint8_t bRepeatNok:1; //!< \brief 0: End operation after receiving a packet with CRC error<br>
                                        //!< 1: Go back to sync search after receiving a packet with CRC error
      uint8_t bUseCrc:1; //!< \brief 0: Do not check CRC<br>
                                        //!< 1: Check CRC
      uint8_t bVarLen:1; //!< \brief 0: Fixed length<br>
                                        //!< 1: Receive length as first byte
      uint8_t bChkAddress:1; //!< \brief 0: No address check<br>
                                        //!< 1: Check address
      uint8_t endType:1; //!< \brief 0: Packet is received to the end if end trigger happens after sync is obtained<br>
                                        //!< 1: Packet reception is stopped if end trigger happens
      uint8_t filterOp:1; //!< \brief 0: Stop receiver and restart sync search on address mismatch<br>
                                        //!< 1: Receive packet and mark it as ignored on address mismatch
   } pktConf;
   struct {<!-- -->
      uint8_t bAutoFlushIgnored:1; //!< If 1, automatically discard ignored packets from RX queue
      uint8_t bAutoFlushCrcErr:1; //!< If 1, automatically discard packets with CRC error from RX queue
      uint8_t :1;
      uint8_t bIncludeHdr:1; //!< If 1, include the received header or length byte in the stored packet; otherwise discard it
      uint8_t bIncludeCrc:1; //!< If 1, include the received CRC field in the stored packet; otherwise discard it
      uint8_t bAppendRssi:1; //!< If 1, append an RSSI byte to the packet in the RX queue
      uint8_t bAppendTimestamp:1; //!< If 1, append a timestamp to the packet in the RX queue
      uint8_t bAppendStatus:1; //!< If 1, append a status byte to the packet in the RX queue
   } rxConf; //!< RX configuration
   uint32_t syncWord; //!< Sync word to listen for
   uint8_t maxPktLen; //!< \brief Packet length for fixed length, maximum packet length for variable length<br>
                                        //!< 0: Unlimited or unknown length
   uint8_t address0; //!< Address
   uint8_t address1; //!< \brief Address (set equal to <code>address0</code> to accept only one address. If 0xFF, accept
                                        //!< 0x00 as well)
   struct {<!-- -->
      uint8_t triggerType:4; //!<the type of trigger
      uint8_t bEnaCmd:1; //!< \brief 0: No alternative trigger command<br>
                                        //!< 1: CMD_TRIGGER can be used as an alternative trigger
      uint8_t triggerNo:2; //!<the trigger number of the CMD_TRIGGER command that triggers this action
      uint8_t pastTrig:1; //!< \brief 0: A trigger in the past is never triggered, or for start of commands, give an error<br>
                                        //!< 1: A trigger in the past is triggered as soon as possible
   } endTrigger; //!< Trigger classifier for ending the operation
   ratmr_t endTime; //!< Time used together with <code>endTrigger</code> for ending the operation
   dataQueue_t* pQueue; //!< Pointer to receive queue
   uint8_t* pOutput; //!< Pointer to output structure
} __RFC_STRUCT_ATTR;

2. Receive/send configuration

extern RF_EventMask RF_runCmd(RF_Handle h, RF_Op *pOp, RF_Priority ePri, RF_Callback pCb, RF_EventMask bmEvent);

/**
 * @brief Runs synchronously a (chain of) RF operation(s) for dual or single-mode.
 *
 * Allows a (chain of) operation(s) to be scheduled to the command queue and then waits
 * for it to complete.<br> A command is completed if one of the RF_EventLastCmdDone,
 * RF_EventCmdCancelled, RF_EventCmdAborted, RF_EventCmdStopped occurred.
 *
 * @note Calling context: Task
 * @note Only one call to RF_pendCmd() or RF_runScheduleCmd() can be made at a time for
 * each client
 *
 * @param h Handle previously returned by RF_open()
 * @param pOp Pointer to the #RF_Op. Must normally be in persistent and writable memory
 * @param pSchParams Pointer to the schedule command parameter structure
 * @param pCb Callback function called upon command completion (and some other events).
 * If RF_runScheduleCmd() fails, no callback is made.
 * @param bmEvent Bitmask of events that will trigger the callback.
 * @return The relevant command completed event.

3. Receive/send status switching
After understanding the basic configuration, it will be clear to perform state switching.
Send status You can exit this status after sending. If you need to send continuously, you can refer to cyclic sending. However, many instances do not exit in the accepting state unless data is received! Through the language description, you can understand that the receiving configuration under Nortos must be configured to exit only after receiving data. It is a blocking function and conditional exit. In order to satisfy the idea of exiting without receiving data, I set the mode to timeout in the wireless configuration, set the trigger duration, and calculate the cycle based on the crystal oscillator to block the reception mode within the scheduled time. Exit when you arrive.