Hi TI,
I'm having difficulty getting our CC1310 to operate at the advertised 1Mbps data rate. We are working at the 900MHz frequency band.
I've successfully implemented various data rates up to 500kbps, inclusive, but making that leap to 1Mbps and beyond is not working.
As required, from 1Mbps and beyond, we use the different RF core command structure RF_cmdTxHS (of type rfc_CMD_HS_TX_t) as prescribed here: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz/f/156/p/628551/2363574#2363574
My structures:
// TI-RTOS RF Mode Object (includes patches for high speed operation) // See e2e.ti.com/.../2363574 static const RF_Mode RfSettings_RF_prop_hs_4fsk = { .rfMode = RF_MODE_PROPRIETARY_SUB_1, .cpePatchFxn = &enterGhsCpePatch, .mcePatchFxn = &rf_patch_mce_ghs, .rfePatchFxn = &rf_patch_rfe_ghs, }; // CMD_PROP_RADIO_DIV_SETUP for 4FSK (1Mbps, 2Mbps) const rfc_CMD_PROP_RADIO_DIV_SETUP_t Cc1310_Rf900vol_PHY_900M_500KSYM_4fsk_g = { .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 = 8, .symbolRate.rateWord = 262144, .rxBw = 48, .preamConf.nPreamBytes = 0x4, // 0x6 .preamConf.preamMode = 0x0, // 0x1 .formatConf.nSwBits = 0x20, .formatConf.bBitReversal = 0x0, .formatConf.bMsbFirst = 0x1, .formatConf.fecMode = 0x0, //9, .formatConf.whitenMode = 0x0, .config.frontEndMode = 0x0, .config.biasMode = 0x1, .config.bNoFsPowerUp = 0x0, .txPower = 0xA73F, .pRegOverride = (uint32_t*)PHY_900M_500KSYM_4_fsk_pOverrides, .centerFreq = 915, .intFreq = 0x0A66, .loDivider = 0x05, }; static const uint32_t PHY_900M_500KSYM_4_fsk_pOverrides[] = { // 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), /* RF Core monitors */ (uint32_t)0x008F88B3, HW_REG_OVERRIDE(0x1110, RFC_DBELL_SYSGPOCTL_GPOCTL0_MCEGPO0 | RFC_DBELL_SYSGPOCTL_GPOCTL1_MCEGPO1 | RFC_DBELL_SYSGPOCTL_GPOCTL3_RATGPO1), // End Override (uint32_t)0xFFFFFFFF, };
My Code:
My code (logic, flow, interrupts etc.) is identical to my working 500kbps (2-FSK) code except for the use of RF_cmdTxHS instead of RF_cmdPropTxAdv (of type rfc_CMD_PROP_TX_ADV_t). Because the structures differ, I assign my dataQueue_t* to RF_cmdTxHS.pQueue instead of the pPkt and pktLen attributes; the rest remains the same:
for(i = 0; i < TX_QUEUE_COUNT; i++) { TxEntryQueue[i].pNextEntry = (uint8_t*)&TxEntryQueue[(i + 1) % TX_QUEUE_COUNT]; TxEntryQueue[i].status = DATA_ENTRY_PENDING; TxEntryQueue[i].config.type = DATA_ENTRY_TYPE_PTR; TxEntryQueue[i].config.lenSz = 1; TxEntryQueue[i].pData = TxBlocks[i]; TxEntryQueue[i].length = 16; //BLOCK_LENGTH; } if(Cc1310_RfSettings_Is4fskMode()) // >= 1Mbps { /* Configure high speed TX command */ RF_cmdTxHS.pQueue = &TxQueue; /* CRC not applicable, since we are using infinite length transmission mode there is no * automatic CRC checking for us */ RF_cmdTxHS.pktConf.bUseCrc = 0; RF_cmdTxHS.startTrigger.triggerType = TRIG_NOW; RF_cmdTxHS.startTrigger.pastTrig = 1; RF_cmdTxHS.startTime = 0; TxOperation = (RF_Op*)&RF_cmdTxHS; } else // <= 500kbps { /* Configure CMD_PROP_TX_ADV */ RF_cmdPropTxAdv.pPkt = (uint8_t*)&TxQueue; RF_cmdPropTxAdv.pktLen = 0; RF_cmdPropTxAdv.pktConf.bUseCrc = 1; RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW; RF_cmdPropTxAdv.startTrigger.pastTrig = 1; RF_cmdPropTxAdv.startTime = 0; RF_cmdPropTxAdv.syncWord = CC1310_BBBLOCKS_SYNC_WORD; // ### May need changing? TxOperation = (RF_Op*)&RF_cmdPropTxAdv; } TxQueue.pCurrEntry = (uint8_t*)&TxEntryQueue[0]; /* pLastEntry loop is closed upon reception of LAST_BLOCK flag */ TxQueue.pLastEntry = NULL; ... result = RF_postCmd(Cc1310_CcRf_RfHandle_g, TxOperation,// (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, &TxBlocksCallback, RF_EventTxEntryDone | RF_EventLastCmdDone);
Symptoms:
I know the issue is in the Tx, not Rx, because the RF Core signal MCE_GPO0 that I've routed to the external GPIO does not behave as it should. I am aware that http://software-dl.ti.com/simplelink/esd/simplelink_cc13x0_sdk/3.20.00.23/exports/docs/proprietary-rf/proprietary-rf-users-guide/rf-core/signal-routing.html states that MCE_GPO0 and MCE_GPO1 are not supported for 4-FSK mode but I do see the correct preamble and 4 bytes of sync (I cannot control the sync, since RF_cmdTxHS does not permit this). I then expect to see 48 bytes of my data (previously buffered in TxQueue), with every 'block' of 16 bytes (the maximum permissible callback rate) triggering the callback function. Instead, following the correct preamble and (presumably) 4 bytes of sync, I see garbage (mostly zeros), a single callback, followed by the RF_EventLastCmdDone event. I also note that the bit period of MCE_GPO0 is 1.33us, not 1us.
Also, what are the necessary changes to get 2Mbps and 4Mbps working? I believe 4Mbps requires this structure:
{ .rfMode = RF_MODE_PROPRIETARY_SUB_1, .cpePatchFxn = 0, .mcePatchFxn = &rf_patch_mce_hsp_4mbps, .rfePatchFxn = &rf_patch_rfe_hsp_4mbps, };
plus different overrides and radio setup structure but are other changes also required?
Thanks in advance for your support.
Regards,
Sean.