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: Questions about 1 Mbps mode in RF CC1350

Intellectual 260 points

Replies: 13

Views: 89

Part Number: CC1350

I am working on making a full duplex communication using sub Ghz on CC1350 and it works fine when I send the data at a rate of 500 kbps, but I want to send the data at 1 Mbps and when I searched the forum, I found an example that allows me to set the data rate up to 1 Mbps. When I tested the code with the configurations in the example,a lot of packets are lost on one board and nothing received at all on the other, so check the rf configurations below:

//*********************************************************************************
// Generated by SmartRF Studio version 2.12.0 (build#147)
// The applied template is compatible with CC13x0 SDK 2.30.xx.xx
// Device: CC1350 Rev. 2.1
//
//*********************************************************************************


//*********************************************************************************
// Parameter summary
// RX Address0: 0xAA
// RX Address1: 0xBB
// RX Address Mode: No address check
// Frequency: 868.00000 MHz
// Data Format: Serial mode disable
// Deviation: 175.000 kHz
// Fixed Packet Length: 20
// Packet Length Config: Fixed
// Max Packet Length: 255
// Packet Data: 255
// RX Filter BW: 1243 kHz
// Symbol Rate: 500.00000 kBaud
// Sync Word Length: 32 Bits
// TX Power: 12 dBm (requires define CCFG_FORCE_VDDR_HH = 0 in ccfg.c, see CC13xx/CC26xx Technical Reference Manual)
// Whitening: No whitening

#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>
#include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_genfsk.h)
#include DeviceFamily_constructPath(rf_patches/rf_patch_rfe_genfsk.h)
#include DeviceFamily_constructPath(rf_patches/rf_patch_mce_ghs.h)
#include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_ghs.h)
#include DeviceFamily_constructPath(rf_patches/rf_patch_rfe_ghs.h)
#include "smartrf_settings.h"


// TI-RTOS RF Mode Object

RF_Mode RF_prop_860_4FSK =
{
    .rfMode       =  RF_MODE_PROPRIETARY_SUB_1,

    .cpePatchFxn  =  &enterGhsCpePatch,
    .mcePatchFxn  =  &rf_patch_mce_ghs,
    .rfePatchFxn  =  &rf_patch_rfe_ghs,

};


// Overrides for CMD_RADIO_SETUP HSM

uint32_t pOverrides_860_4FSK[] =
{
  // PHY: Use MCE RAM patch, RFE RAM patch
     MCE_RFE_OVERRIDE(1, 0, 0, 1, 0, 0),
     // Rx: Set anti-aliasing filter bandwidth to Maximum
     ADI_HALFREG_OVERRIDE(0,61,0xF,0x0),
     // Synth: Set recommended RTRIM to 7
     HW_REG_OVERRIDE(0x4038,0x0037),
     // Synth: Configure fine calibration setting
     HW_REG_OVERRIDE(0x4020,0x7F00),
     // Synth: Configure fine calibration setting
     HW_REG_OVERRIDE(0x4064,0x0040),
     // Synth: Set Fref to 4 MHz
     (uint32_t)0x000684A3,
     // Synth: Configure fine calibration setting
     (uint32_t)0xC0040141,
     (uint32_t)0x0533B107,
     // Synth: Set loop bandwidth after lock
     (uint32_t)0xA480583,
     (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),
     // Rx: Set LNA bias current trim offset to 3
     (uint32_t)0x00038883,
     // Rx: Set RSSI offset to adjust reported RSSI
     (uint32_t)0x00FB88A3,
     // 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,
     //Configure thershold for Sync word detection
     HW_REG_OVERRIDE(0x5104,0x302B),
     //Set FIFO threshold
     (uint32_t) 0x002C82C3,
     (uint32_t) 0x002882D3,
     // Rx: Do not freeze RSSI on sync found event
     HW_REG_OVERRIDE(0x6084,0x25F1),
     // ****PA Ramping overrides
     HW_REG_OVERRIDE(0x6088,0x4121),
     HW_REG_OVERRIDE(0x608C,0x0A12),
     // ****Length of CW tone
     HW_REG_OVERRIDE(0x52B0,0x00F0),
     // DC estimation
     HW_REG_OVERRIDE(0x51F8,0x0F90),
     //Zero IF in TX
     (uint32_t) 0x00000343,
     // Tx: Set PA trim to max (in ADI0, set PACTL0=0xF8)
     ADI_REG_OVERRIDE(0,12,0xF8),
     // End Override
     (uint32_t)0xFFFFFFFF,
};

