Hi there,
Requesting some assistance with a custom board that I'm trying to get to work up to our spec. Generally this system needs to work in the 430-480MHz range with 4-GFSK modulation.
We're using a CC1352P7 with an external RF LNA for RX and an external RF amplifier for TX, all with internal bias.
RX is designed to be input from the RFn pin, whereas TX is designed to be output from RFp (all on the Sub_1GHz pins and Single-Ended).
According to SWRA640 (rev H) section 2.2 (configuring Front-End Mode) we have set Config.frontEndMode to 0x02 to select Single-Ended mode RX on RFN. In addition, we have also set the override as advised with setting x=1. Note that the datasheet mentions ADI_HALFREG_OVERRIDES(0, 16, 0x7, x) where the S has to be removed to satisfy the compiler as there is no such macro defined.
I have tried to use these settings with both our own application software (based on TI-rtos) as well as with Smart-RF Studio 7, but I am getting unsatisfactory results. When measuring directly on the RFp output with a spectrum analyser, I would expect a signal around roughly 0-3dBm, but I am measuring 25-30dB less. I am suspecting that I am measuring the parasitic coupled resultant of the transmitted signal on the RXn pin and traces.
However when I set .config.frontEndMode to 0x1 (Single-Ended on RFp), the output power is rougly 0dBm as expected, but -naturally- my RX sensitivity drops with ~30dB as RX is now configured on the RFp pin as well. This leads me to believe that the override setting to assign TX to the RFp pin is not working correctly in our configuration.
I have included our smartrf_settings.c as generated with SmartRF Studio 7. Please let me know if/what additional information you need!
My questions:
- Generally: what can I do to improve the TX performance while maintaining the RX sensitivity? - preferably in software ;-)
- Am I missing any other setting, did I configure something in a wrong way?
- Is the override applied correctly the way I have done it? Does it matter where in the overrides block this line is inserted?
Thanks in advance!
//********************************************************************************* // Generated by SmartRF Studio version 2.30.0 (build#397) // The applied template is compatible with cc13x2_26x2 SDK version 2.30.xx.xx or newer. // Device: CC1352P7 Rev. B (1.1). Only supported by CC26x2 SDK version 5.10.xx.xx or newer // //********************************************************************************* //********************************************************************************* // Parameter summary // RX Address0: 0xAA // RX Address1: 0xBB // RX Address Mode: No address check // Frequency: 459.30000 MHz // Data Format: Serial mode disable // Deviation: 0.797 kHz // Packet Length Config: Variable // Max Packet Length: 255 // Packet Length: 20 // Packet Data: 255 // Preamble Count: 4 Bytes // Preamble Mode: Send 0 as the first preamble bit // RX Filter BW: 9.7 kHz // Symbol Rate: 4.80042 kBaud // Sync Word: 0x930b51de // Sync Word Length: 32 Bits // TX Power: 3 dBm // Enable high output power PA: false // Whitening: No whitening #include "smartrf_settings_NGT.h" #include DeviceFamily_constructPath(rf_patches/rf_patch_cpe_prop.h) // TI-RTOS RF Mode Object RF_Mode RF_prop = { .rfMode = RF_MODE_AUTO, .cpePatchFxn = &rf_patch_cpe_prop, .mcePatchFxn = 0, .rfePatchFxn = 0 }; // Overrides for CMD_PROP_RADIO_DIV_SETUP_PA uint32_t pOverrides[] = { // override_tc706.xml ADI_2HALFREG_OVERRIDE(0,16,0x8,0x8,17,0x1,0x1), ADI_HALFREG_OVERRIDE(0,16,0x7,1), HW_REG_OVERRIDE(0x609C,0x001A), (uint32_t)0x000188A3, ADI_HALFREG_OVERRIDE(0,61,0xF,0xD), // override_prop_common_sub1g.xml // TX: Set FSCA divider bias to 1 HW32_ARRAY_OVERRIDE(0x405C,0x0001), // TX: Set FSCA divider bias to 1 (uint32_t)0x08141131, // override_prop_common.xml // DC/DC regulator: In Tx with 14 dBm PA setting, use DCDCCTL5[3:0]=0xF (DITHER_EN=1 and IPEAK=7). In Rx, use default settings. (uint32_t)0x00F788D3, (uint32_t)0xFFFFFFFF }; // CMD_PROP_RADIO_DIV_SETUP_PA // Proprietary Mode Radio Setup Command for All Frequency Bands rfc_CMD_PROP_RADIO_DIV_SETUP_PA_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, .modulation.modType = 0x1, .modulation.deviation = 0x33, .modulation.deviationStepSz = 0x2, .symbolRate.preScale = 0xF, .symbolRate.rateWord = 0xC4A, .symbolRate.decimMode = 0x0, .rxBw = 0x45, .preamConf.nPreamBytes = 0x4, .preamConf.preamMode = 0x0, .formatConf.nSwBits = 0x20, .formatConf.bBitReversal = 0x0, .formatConf.bMsbFirst = 0x1, .formatConf.fecMode = 0x9, .formatConf.whitenMode = 0x0, .config.frontEndMode = 0x2, .config.biasMode = 0x0, .config.analogCfgMode = 0x0, .config.bNoFsPowerUp = 0x0, .config.bSynthNarrowBand = 0x0, .txPower = 0x40D6, .pRegOverride = pOverrides, .centerFreq = 0x01CB, .intFreq = 0x8000, .loDivider = 0x0A, .pRegOverrideTxStd = 0, .pRegOverrideTx20 = 0 }; // 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 = 0x01CB, .fractFreq = 0x4CCD, .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 = 0x1, .pktLen = 0x14, .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 = 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, .syncWord = 0x930B51DE, .maxPktLen = 0xFF, .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 };