CC1311P3: Large frequency offset on LP-CC1311P3

Part Number: CC1311P3
Other Parts Discussed in Thread: SYSCONFIG

Hi Experts,

We are using the LP-CC1311P3 and are experiencing very different frequency offsets between our code and SmartRF Studio 7. For this test we are transmitting CW at +10dBm.

When setting up the CW transmissing for 869.2125 MHz, we end up 13 kHz above the target when using Smart RF Studio 7.

When we copy the same commands (rfc_CMD_PROP_RADIO_DIV_SETUP_PA_t, rfc_CMD_FS_t, rfc_CMD_TX_TEST_t) to our code and run it we end up 41 kHz below our target, which is not far from 50 ppm off.

Why are we experiencing this difference? Is there some offset correction we are missing? Cap array should be off for both scenarios. 

For the commands we are sending in our code, please see radio_driver_tx_test_cmd below:

rfc_CMD_FS_t RF_cmdTestFs =
{
    .commandNo = 0x0803,
    .status = 0x0000,
    .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
    .startTime = 0x00000000,
    .startTrigger.triggerType = 0x0,
    .startTrigger.bEnaCmd = 0x0,
    .startTrigger.triggerNo = 0x0,
    .startTrigger.pastTrig = 0x0,
    .condition.rule = 0x1,
    .condition.nSkip = 0x0,
    .frequency = 0x0365,
    .fractFreq = 0x3667,
    .synthConf.bTxMode = 0x0,
    .synthConf.refFreq = 0x0,
    .__dummy0 = 0x00,
    .__dummy1 = 0x00,
    .__dummy2 = 0x00,
    .__dummy3 = 0x0000
};

void radio_driver_fs_cmd(void)
{
    tx_fs_cmd_handle = RF_postCmd(rf_tx_handle,
                                  (RF_Op*) &RF_cmdTestFs,
                                  RF_PriorityNormal,
                                  NULL,
                                  0);
    core_platform_assert(RF_ALLOC_ERROR != tx_fs_cmd_handle);
}

rfc_CMD_PROP_RADIO_DIV_SETUP_PA_t RF_cmdTestPropRadioDivSetup =
{
    .commandNo = 0x3807,
    .status = 0x0000,
    .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
    .startTime = 0x00000000,
    .startTrigger.triggerType = 0x0,
    .startTrigger.bEnaCmd = 0x0,
    .startTrigger.triggerNo = 0x0,
    .startTrigger.pastTrig = 0x0,
    .condition.rule = 0x1,
    .condition.nSkip = 0x0,
    .modulation.modType = 0x1,
    .modulation.deviation = 0xA,
    .modulation.deviationStepSz = 0x0,
    .symbolRate.preScale = 0xF,
    .symbolRate.rateWord = 0xC4A,
    .symbolRate.decimMode = 0x0,
    .rxBw = 0x52,
    .preamConf.nPreamBytes = 0x4,
    .preamConf.preamMode = 0x0,
    .formatConf.nSwBits = 0x20,
    .formatConf.bBitReversal = 0x0,
    .formatConf.bMsbFirst = 0x1,
    .formatConf.fecMode = 0x0,
    .formatConf.whitenMode = 0x0,
    .config.frontEndMode = 0x0,
    .config.biasMode = 0x1,
    .config.analogCfgMode = 0x0,
    .config.bNoFsPowerUp = 0x0,
    .config.bSynthNarrowBand = 0x0,
    .txPower = 0x3E92,
    .pRegOverride = pOverrides,
    .centerFreq = 0x0365,
    .intFreq = (int16_t)0x8000,
    .loDivider = 0x05,
    .pRegOverrideTxStd = 0,
    .pRegOverrideTx20 = 0
};

void radio_driver_pa_cmd(void)
{
    rf_tx_handle = RF_open(&rfObject,
                           &RF_prop,
                           (RF_RadioSetup*) &RF_cmdTestPropRadioDivSetup,
                           &rfParams);

    core_platform_assert(rf_tx_handle != NULL);
    is_tx_handle_open = true;
}

static rfc_CMD_TX_TEST_t RF_cmdTxTest ={
    .commandNo = 0x0808,
    .status = 0x0000,
    .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
    .startTime = 0x00000000,
    .startTrigger.triggerType = 0x0,
    .startTrigger.bEnaCmd = 0x0,
    .startTrigger.triggerNo = 0x0,
    .startTrigger.pastTrig = 0x0,
    .condition.rule = 0x1,
    .condition.nSkip = 0x0,
    .config.bUseCw = 0x1,
    .config.bFsOff = 0x1,
    .config.whitenMode = 0x2,
    .__dummy0 = 0x00,
    .txWord = 0xFFFF,
    .__dummy1 = 0x00,
    .endTrigger.triggerType = 0x1,
    .endTrigger.bEnaCmd = 0x0,
    .endTrigger.triggerNo = 0x0,
    .endTrigger.pastTrig = 0x0,
    .syncWord = 0x930B51DE,
    .endTime = 0x00000000
};



void radio_driver_tx_test_cmd(void)
{
    radio_driver_pa_cmd();
    radio_driver_fs_cmd();
    is_tx_handle_open = true;
    txCmdhandle = RF_postCmd(rf_tx_handle,
                             (RF_Op*) &RF_cmdTxTest,
                             RF_PriorityNormal,
                             NULL,
                             0);
}


Regards,
Erik

  • Hi Erik,

    Is the customer exporting the SmartRF Studio settings and using those generated files or are they reimplementing the settings using SysConfig (rather than using a Studio generated settings file)?

    If using the default rfCarrierWave example in the SDK (unmodified) do they observe the offset between Studio and CCS or is it only when modifying settings to their preferred PHY?

    Regards,

    Zack

  • Hi and thanks for pointing to the rfCarrierWave example!

    rfCarrierWave produces the same results as SmartRF Studio.

    We had two underlying issues.

    1. The CCFG region did not get linked properly and was never written to flash from our code.

    2. "xoscCapArray" was set to false in sysconfig. Now changed to "true" with "xoscCapArrayDelta" = 0xC1 to get the same config as the rfCarrierWave example.

    With these two changes we now get the same frequency offset as when using SmartRF Studio or compiling the rfCarrierWave example. During the last measurement we did with the rfCarrierWave example, we were ~9.7kHz or 11ppm over our 868 MHz target.

    Question: Are you able to point to a datasheet for the mounted XTAL so we can compare the frequency stability with the XTAL specs? It's marked with "48000 K129 Y". 

    Best Regards
    Erik

  • You can find the full manufacturer part number in the BOM for the launchpad