// CMD_RADIO_SETUP HSM
rfc_CMD_PROP_RADIO_DIV_SETUP_t RF_cmdRadioSetup_860_4FSK =
{
  .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 = 600,
 .symbolRate.preScale = 0xF,
 .symbolRate.rateWord = 0x50000,
 .rxBw = 0x30,
 .preamConf.nPreamBytes = 0x6,
 .preamConf.preamMode = 0x1,
 .formatConf.nSwBits = 0x20,
 .formatConf.bBitReversal = 0x0,
 .formatConf.bMsbFirst = 0x1,
 .formatConf.fecMode = 9,
 .formatConf.whitenMode = 0x0,
 .config.frontEndMode = 0x0,
 .config.biasMode = 0x1,
 .config.bNoFsPowerUp = 0x0,
 .txPower = 0xA73F,
 .pRegOverride = pOverrides_860_4FSK,
 .centerFreq = 0x369,
 .intFreq = 0x0A66,
 .loDivider = 0x05,
};

// CMD_FS
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 = 0x0365,
    .fractFreq = 0x0000,
    .synthConf.bTxMode = 0x0,
    .synthConf.refFreq = 0x0,
    .__dummy0 = 0x00,
    .__dummy1 = 0x00,
    .__dummy2 = 0x00,
    .__dummy3 = 0x0000,
};

// 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 = 0x0,
    .pktLen = 0x14, // SET APPLICATION PAYLOAD LENGTH
    .syncWord = 0x930B51DE,
    .pPkt = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};


// 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 = 0x0,
    .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,
    .syncWord = 0x930B51DE,
    .maxPktLen = 0xFF, // 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_ADV
// Proprietary Mode Advanced Transmit Command
rfc_CMD_PROP_TX_ADV_t RF_cmdPropTxAdv =
{
     .commandNo = 0x3803,
     .status = 0x0000,
     .pNextOp = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
     .startTime = 0x00000000,
     .startTrigger.triggerType = 0x2,
     .startTrigger.bEnaCmd = 0x0,
     .startTrigger.triggerNo = 0x0,
     .startTrigger.pastTrig = 0x1,
     .condition.rule = 0x1,
     .condition.nSkip = 0x0,
     .pktConf.bFsOff = 0x0,
     .pktConf.bUseCrc = 0x1,
     .pktConf.bCrcIncSw = 0x0,
     .pktConf.bCrcIncHdr = 0x0,
     .numHdrBits = 0x10,
     .pktLen = 0x0000,
     .startConf.bExtTxTrig = 0x0,
     .startConf.inputMode = 0x0,
     .startConf.source = 0x0,
     .preTrigger.triggerType = 0x4,
     .preTrigger.bEnaCmd = 0x0,
     .preTrigger.triggerNo = 0x0,
     .preTrigger.pastTrig = 0x1,
     .preTime = 0x00000000,
     .syncWord = 0x0055904E,
     .pPkt = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};


