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.

CC1350: Sync Word Threshold adjustment to allow for better error correction

Part Number: CC1350
Other Parts Discussed in Thread: CC1310

Hello,

I am using proprietary mode on the CC1350.  I am wanting to do a simple repetition code in a single packet to allow error correction if any bits are wrong.  I have appended my RF studio settings at the end of this message.  They are set to do DSSS at 62.5kbps.

My concern is that when the RSSI is near the edge of the receiver sensitivity my Sync word will have errors causing the packet to not be seen by the CC1350 reducing the effectiveness of my error correction repetition code.  Is there a way to adjust the threshold of the Sync word to allow for some error so that there is more of a chance for the error correction to recover the packet?  If so how can this be achieved?

Thanks,

Josh

//*********************************************************************************
// Generated by SmartRF Studio version 2.6.0 (build #8)
// Tested for SimpleLink SDK version: CC13x0 SDK 1.30.xx.xx
// Device: CC1350 Rev. 2.1 (Rev. B)
//
//*********************************************************************************


//*********************************************************************************
// Parameter summary
// Address: off
// Address0: 0xAA
// Address1: 0xBB
// Frequency: 915.00000 MHz
// Data Format: Serial mode disable
// Deviation: 25.000 kHz
// Packet Length Config: Variable
// Max Packet Length: 255
// Packet Length: 30
// RX Filter BW: 98 kHz
// Symbol Rate: 50.00000 kBaud
// Sync Word Length: 32 Bits
// TX Power: 14 dBm (requires define CCFG_FORCE_VDDR_HH = 1 in ccfg.c, see CC13xx/CC26xx Technical Reference Manual)
// Whitening: No whitening


#ifdef DEVICE_FAMILY
#undef DEVICE_FAMILY_PATH
#define DEVICE_FAMILY_PATH(x) <ti/devices/DEVICE_FAMILY/x>
#else
#error "You must define DEVICE_FAMILY at the project level as one of cc26x0, cc26x0r2, cc13x0, etc."
#endif

#include DEVICE_FAMILY_PATH(driverlib/rf_mailbox.h)
#include DEVICE_FAMILY_PATH(driverlib/rf_common_cmd.h)
#include DEVICE_FAMILY_PATH(driverlib/rf_prop_cmd.h)
#include <ti/drivers/rf/RF.h>
// #include DEVICE_FAMILY_PATH(rf_patches/rf_patch_cpe_genfsk.h)
// #include DEVICE_FAMILY_PATH(rf_patches/rf_patch_rfe_genfsk.h)
#include DEVICE_FAMILY_PATH(rf_patches/rf_patch_cpe_wb_dsss.h)
#include DEVICE_FAMILY_PATH(rf_patches/rf_patch_mce_wb_dsss.h)
#include DEVICE_FAMILY_PATH(rf_patches/rf_patch_rfe_wb_dsss.h)

#include "smartrf_settings.h"

RF_Mode RF_prop =
{
.rfMode = RF_MODE_PROPRIETARY_SUB_1,
.cpePatchFxn = &rf_patch_cpe_wb_dsss,
.mcePatchFxn = &rf_patch_mce_wb_dsss,
.rfePatchFxn = &rf_patch_rfe_wb_dsss,
};

