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.

Setting CC2650 TX Power

Other Parts Discussed in Thread: CC2650, CC2640

I have an app based on SimpleBLEPeripheral with general discoverable mode turned on. This is running on a custom CC2650 board with the RF section identical to the CC2650EM-7ID board (also using the same PCB etched antenna).

When I call HCI_EXT_SetTxPowerCmd() it seems to have no affect when measured using the RSSI on an iPhone and the achievable connection range using that phone (I know this isn't scientific but going from 0dBm to 5dBm I would expect to notice some change). 

In the notes it says it can only be called in StandBy mode, so I using the following code in BLE_taskFxn:

uint8_t advertize = 0;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertize);
HCI_EXT_SetTxPowerCmd(HCI_EXT_TX_POWER_4_DBM); //4 dBm=2.5mW, 0 dBm=1mw

Is turning the advertising off sufficient to go into StandBy mode? Does there need to be a delay before before calling HCI_EXT_SetTxPowerCmd()?

Also HCI_EXT_SetRxGainCmd() doesn't seem to be defined, is this function available on the CC2650?

  • You don't have to turn off advertising to change the TX power. You can just set it in simpleBLEPeripheral_init.

    HCI_EXT_SetRXGainCmd is not supported in CC2640.
  • ok I will try that as a test to make sure it has an impact.

    But I want to change the power dynamically, the device will be in the field for months logging data until someone connects to it via BTLE to download the data. So I was planning to have it send advertising packets at 0dBm every 2 seconds to save power, then after a connection it would bump it up to 4dBM and advertise every 150ms for about 5 minutes so that any subsequent connections while the person was on site might be more successful. Not exactly ideal I know (and maybe not so useful), I'd rather be able to detect a scan response packet and then update the rate at power at that point but that doesn't seem to be possible.

    I might just experiment with leaving the power level higher all the time, I will need to determine the impact on our battery life (must be 5 years), but would still be interested to know if power can be changed dynamically.
  • Hi,

    According to your application, the advertising payload determines your battery life. You can get a estimation of current consumption by using our ble-power-calculator tool(www.ti.com/ble-power-calculator).

    I am not sure that bumping the power to 4dBm will help to form the connection if the user is still at the same location as when he/she first connected to the device. But change power dynamically is feasible. You can add a flag that if the has been made, and then bump up the output power to 4dBm if the condition has met.

    Add a clock object to change the TX output power back to 0dBm after 5 mins.
  • There seems to be a DEFAULT_TX_POWER defined as 7 in ble_user_config.c. Does this mean the default TX_POWER is -3dBm?
    Thanks,
    Priya
  • I added HCI_EXT_SetTxPowerCmd(HCI_EXT_TX_POWER_5_DBM) to simpleBLEPeripheral_init and also tried setting DEFAULT_TX_POWER to 12 it doesn't seem to have any affect on the received power level.

  • I have tried setting different power levels in simpleBLEPeripheral_init, setting it to -21dBm does have a noticeable drop-off in signal so it is having some affect. Setting it to anything above 0dBm doesn't seem to have a vary the received RSSI, i.e. 5dBm looks the same as 0dBm.
  • DEFAULT_TX_POWER = 7, means the 8th element is the txPowerTable which can be found in bleUserConfig.c

    const txPwrVal_t txPowerTable[] =
      { { TX_POWER_MINUS_21_DBM, GEN_TX_POWER_VAL( 0x07, 3, 0x0C ) },
        { TX_POWER_MINUS_18_DBM, GEN_TX_POWER_VAL( 0x09, 3, 0x10 ) },
        { TX_POWER_MINUS_15_DBM, GEN_TX_POWER_VAL( 0x0B, 3, 0x14 ) },
        { TX_POWER_MINUS_12_DBM, GEN_TX_POWER_VAL( 0x0E, 3, 0x14 ) },
        { TX_POWER_MINUS_9_DBM,  GEN_TX_POWER_VAL( 0x0F, 1, 0x21 ) },
        { TX_POWER_MINUS_6_DBM,  GEN_TX_POWER_VAL( 0x14, 1, 0x29 ) },
        { TX_POWER_MINUS_3_DBM,  GEN_TX_POWER_VAL( 0x1C, 1, 0x35 ) },
        { TX_POWER_0_DBM,        GEN_TX_POWER_VAL( 0x2C, 1, 0x56 ) },
        { TX_POWER_1_DBM,        GEN_TX_POWER_VAL( 0x1F, 0, 0x6A ) },
        { TX_POWER_2_DBM,        GEN_TX_POWER_VAL( 0x29, 0, 0x9C ) } };

  • I have tried 5dBm setting and 0dBm setting and I can see the current changes significantly. I have looped in our HW expert to answer the RSSI question.
  • I agree with Christin, looking at the current is much more accurate than using the RSSI. RSSI readings will depend on signal level (70 dB dynamic range so for signals stronger than around - 30 dBm you will get the same reading. It will depend on your environment, noise, multipath etc and also has a +/- 4 dB accuracy so it is not the best way test the output power.