// CMD_PROP_RX_ADV
// Proprietary Mode Advanced Receive Command
rfc_CMD_PROP_RX_ADV_t RF_cmdPropRxAdv =
{
     .commandNo = 0x3804,
     .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.bCrcIncSw = 0x0,
     .pktConf.bCrcIncHdr = 0x0,
     .pktConf.endType = 0x0,
     .pktConf.filterOp = 0x1,
     .rxConf.bAutoFlushIgnored = 0x1,
     .rxConf.bAutoFlushCrcErr = 0x0,
     .rxConf.bIncludeHdr = 0x1,
     .rxConf.bIncludeCrc = 0x1,
     .rxConf.bAppendRssi = 0x1,
     .rxConf.bAppendTimestamp = 0x1,
     .rxConf.bAppendStatus = 0x1,
     .syncWord0 = 0x0055904E,
     .syncWord1 = 0x00000000,
     .maxPktLen = 0x07FF,
     .hdrConf.numHdrBits = 0x10,
     .hdrConf.lenPos = 0x0,
     .hdrConf.numLenBits = 0xB,
     .addrConf.addrType = 0x0,
     .addrConf.addrSize = 0x0,
     .addrConf.addrPos = 0x0,
     .addrConf.numAddr = 0x0,
     .lenOffset = 0xFC,
     .endTrigger.triggerType = 0x1,
     .endTrigger.bEnaCmd = 0x0,
     .endTrigger.triggerNo = 0x0,
     .endTrigger.pastTrig = 0x0,
     .endTime = 0x00000000,
     .pAddr = 0, // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
     .pQueue = 0, // INSERT APPLICABLE POINTER: (dataQueue_t*)&xxx
     .pOutput = 0 // INSERT APPLICABLE POINTER: (uint8_t*)&xxx
};

13 Replies

  • Hi Nada, 

    Assigning an expert to help you.

    Thanks, 
    Elin

  • Hi Nada,

    The 1 MBps settings is not something standard that we deliver in the SDK. For testing purposed, have you tried to simply use SmartRF Studio to change the RF parameters and verify the quality of the link? This is a good way to start before using exported settings in your application. 

    Best regards,

    M-W

  • In reply to M-W:

    Yes, I tried it and it works fine but I want the data rate to be greater than 500 kbps

  • In reply to nada wael:

    Sure, but did you also try to manually change the symbol rate in SmartRF Studio?

    Best regards,

    M-W

  • In reply to M-W:

    How can I determine the exact value of symbol rate to get the desired data rate?

  • In reply to nada wael:

    The data rate depends on many things, such as the PHY. If you for example would base your experiments of the "500 kbps" settings, then you can see that symbol rate = bit rate. Note that settings not found in the SmartRF studio might not work at all depending on the changes made. Bumping from 500 to 1000 kbps could very well be something that turns out to not work "out-of-the-box".

    Best regards,

    M-W

  • In reply to M-W:

    I tried to do so, but it didn't work out. should I reduce the packet size as I am sending 255 bytes? will this make any difference?

  • In reply to M-W:

    and is really cc1350 using proprietary mode capable of sending and receiving at data rate up to 4 Mbps?

  • In reply to Nada Wael:

    Hi Nada,

    Yes, it is. The settings however is not provided as part of the SmartRF Studio. In the case of higher bit-rates, you would need to use the "High Speed" API, like the case of 4 Mbps. My recommendation is that you check out the "rfPacketErrorRate" example in the SDK as this features tests for 4 Mbps using HS mode. If nothing else, you could extract settings from this example for testing.

    Best regards,

    M-W

  • In reply to M-W:

    I tried using the example, but to use the HS mode, I need to use the rfc_CMD_HS_TX_t for transmission where there is no data field only the queue. When I create a queue and use it, a fault ISR occurs when I assign the data I want to transmit.

                    memcpy(txDataEntryBuffer, Comm_TX_Array_LevX, ( MaxArraySize_SubGHz ));                            // Copy the payload
                    txcurrentDataEntry->length= sizeof(txDataEntryBuffer) ;

    /***************************** fault ISR happens here *****************************/

    txcurrentDataEntry->data=   txDataEntryBuffer[0];  

    P.S.

    In my application, I am making a full duplex communication and i works fine in other data rates, but when I create 2 queues one for tx and one for rx, I don't receive any data and I don't know why although the queue is defined successfully and I didn't use the txqueue but once I comment this line, it works fine.

            if      (RFQueue_defineQueue(&TxdataQueue, txDataEntryBuffer, sizeof(txDataEntryBuffer), NUM_DATA_ENTRIES, MaxArraySize_SubGHz + NUM_APPENDED_BYTES))
            {
                    perror("Error: Failed to allocate space for all data entries ");
                    while (1);
            }

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.