// Overrides for CMD_PROP_RADIO_DIV_SETUP
static uint32_t pOverrides[] =
{
// override_use_patch_prop_genfsk.xml
// PHY: Use MCE ROM bank 4, RFE RAM patch
// MCE_RFE_OVERRIDE(0,4,0,1,0,0),
MCE_RFE_OVERRIDE(1, 0, 0, 1, 0, 0), // Apply MCE and RFE patches
// override_synth_prop_863_930_div5.xml
// Synth: Set recommended RTRIM to 7
HW_REG_OVERRIDE(0x4038,0x0037),
// Synth: Set Fref to 4 MHz
(uint32_t)0x000684A3,
// Synth: Configure fine calibration setting
HW_REG_OVERRIDE(0x4020,0x7F00),
// Synth: Configure fine calibration setting
HW_REG_OVERRIDE(0x4064,0x0040),
// Synth: Configure fine calibration setting
(uint32_t)0xB1070503,
// Synth: Configure fine calibration setting
(uint32_t)0x05330523,
// Synth: Set loop bandwidth after lock to 20 kHz
(uint32_t)0x0A480583,
// Synth: Set loop bandwidth after lock to 20 kHz
(uint32_t)0x7AB80603,
// Synth: Configure VCO LDO (in ADI1, set VCOLDOCFG=0x9F to use voltage input reference)
ADI_REG_OVERRIDE(1,4,0x9F),
// Synth: Configure synth LDO (in ADI1, set SLDOCTL0.COMP_CAP=1)
ADI_HALFREG_OVERRIDE(1,7,0x4,0x4),
// Synth: Use 24 MHz XOSC as synth clock, enable extra PLL filtering
(uint32_t)0x02010403,
// Synth: Configure extra PLL filtering
(uint32_t)0x00108463,
// Synth: Increase synth programming timeout (0x04B0 RAT ticks = 300 us)
(uint32_t)0x04B00243,
// override_phy_rx_aaf_bw_0xd.xml
// Rx: Set anti-aliasing filter bandwidth to 0xD (in ADI0, set IFAMPCTL3[7:4]=0xD)
ADI_HALFREG_OVERRIDE(0,61,0xF,0xD),
// override_phy_gfsk_rx.xml
// Rx: Set LNA bias current trim offset to 3
(uint32_t)0x00038883,
// Rx: Freeze RSSI on sync found event
HW_REG_OVERRIDE(0x6084,0x35F1),
// override_phy_gfsk_pa_ramp_agc_reflevel_0x1a.xml
// Tx: Configure PA ramping setting (0x41). Rx: Set AGC reference level to 0x1A.
// HW_REG_OVERRIDE(0x6088,0x411A),
HW_REG_OVERRIDE(0x6088,0x410E), // AGC reference level to 0x0E
// Tx: Configure PA ramping setting
HW_REG_OVERRIDE(0x608C,0x8213),

HW_REG_OVERRIDE(0x52AC,0x0B03), //DSSS = 4, K=4

HW_REG_OVERRIDE(0x5108,0x0048), //Correlator Threshold for Sync

// override_phy_rx_rssi_offset_5db.xml
// Rx: Set RSSI offset to adjust reported RSSI by +5 dB
(uint32_t)0x00FB88A3,
// TX power override
// Tx: Set PA trim to max (in ADI0, set PACTL0=0xF8)
ADI_REG_OVERRIDE(0,12,0xF8),
(uint32_t)0xFFFFFFFF,
};

  • You can try lowering the correlator sync word threshold.
    HW_REG_OVERRIDE(0x5108,0x0048), //Correlator Threshold for Sync
  • Hi Sverre,

    I have tried implementing this mode (62.5 kbps DSSS) on the Launchpad1310 using an easylink based project and it just causes my tranmissions to stop working (have not checked whether it is rx or tx yet).

    The launchpads work fine with the standard modes from Smart RF studio.

    Also there is some conflicting information about which values to use, for instance values in this thread:

    https://e2e.ti.com/support/wireless_connectivity/proprietary_sub_1_ghz_simpliciti/f/156/t/626040

    vs this thread:

    https://e2e.ti.com/support/wireless_connectivity/proprietary_sub_1_ghz_simpliciti/f/156/p/548840/2003797

    Is it possible to post a full working copy of smartrf_settings.c for the launchpad 1310XL with easylink using the 62.5 kbps DSSS mode?

    Thanks,

    Nick

  • Do you have a CC1310 LP with a rev A or rev B chip? If you have a rev A chip, please check the SmartRF Studio section of processors.wiki.ti.com/.../CC1310_rev_B_PCN_information
  • Both of the dev board I am using identify as HWREV_2_1 which is revision B.

    I am using the latest SDK, drivers and tools.

    As I mentioned earlier 50kbps FSK mode works flawlessly but the DSSS mode does not work and no error messages are given.

    I will study the PCN and see where it applies.

  • With the latest hardware your issue should not be related to that. Could you post the settings you are currently using?
  • 6278.smartrf_settings.c
    //*********************************************************************************
    // Generated by SmartRF Studio version 2.7.0 (build #23)
    // Tested for SimpleLink SDK version: CC13x0 SDK 1.50.xx.xx
    // Device: CC1310 Rev. 2.1
    //
    //*********************************************************************************
    
    
    //*********************************************************************************
    // Parameter summary
    // Address: off
    // Address0: 0xAA
    // Address1: 0xBB
    // Frequency: 915.00000 MHz
    // Data Format: Serial mode disable
    // Deviation: 25.000 kHz
    // Packet Length Config: Variable
    // Max Packet Length: 255
    // Packet Length: 20
    // RX Filter BW: 98 kHz
    // Symbol Rate: 50.00000 kBaud
    // Sync Word Length: 32 Bits
    // TX Power: 12.5 dBm (requires define CCFG_FORCE_VDDR_HH = 0 in ccfg.c, see CC13xx/CC26xx Technical Reference Manual)
    // Whitening: No whitening
    
    //#define USE_DSSS
    
    
    #include <ti/devices/DeviceFamily.h>
    #include DeviceFamily_constructPath(driverlib/rf_mailbox.h)
    #include DeviceFamily_constructPath(driverlib/rf_common_cmd.h)
    #include DeviceFamily_constructPath(driverlib/rf_prop_cmd.h)
    #include <ti/drivers/rf/RF.h>
    #ifdef USE_DSSS
        //extra patches for dsss
        #include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_wb_dsss.h)
        #include DeviceFamily_constructPath(rf_patches/rf_patch_mce_wb_dsss.h)
        #include DeviceFamily_constructPath(rf_patches/rf_patch_rfe_wb_dsss.h)
    #else
        #include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_genfsk.h)
        #include DeviceFamily_constructPath(rf_patches/rf_patch_rfe_genfsk.h)
    #endif
    #include "smartrf_settings.h"
    
    
    // TI-RTOS RF Mode Object
    RF_Mode RF_prop =
    {
        .rfMode = RF_MODE_PROPRIETARY_SUB_1,
        #ifdef USE_DSSS
            .cpePatchFxn = &rf_patch_cpe_wb_dsss,
            .mcePatchFxn = &rf_patch_mce_wb_dsss,
            .rfePatchFxn = &rf_patch_rfe_wb_dsss,
        #else
            .cpePatchFxn = &rf_patch_cpe_genfsk,
            .mcePatchFxn = 0,
            .rfePatchFxn = &rf_patch_rfe_genfsk,
        #endif
    };
    
    // Overrides for CMD_PROP_RADIO_DIV_SETUP
    static uint32_t pOverrides[] =
    {
        // override_use_patch_prop_genfsk.xml
        // PHY: Use MCE ROM bank 4, RFE RAM patch
    #ifdef USE_DSSS
     MCE_RFE_OVERRIDE(1, 0, 0, 1, 0, 0), // Apply MCE and RFE patches
    
    #else
        MCE_RFE_OVERRIDE(0,4,0,1,0,0),
    #endif
    
        // override_synth_prop_863_930_div5.xml
        // Synth: Set recommended RTRIM to 7
        HW_REG_OVERRIDE(0x4038,0x0037),
        // Synth: Set Fref to 4 MHz
        (uint32_t)0x000684A3,
        // Synth: Configure fine calibration setting
        HW_REG_OVERRIDE(0x4020,0x7F00),
        // Synth: Configure fine calibration setting
        HW_REG_OVERRIDE(0x4064,0x0040),
        // Synth: Configure fine calibration setting
        (uint32_t)0xB1070503,
        // Synth: Configure fine calibration setting
        (uint32_t)0x05330523,
        // Synth: Set loop bandwidth after lock to 20 kHz
        (uint32_t)0x0A480583,
        // Synth: Set loop bandwidth after lock to 20 kHz
        (uint32_t)0x7AB80603,
        // Synth: Configure VCO LDO (in ADI1, set VCOLDOCFG=0x9F to use voltage input reference)
        ADI_REG_OVERRIDE(1,4,0x9F),
        // Synth: Configure synth LDO (in ADI1, set SLDOCTL0.COMP_CAP=1)
        ADI_HALFREG_OVERRIDE(1,7,0x4,0x4),
        // Synth: Use 24 MHz XOSC as synth clock, enable extra PLL filtering
        (uint32_t)0x02010403,
        // Synth: Configure extra PLL filtering
        (uint32_t)0x00108463,
        // Synth: Increase synth programming timeout (0x04B0 RAT ticks = 300 us)
        (uint32_t)0x04B00243,
        // override_phy_rx_aaf_bw_0xd.xml
        // Rx: Set anti-aliasing filter bandwidth to 0xD (in ADI0, set IFAMPCTL3[7:4]=0xD)
        ADI_HALFREG_OVERRIDE(0,61,0xF,0xD),
        // override_phy_gfsk_rx.xml
        // Rx: Set LNA bias current trim offset to 3
        (uint32_t)0x00038883,
        // Rx: Freeze RSSI on sync found event
        HW_REG_OVERRIDE(0x6084,0x35F1),
        // override_phy_gfsk_pa_ramp_agc_reflevel_0x1a.xml
        // Tx: Configure PA ramping setting (0x41). Rx: Set AGC reference level to 0x1A.
    #ifdef USE_DSSS
        HW_REG_OVERRIDE(0x6088,0x410E), // AGC reference level to 0x0E
    #else
        HW_REG_OVERRIDE(0x6088,0x411A),
    #endif
        // Tx: Configure PA ramping setting
        HW_REG_OVERRIDE(0x608C,0x8213),
    #ifdef USE_DSSS
        HW_REG_OVERRIDE(0x52AC,0x0B03), //DSSS = 4, K=4
        HW_REG_OVERRIDE(0x5108,0x0048), //Correlator Threshold for Sync
    #endif
        // override_phy_rx_rssi_offset_5db.xml
        // Rx: Set RSSI offset to adjust reported RSSI by +5 dB
        (uint32_t)0x00FB88A3,
        (uint32_t)0xFFFFFFFF,
    };
    
    
    // CMD_PROP_RADIO_DIV_SETUP
    // Proprietary Mode Radio Setup Command for All Frequency Bands
    rfc_CMD_PROP_RADIO_DIV_SETUP_t RF_cmdPropRadioDivSetup =
    {
        .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,
    #ifdef USE_DSSS
        .modulation.modType = 0x0,
        .modulation.deviation = 0x2BC,
        .symbolRate.rateWord = 0x50000, // 500 Kbps symbol rate
        .rxBw = 0x2F,
        .formatConf.bMsbFirst = 0x0, //LSB transmitted first for WB-DSSS mode
    #else
        .modulation.modType = 0x1,
        .modulation.deviation = 0x64,
        .symbolRate.rateWord = 0x8000,
        .rxBw = 0x24,
        .formatConf.bMsbFirst = 0x1,
    #endif
        .symbolRate.preScale = 0xF,
        .preamConf.nPreamBytes = 0x4,
        .preamConf.preamMode = 0x0,
        .formatConf.nSwBits = 0x20,
        .formatConf.bBitReversal = 0x0,
        .formatConf.fecMode = 0x0,
        .formatConf.whitenMode = 0x0,
        .config.frontEndMode = 0x0,
        .config.biasMode = 0x1,
        .config.analogCfgMode = 0x0,
        .config.bNoFsPowerUp = 0x0,
        .txPower = 0xA63F,
        .pRegOverride = pOverrides,
        .centerFreq = 0x0393,
        .intFreq = 0x8000,
        .loDivider = 0x05,
    };
    
    // CMD_FS
    // Frequency Synthesizer Programming Command
    rfc_CMD_FS_t RF_cmdFs =
    {
        .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 = 0x0393,
        .fractFreq = 0x0000,
        .synthConf.bTxMode = 0x0,
        .synthConf.refFreq = 0x0,
        .__dummy0 = 0x00,
        .__dummy1 = 0x00,
        .__dummy2 = 0x00,
        .__dummy3 = 0x0000,
    };
    
    // CMD_PROP_RX
    // Proprietary Mode Receive Command
    rfc_CMD_PROP_RX_t RF_cmdPropRx =
    {
        .commandNo = 0x3802,
        .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,
        .pktConf.bFsOff = 0x0,
        .pktConf.bRepeatOk = 0x0,
        .pktConf.bRepeatNok = 0x0,
        .pktConf.bUseCrc = 0x1,
        .pktConf.bVarLen = 0x1,
        .pktConf.bChkAddress = 0x0,
        .pktConf.endType = 0x0,
        .pktConf.filterOp = 0x0,
        .rxConf.bAutoFlushIgnored = 0x0,
        .rxConf.bAutoFlushCrcErr = 0x0,
        .rxConf.bIncludeHdr = 0x1,
        .rxConf.bIncludeCrc = 0x0,
        .rxConf.bAppendRssi = 0x0,
        .rxConf.bAppendTimestamp = 0x0,
        .rxConf.bAppendStatus = 0x1,
    #ifdef USE_DSSS
        .syncWord = 0x333C3C33,
    #else
        .syncWord = 0x930B51DE,
    #endif
    
        .maxPktLen = 0x80, // MAKE SURE DATA ENTRY IS LARGE ENOUGH
        .address0 = 0xAA,
        .address1 = 0xBB,
        .endTrigger.triggerType = 0x1,
        .endTrigger.bEnaCmd = 0x0,
        .endTrigger.triggerNo = 0x0,
        .endTrigger.pastTrig = 0x0,
        .endTime = 0x00000000,
        .pQueue = 0, // INSERT APPLICABLE POINTER: (dataQueue_t*)&xxx
        .pOutput = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
    };
    
    // CMD_PROP_TX
    // Proprietary Mode Transmit Command
    rfc_CMD_PROP_TX_t RF_cmdPropTx =
    {
        .commandNo = 0x3801,
        .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,
        .pktConf.bFsOff = 0x0,
        .pktConf.bUseCrc = 0x1,
        .pktConf.bVarLen = 0x1,
        .pktLen = 0x14,
    #ifdef USE_DSSS
        .syncWord = 0x333C3C33,
    #else
        .syncWord = 0x930B51DE,
    #endif
        .pPkt = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
    };
    

    Here is the smartrf_settings.c file.

    It is based on the output of SmartRF studio with changes from this forum.

    I have preserved the original settings by enclosing them in ifdef.

    In this version I am using 12.5 dBm output, but I have tried 14 dBm mode as well and it didn;t seem to help.

  • To me the settings looks ok.

    You wrote " it just causes my tranmissions to stop working (have not checked whether it is rx or tx yet)."
    - Does that mean that the link works when you turn on the boards?
    - Have you been able to figure out if it's the TX or RX side that stop working?
  • When using the DSSS mode I am unable to succesfully send any packets between the 2 boards at all.

    I have not used a spectrum analyzer to determine whether the Tx is actually sending anything which might help isolate the issue (although the spectrum analyzer might not be able to determine whether the packet is correct or not).

  • More detail:
    The software seems to run without any error messages and does not crash or stop but no messages get through.
  • Do you have a spectrum analyzer enabling you to check if you actually sending and if you do so the frequency and how the spectrum looks like.
  • I will fire up the spectrum analyzer and check it out.

    I will also try the settings file with a few of the example projects and see if it works ok.

    Did that settings file look OK to you?