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.

CC1120EMK-420-470: CC1120 - synchronous mode - SMARTRFTRXEBK

Part Number: CC1120EMK-420-470
Other Parts Discussed in Thread: CC1020, CC1120, SMARTRFTRXEBK, , CC1310

Hello TI Community,

I have some "issues" with synchronous serial mode.

Here is the context before my actual question.

I'm currently working on a project with the CC1120. The main purpose is to replace our old brand working on CC1020 :

MCU - [CC1020]  <------air-------> [CC1020] - MCU

with a new product based on the CC1120 but software compatible (software in MCU can't be alterated) :

MCU - [MCUb-CC1120] <----air-----> [CC1120-MCUb] - MCU

To do so im working with another MCU (MCUb) to program the CC1120 in synchronous serial mode.

I use : 

- the evaluation board (SMARTRFTRXEBK)  with the 434 module (CC1120EMK-420-470) 

- MCUb with a CC1120 module

Now here is my setup:

setup 1 : SMART RF STUDIO - [SMARTRFTRXEBK - CC1120EMK-420-470] ----------- air -------------> [CC1120] - MCU

setup 2 : MCU - [MCUb - CC1120] ----------air --------> [CC1120] - MCU

I m working first in TX mode (in the future i need bi-directionnal communication)

Setup 1 is working great ! (positive sign ! )

Setup 2 isn't :

- configuration is the same in the 2 setups (settings of the CC1120)

- i see the modulation on my spectrum at correct frequency - but nothing on the receiver side

Question : Why ? i'm probably missing something.

Is-it possible to have an explanation of what happened inside the SMARTRFTRXEBK with smart fr studio ? (maybe i'm missing some commands)

I did probe spi commands when working and i found periodically reading of marcstate & fscal-ctrl registers (i ve implement them in my MCUb software but no change)

Here is my code sample for my MCUb

canal_frequence = 0x00;

InitCC1120Register();				        // CC1120 configuration (same as smart rf studio)						
manual_Calibration_VCO();                   // VCO calibration according to errata
Prog_Pll_Em(canal_frequence);               // set frequency channel + calibration
WriteToCC1120StrobeRegister(CC112X_STX); 	// Transmitter Mode 

thanks for your help !

sorry for my poor english.

Best Regard


  • Hi Charles,

    Can you post the configuration you have on the Rx side as well?

  • Hello Marie,

    The RX side is our old RF module based on the CC1020.

    I have started "sniffing" spi line after stopping spi polling in smartRFstudio and i m analysing the commands on start and stop button.

    here is the configuration on the RX side (CC1020)

    #ifndef CC1020_CST_H
    #define CC1020_CST_H
    /* Register addresses */
    #define CC1020_MAIN            0x41
    #define CC1020_INTERFACE       0x0F
    #define CC1020_RESET           0xFF
    #define CC1020_SEQUENCING      0x8F
    #define CC1020_FREQ_2A         0x3A
    #define CC1020_FREQ_1A         0x1D
    #define CC1020_FREQ_0A         0x71
    #define CC1020_CLOCK_A         0x39
    #define CC1020_FREQ_2B         0x39
    #define CC1020_FREQ_1B         0xFE
    #define CC1020_FREQ_0B         0x31
    #define CC1020_CLOCK_B         0x39
    #define CC1020_VCO             0x44
    #define CC1020_MODEM           0x50
    #define CC1020_DEVIATION       0x2D
    #define CC1020_AFC_CONTROL     0xCE
    #define CC1020_FILTER          0x2B
    #define CC1020_VGA1            0x61
    #define CC1020_VGA2            0x55
    #define CC1020_VGA3            0x2E
    #define CC1020_VGA4            0x29
    #define CC1020_LOCK            0x20
    #define CC1020_FRONTEND        0x78
    #define CC1020_ANALOG          0x47
    #define CC1020_BUFF_SWING      0x54
    #define CC1020_BUFF_CURRENT    0x22		 
    #define CC1020_PLL_BW          0xAE
    #define CC1020_CALIBRATE       0x35
    #define CC1020_PA_POWER        0x0E
    #define CC1020_MATCH           0x00
    #define CC1020_PHASE_COMP      0x00
    #define CC1020_GAIN_COMP       0x00
    #define CC1020_POWERDOWN       0x00
    #endif /* CC1020_CST_H */

  • When running the transmitter from SmartRF Studio I assume you sending packet is normal FIFO mode, but what is the configuration you use when you try to program the CC1120 for serial mode? Are you using async. or sync serial mode?

    Also, you are doing the manual calibration BEFORE you are setting the frequency. That does not make sense, as you need to set the frequency FIRST, then calibrate.


  • Hi Siri,

    In smartRF studio im running in synchronous serial mode. I use my hardware to send to data stream (clock and data connected on P7)

    note about the programmation of the frequency, this function also calibrate at the end. The manual calibration is done once at start (to match the errata) then when application need multiple working frequency, my function launch the calibration each time.

    Sorry for the missing informations

    Best Regards


  • I need you to share the details of your code.

    What registers are you writing in InitCC1120Register() and what is the code you run in Prog_Pll_Em(canal_frequence)

    I assume manual_Calibration_VCO() is according to the errata.

    Also, have you monitored your SPI bus to see that it is according to spec?

    Please share some plots showing the 4 SPI lines when writing a register and the reading it back.



  • first point here is the CC1120 configuration (same value in smartRF studio - which work with the evaluation board):

     *  SmartRF Studio(tm) Export
     *  Radio register settings specifed with C-code
     *  compatible #define statements.
     *  RF device: CC1120
    #ifndef SMARTRF_CC1120_H
    #define SMARTRF_CC1120_H
    #define SMARTRF_RADIO_CC1120
    #define SMARTRF_SETTING_IOCFG3             0xB0
    #define SMARTRF_SETTING_IOCFG2             0x08
    #define SMARTRF_SETTING_IOCFG1             0xB0
    #define SMARTRF_SETTING_IOCFG0             0x09
    #define SMARTRF_SETTING_SYNC3              0xAA
    #define SMARTRF_SETTING_SYNC2              0xD3
    #define SMARTRF_SETTING_SYNC1              0x91
    #define SMARTRF_SETTING_SYNC0              0xDA
    #define SMARTRF_SETTING_SYNC_CFG1          0x0B
    #define SMARTRF_SETTING_SYNC_CFG0          0x03
    #define SMARTRF_SETTING_DEVIATION_M        0xA0
    #define SMARTRF_SETTING_MODCFG_DEV_E       0x04
    #define SMARTRF_SETTING_DCFILT_CFG         0x1C
    #define SMARTRF_SETTING_PREAMBLE_CFG1      0x00
    #define SMARTRF_SETTING_FREQ_IF_CFG        0x40
    #define SMARTRF_SETTING_IQIC               0xC6
    #define SMARTRF_SETTING_CHAN_BW            0x08
    #define SMARTRF_SETTING_MDMCFG1            0x06
    #define SMARTRF_SETTING_MDMCFG0            0x05
    #define SMARTRF_SETTING_SYMBOL_RATE2       0x73
    #define SMARTRF_SETTING_SYMBOL_RATE1       0xA9
    #define SMARTRF_SETTING_SYMBOL_RATE0       0x2A
    #define SMARTRF_SETTING_AGC_REF            0x20
    #define SMARTRF_SETTING_AGC_CS_THR         0x19
    #define SMARTRF_SETTING_AGC_CFG3           0x91
    #define SMARTRF_SETTING_AGC_CFG2           0x20
    #define SMARTRF_SETTING_AGC_CFG1           0xA9
    #define SMARTRF_SETTING_AGC_CFG0           0xCF
    #define SMARTRF_SETTING_FIFO_CFG           0x00
    #define SMARTRF_SETTING_DEV_ADDR           0x00
    #define SMARTRF_SETTING_FS_CFG             0x14
    #define SMARTRF_SETTING_WOR_CFG1           0x08
    #define SMARTRF_SETTING_WOR_CFG0           0x21
    #define SMARTRF_SETTING_WOR_EVENT0_MSB     0x00
    #define SMARTRF_SETTING_WOR_EVENT0_LSB     0x00
    #define SMARTRF_SETTING_PKT_CFG2           0x01
    #define SMARTRF_SETTING_PKT_CFG1           0x00
    #define SMARTRF_SETTING_PKT_CFG0           0x20
    #define SMARTRF_SETTING_RFEND_CFG1         0x0F
    #define SMARTRF_SETTING_RFEND_CFG0         0x00
    #define SMARTRF_SETTING_PA_CFG2            0x7F
    #define SMARTRF_SETTING_PA_CFG1            0x56
    #define SMARTRF_SETTING_PA_CFG0            0x7D
    #define SMARTRF_SETTING_PKT_LEN            0x03
    #define SMARTRF_SETTING_IF_MIX_CFG         0x00
    #define SMARTRF_SETTING_FREQOFF_CFG        0x22
    #define SMARTRF_SETTING_TOC_CFG            0x0B
    #define SMARTRF_SETTING_MARC_SPARE         0x00
    #define SMARTRF_SETTING_ECG_CFG            0x00
    #define SMARTRF_SETTING_CFM_DATA_CFG       0x00
    #define SMARTRF_SETTING_EXT_CTRL           0x01
    #define SMARTRF_SETTING_RCCAL_FINE         0x00
    #define SMARTRF_SETTING_RCCAL_COARSE       0x00
    #define SMARTRF_SETTING_RCCAL_OFFSET       0x00
    #define SMARTRF_SETTING_FREQOFF1           0x00
    #define SMARTRF_SETTING_FREQOFF0           0x00
    #define SMARTRF_SETTING_FREQ2              0x6C
    #define SMARTRF_SETTING_FREQ1              0x46
    #define SMARTRF_SETTING_FREQ0              0x66
    #define SMARTRF_SETTING_IF_ADC2            0x02
    #define SMARTRF_SETTING_IF_ADC1            0xA6
    #define SMARTRF_SETTING_IF_ADC0            0x04
    #define SMARTRF_SETTING_FS_DIG1            0x00
    #define SMARTRF_SETTING_FS_DIG0            0x5F
    #define SMARTRF_SETTING_FS_CAL3            0x00
    #define SMARTRF_SETTING_FS_CAL2            0x20
    #define SMARTRF_SETTING_FS_CAL1            0x40
    #define SMARTRF_SETTING_FS_CAL0            0x0E
    #define SMARTRF_SETTING_FS_CHP             0x28
    #define SMARTRF_SETTING_FS_DIVTWO          0x03
    #define SMARTRF_SETTING_FS_DSM1            0x00
    #define SMARTRF_SETTING_FS_DSM0            0x33
    #define SMARTRF_SETTING_FS_DVC1            0xFF
    #define SMARTRF_SETTING_FS_DVC0            0x17
    #define SMARTRF_SETTING_FS_LBI             0x00
    #define SMARTRF_SETTING_FS_PFD             0x50
    #define SMARTRF_SETTING_FS_PRE             0x6E
    #define SMARTRF_SETTING_FS_REG_DIV_CML     0x14
    #define SMARTRF_SETTING_FS_SPARE           0xAC
    #define SMARTRF_SETTING_FS_VCO4            0x14
    #define SMARTRF_SETTING_FS_VCO3            0x00
    #define SMARTRF_SETTING_FS_VCO2            0x00
    #define SMARTRF_SETTING_FS_VCO1            0x00
    #define SMARTRF_SETTING_FS_VCO0            0xB4
    #define SMARTRF_SETTING_GBIAS6             0x00
    #define SMARTRF_SETTING_GBIAS5             0x02
    #define SMARTRF_SETTING_GBIAS4             0x00
    #define SMARTRF_SETTING_GBIAS3             0x00
    #define SMARTRF_SETTING_GBIAS2             0x10
    #define SMARTRF_SETTING_GBIAS1             0x00
    #define SMARTRF_SETTING_GBIAS0             0x00
    #define SMARTRF_SETTING_IFAMP              0x01
    #define SMARTRF_SETTING_LNA                0x01
    #define SMARTRF_SETTING_RXMIX              0x01
    #define SMARTRF_SETTING_XOSC5              0x0E
    #define SMARTRF_SETTING_XOSC4              0xA0
    #define SMARTRF_SETTING_XOSC3              0x03
    #define SMARTRF_SETTING_XOSC2              0x04
    #define SMARTRF_SETTING_XOSC1              0x03
    #define SMARTRF_SETTING_XOSC0              0x00
    #define SMARTRF_SETTING_ANALOG_SPARE       0x00
    #define SMARTRF_SETTING_PA_CFG3            0x00
    #define SMARTRF_SETTING_WOR_TIME1          0x00
    #define SMARTRF_SETTING_WOR_TIME0          0x00
    #define SMARTRF_SETTING_WOR_CAPTURE1       0x00
    #define SMARTRF_SETTING_WOR_CAPTURE0       0x00
    #define SMARTRF_SETTING_BIST               0x00
    #define SMARTRF_SETTING_IQIE_I1            0x00
    #define SMARTRF_SETTING_IQIE_I0            0x00
    #define SMARTRF_SETTING_IQIE_Q1            0x00
    #define SMARTRF_SETTING_IQIE_Q0            0x00
    #define SMARTRF_SETTING_RSSI1              0x80
    #define SMARTRF_SETTING_RSSI0              0x00
    #define SMARTRF_SETTING_MARCSTATE          0x41
    #define SMARTRF_SETTING_LQI_VAL            0x00
    #define SMARTRF_SETTING_DEM_STATUS         0x00
    #define SMARTRF_SETTING_FREQOFF_EST1       0x00
    #define SMARTRF_SETTING_FREQOFF_EST0       0x00
    #define SMARTRF_SETTING_AGC_GAIN3          0x00
    #define SMARTRF_SETTING_AGC_GAIN2          0xD1
    #define SMARTRF_SETTING_AGC_GAIN1          0x00
    #define SMARTRF_SETTING_AGC_GAIN0          0x3F
    #define SMARTRF_SETTING_CFM_TX_DATA_IN     0x00
    #define SMARTRF_SETTING_RNDGEN             0x7F
    #define SMARTRF_SETTING_MAGN2              0x00
    #define SMARTRF_SETTING_MAGN1              0x00
    #define SMARTRF_SETTING_MAGN0              0x00
    #define SMARTRF_SETTING_ANG1               0x00
    #define SMARTRF_SETTING_ANG0               0x00
    #define SMARTRF_SETTING_CHFILT_I2          0x08
    #define SMARTRF_SETTING_CHFILT_I1          0x00
    #define SMARTRF_SETTING_CHFILT_I0          0x00
    #define SMARTRF_SETTING_CHFILT_Q2          0x00
    #define SMARTRF_SETTING_CHFILT_Q1          0x00
    #define SMARTRF_SETTING_CHFILT_Q0          0x00
    #define SMARTRF_SETTING_GPIO_STATUS        0x00
    #define SMARTRF_SETTING_FSCAL_CTRL         0x01
    #define SMARTRF_SETTING_PHASE_ADJUST       0x00
    #define SMARTRF_SETTING_PARTNUMBER         0x48
    #define SMARTRF_SETTING_PARTVERSION        0x21
    #define SMARTRF_SETTING_MODEM_STATUS1      0x10
    #define SMARTRF_SETTING_MODEM_STATUS0      0x00
    #define SMARTRF_SETTING_MARC_STATUS1       0x00
    #define SMARTRF_SETTING_MARC_STATUS0       0x00
    #define SMARTRF_SETTING_PA_IFAMP_TEST      0x00
    #define SMARTRF_SETTING_FSRF_TEST          0x00
    #define SMARTRF_SETTING_PRE_TEST           0x00
    #define SMARTRF_SETTING_PRE_OVR            0x00
    #define SMARTRF_SETTING_ADC_TEST           0x00
    #define SMARTRF_SETTING_DVC_TEST           0x0B
    #define SMARTRF_SETTING_ATEST              0x40
    #define SMARTRF_SETTING_ATEST_LVDS         0x00
    #define SMARTRF_SETTING_ATEST_MODE         0x00
    #define SMARTRF_SETTING_XOSC_TEST1         0x3C
    #define SMARTRF_SETTING_XOSC_TEST0         0x00
    #define SMARTRF_SETTING_RXFIRST            0x00
    #define SMARTRF_SETTING_TXFIRST            0x00
    #define SMARTRF_SETTING_RXLAST             0x00
    #define SMARTRF_SETTING_TXLAST             0x00
    #define SMARTRF_SETTING_NUM_TXBYTES        0x00
    #define SMARTRF_SETTING_NUM_RXBYTES        0x00

    Code in Prog_Pll_Em (i actually dont change the frequency i just do another calibration)

    #define FREQ_BASE		0x6C80			/* 434 MHz, step de 125 kHz, 80 canaux --> 915 - 925 MHz */
    #define CANAL_STEP		0x04		// correspond a 125 kHz
    void Prog_Pll_Em(unsigned int canal)
    	xdata unsigned char H_FREQ,L_FREQ,marcState;
    	xdata unsigned int FREQ;
    	FREQ = FREQ_BASE + (canal*CANAL_STEP);
    	FREQ--;												/* compensation quartz */
    	H_FREQ = (unsigned char)((FREQ>>8))&0x00FF;   		/* sepration registre */
    	L_FREQ = (unsigned char)(FREQ&0x00FF);				/* separation registre */
    /**///	WriteToCC1120Register(CC112X_FREQ2,H_FREQ);			// chgt frequence
    /**///	WriteToCC1120Register(CC112X_FREQ1,L_FREQ);			// chgt frequence
    	WriteToCC1120StrobeRegister(CC112X_SCAL);			// calibration manuelle
    	}while((marcState & 0x1F) != 0x01);					// attente IDLE mode

    The manual calibration is the code from the errata

    In regards for the SPI line, we already use CC1120 module in fifo mode and works great. I compared spi line from evaluation board and mine while reading marcstate register and nothing is wrong there.



  • When you have PARTVERSION = 0x21, like you do, you need to run the manual calibration routine from the errata. That means that you need to turn off autocal (SETTLING_CFG. FS_AUTOCAL = 00b).

    You have it set to 01.

    Also, you should not run the manual calibration routine before you set the FREQ register, but after.

    You cannot just strobe SCAL when you change FREQ registers (like you do in Prog_Pll_Em).

    You need to run the complete manualCalibration routine provided code for in the errata note.

    Pseudo code:

    • Init MCU
    • Write all register from SmartRF Studio to the CC1120 (Make sure SETTLING_CFG. FS_AUTOCAL = 00b)
    • Set the frequency (if not set with default values above)
    • Call manualCalibration() from the errata note (the complete code)
    • Strobe STX

    I am surprised if you get SETTLING_CFG = 0x0B from SmartRF Studio if you connect a device with PARTVERSION = 0x21.

    When I do this, I get SETTLING_CFG = 0x03

    If I open the device in offline mode, SETTLING_CFG = 0x0B (This is the value recommended you’re the newest devices, as these have not problems with the synth calibration)


  • I will try your suggestions.

    About the calibration, is necessary to do it every frequency change or once at startup is enough ?

    I will be back to you with the results

  • I removed Prog_Pll so i just init the CC1120 with fs_autocal correction and correct frequency then strobe STX.

    Same result : evaluation board OK, my board NOK. (same config in both, data stream is generate by the same device, receiver is the same, i just change de "black box" which is on 1 side evaluation board & smartRF and on the other my MCU & CC1120 rf module)

    Can you tell me what the firmware does when you press start and stop in smart rf studio (sniffing with time gaps is quite a challenge, it ll save me a lot of time at troubleshooting this) at this stage :

    - stop button initiate : strobe SIDLE then strobe SFTX

    -start button initiate : read part number (value 0x48), read part version (value 0x21), read NUM_TXBYTES (value 0x00),then i missing the rest


  • You say you init CC1120 with correct freq. and then do STX. So when do you do the manual calibration?


    • Init MCU
    • Write all register from SmartRF Studio to the CC1120 (Make sure SETTLING_CFG. FS_AUTOCAL = 00b)
    • Call manualCalibration() from the errata note (the complete code)
    • Strobe STX
  • Hello,

    I think it's easier for us (you and me ) to analyze why the evaluation board works then analyze why its doesnt on my hardware.

    May i ask again some pseudo code from the interaction between the evaluation board and smartRF studio software ?

    I think I'm missing something either obvious or stupid ^^"



  • Honestly, I do not know why you are facing problems with this.

    I did the following tests, and did not have any problems (I tested on 868 MHz band and with a CC1310 as a receiver, as this was the HW I had available:

    Test 1:

    To verify the settings, I was running SmartRF Studio on both CC1120 (TrxEB) and CC1310 (LP).

    I used Packet TX on CC1120 and Packet RX on CC1310.

    On CC1120 I used the 38.4 kbps and on the CC1310 I selected the 50 kbps settings. In both cases, I changed the data rate to 9.6 kbps.

    Test 2:

    I selected Cont. TX in SmartRF Studio for the CC1120 and connected another MCU to the clock and data lines (GDO0 and GDO2). The other MCU was running code to transmit packets serially on the data line.

    All packets were received by the CC1310 and SmartRF Studio

    Test 3:

    I did a code export in SmartRF Studio (from cont. mode). Settings are shown below:

    // Address Config = No address check 
    // Bit Rate = 9.6 
    // Carrier Frequency = 868.000000 
    // Deviation = 20.019531 
    // Device Address = 0 
    // Manchester Enable = false 
    // Modulation Format = 2-GFSK 
    // PA Ramping = true 
    // Packet Bit Length = 0 
    // Packet Length = 3 
    // Packet Length Mode = Variable 
    // Performance Mode = High Performance 
    // RX Filter BW = 100.000000 
    // Symbol rate = 9.6 
    // TX Power = 15 
    // Whitening = false 
    static const registerSetting_t preferredSettings[]= 
      {CC112X_IOCFG3,            0xB0},
      {CC112X_IOCFG2,            0x08},
      {CC112X_IOCFG1,            0xB0},
      {CC112X_IOCFG0,            0x09},
      {CC112X_SYNC_CFG1,         0x08},
      {CC112X_DEVIATION_M,       0x48},
      {CC112X_MODCFG_DEV_E,      0x0D},
      {CC112X_DCFILT_CFG,        0x1C},
      {CC112X_PREAMBLE_CFG1,     0x00},
      {CC112X_IQIC,              0x00},
      {CC112X_CHAN_BW,           0x02},
      {CC112X_MDMCFG1,           0x06},
      {CC112X_MDMCFG0,           0x05},
      {CC112X_SYMBOL_RATE2,      0x73},
      {CC112X_AGC_CS_THR,        0x19},
      {CC112X_AGC_CFG1,          0xA9},
      {CC112X_AGC_CFG0,          0xCF},
      {CC112X_FIFO_CFG,          0x00},
      {CC112X_SETTLING_CFG,      0x03},
      {CC112X_FS_CFG,            0x12},
      {CC112X_PKT_CFG2,          0x05},
      {CC112X_PKT_CFG1,          0x00},
      {CC112X_PKT_CFG0,          0x20},
      {CC112X_PA_CFG0,           0x7D},
      {CC112X_IF_MIX_CFG,        0x00},
      {CC112X_FREQOFF_CFG,       0x22},
      {CC112X_FREQ2,             0x6C},
      {CC112X_FREQ1,             0x80},
      {CC112X_FS_DIG1,           0x00},
      {CC112X_FS_DIG0,           0x5F},
      {CC112X_FS_CAL1,           0x40},
      {CC112X_FS_CAL0,           0x0E},
      {CC112X_FS_DIVTWO,         0x03},
      {CC112X_FS_DSM0,           0x33},
      {CC112X_FS_DVC0,           0x17},
      {CC112X_FS_PFD,            0x50},
      {CC112X_FS_PRE,            0x6E},
      {CC112X_FS_REG_DIV_CML,    0x14},
      {CC112X_FS_SPARE,          0xAC},
      {CC112X_FS_VCO0,           0xB4},
      {CC112X_XOSC5,             0x0E},
      {CC112X_XOSC1,             0x03},
      {CC112X_PARTNUMBER,        0x48},
      {CC112X_PARTVERSION,       0x21},
      {CC112X_SERIAL_STATUS,     0x08},
      {CC112X_MODEM_STATUS1,     0x10},

    I wrote a small program on the CC1120 doing the following:

    void main(void)
        // Initialize MCU and peripherals
        // Write radio registers

    On the other MCU I had the same code running as before. Also in this case all packets were received by the CC1310



  • Hello Siri,

    I'm in the case of your setup "Test 2". I don't know why it doesnt work on my hardware.

    I ll go back scratch my head and i ll post the solution if i find one.

    Thanks for your help