This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

RTOS/CC1310: Measuring RSSI while using th Carrier-Sense Command

Part Number: CC1310
Other Parts Discussed in Thread: CC1101, , CC1020

Tool/software: TI-RTOS

I want to use the Carrier-Sense command to scan multiple channels for activity using the RSSI threshold. In order to know what is a reasonable threshold to use I need some feedback on the detected RSSI on the channel.

Currently I have set up a command chain that looks like this:

CMD_FS [Set the channel frequency] -> CMD_CS [wait up to 2 ms if IDLE, exit as soon as it is BUSY] -> CMD_GET_RSSI [Immediate command] -> CMD_FS_OFF[turn off the radio]

This is executed via the RF_runCmd function in a TIRTOS thread.

My problem is that all of the RSSI measurements come back with a value of -128 (0xFF80).

Is there a way to get the RSSI data I need using a command chain like this, or do I need to figure out how to do it asynchronously?

The parameters of the CMD_CS command is:

static rfc_CMD_PROP_CS_t RF_Scan_cmdCs =
{
   .commandNo = CMD_PROP_CS,
   .status = 0x0000,
   .pNextOp = (rfc_radioOp_t *) &RF_Scan_cmdReadRSSI,
   .startTime = 0x00000000,
   .startTrigger.triggerType = 0x0,
   .startTrigger.bEnaCmd = 0x0,
   .startTrigger.triggerNo = 0x0,
   .startTrigger.pastTrig = 0x0,
   .condition.rule = COND_ALWAYS,
   .condition.nSkip = 0x0,

   .csFsConf = 0,    // keep the RF on, independent of a carrier detect

   .csConf.bEnaRssi = 1,
   .csConf.bEnaCorr = 0,
   .csConf.operation = 0,
   .csConf.busyOp = 1,      // halt Carrier detect if we detect a busy condition
   .csConf.idleOp = 0,      // Keep scanning as long as it is idle
   .csConf.timeoutRes = 1,  // if we timeout, treat invalid result as Idle

   .rssiThr = -100,   // start with an RSSI threshold of -60 dB
   .numRssiIdle = 2,
   .numRssiBusy = 2,

   // Set the end trigger for 2 ms after we start the carrier detect operation.
   .csEndTrigger.triggerType = TRIG_REL_START,
   .csEndTime = 8000,
};

  • CMD_GET_RSSI will only report a correct RSSI value when in RX. Since you read out -128 this indicate that you actually are not. Looking at your chain I'm not sure that you actually are in RX at any time. Route the LNA signal to a pin (dev.ti.com/.../signal-routing.html ) to check when you are in RX.
  • The documentation for the CMD_PROP_CS command says:

    When the carrier-sense command starts, the radio is set up in receive mode, and the operations described
    in Section 23.7.5.5.1 are performed.

    So the radio does go into RX mode and RSSI values are generated WHILE the CS command is operating. I zero out both the csFsConf.bFsOffIdle and csFsConf.bFsOffBusy options to keep the frequency synthesizer running no mater how the CS operation ends. I was hoping that this would allow me to take RSSI measurements.

    What I really want is the last RSSI value that was measured during the CS command. The return status of PROP_DONE_BUSY or PROP_DONE_IDLE will tell me whether this RSSI represents a Busy or Idle condition.

    Since it is not written into the CS command object, I need to ask for it separately.

    Is there a CMD_READ_RFREG command I can use to get the most recently measured RSSI value, even after the CS command has finished?

    Would it work better if I used a CMD_PROP_RX_SNIFF or CMD_RX_TEST command instead so that the RX ? Most of the time I will not be expecting to receive anything.

    This is an operation I only use while I am trying to synchronize the receiver with multiple transmitters using FHSS.  I have implementations of this strategy for the CC1020 and CC1101 chips that I am trying to recreate for the CC1310 chip.

  • The CS command sets the chip in RX but only when the command is running. I believe you have to chain with CMD_RX_TEST to ensure that the chip is in RX when calling CMD_GET_RSSI

    Could you also use something like this: dev.ti.com/.../