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.

CC1101: CC1101 async receives perfectly at 433 and 868 MHz, but has a poor "sensitivity" at 303 MHz

Part Number: CC1101

Hello all.

I expect an AGC problem with CC1101, configured in async mode and receiving frames transmitted by garage door remote controls (manchester, OOK, about 1kbps, no preamble, no sync, frame is 12-30 pulses long, with 10-20ms blank between frames).

When I connect the receiver to a AM signal generator with 1KHz modulation signal, I always get -120dBm of conducted sensitivity when I set BW 100KHz, and -110dBm when using BW 270KHz. Demodulated signal appears perfect at 303, 433 and 868 MHz as well.

When I connect a lambda/4 wire to the CC1101 receiver and to RF generator, radiated sensitivity is very good in all frequency (-70dBm power on the RF generator is sufficient to see the square wave on the demodulator: distance from antennas is less than 1m).

When I try using remote controls, performances are:

* perfect at 868 MHz: very long range (400m)

* a bit lower range at 433MHz, but good. (250m)

* very very short range at 303MHz. (40m)

I believe there is a problem with AGC: please note that there's a huge blank time between frames, 10-30ms, so I understand that the first frame can be missed (and used by the CC1101 to setup the gain of internal LNAs) but next frames are easily received only at 433 and 868MHz.

What I don't understand is why the receiver performs very very well at 868, and very very bad at 303 MHz. The only difference in my configuration is test0 that is set to 0x0b (at 303MHz) instead of 0x09 (at 433/868MHz).

Please could you explain me what is the difference inside CC1101 from 303 MHz and 433/868 MHz (I believe another VCO is selected, right?) ? Why AGC works well at 433 and 868, and works bad at 303MHz?

I've setup AGC to be very slow:  fsctrl1=0x04, agcctrl2=0x06, agcctrl1=0, agcctrl0=0xf0 and bitrate=2400bps

Trying with higher IF frequency or different AGCCTRLx values (as suggested by DN022) lead to poor results.

I look forward for your information or suggestions!
Thanks a lot.

  • My understanding is that the sensitivity is good on all 3 RF frequency bands when doing conducted measurements. When doing range testing, however, the 303 MHz solution is significantly worse than 868 MHz. This points to the antenna performance being worse on 303 MHz vs 868 MHz so this is were I would focus the debugging. The AGC works on the down-converted signal in the digital domain and this is the same regardless of RF frequency so I do not agree with your assumption that the degraded performance is due to the AGC.

    The IF ADC has a finite dynamic range. At the lower end there will be 1/f noise and at the high end there will be quantization noise. The ADC noise transfer function is not flat between the 1/f and quantization noise and the IF should be as low as possible for best sensitivity (lowest SNR). The RX filter BW is centered around the IF.and should be >=RX filter BW / 2 to get away from the 1/f noise. At the same time it cannot be too high as you want to avoid the quantization noise If you have FSCTRL1 = 0x4 the IF is approx 100 kHz. This means that an RX filter BW of 270 kHz is too wide. Use the IF frequency suggested by SmartRF Studio for the RX filter BW you are using.

    If you don't follow the design steps in DN022 you might get a solution which might have unstable reception. That is there might be regions in the input dynamic range where you start to get packet loss (there is a figure in the design note showing this). I am not saying our settings are not good, but make sure you test for input power levels ranging from the sensitivity limit up to the saturation level.  


  • Hello Sverre,
    Thanks a lot for the clear answer.
    I agree with you that IF blocks are always the same, regarding the RF frequency used.
    Please could you also clarify how VCOs (I've read that there are 2 VCO inside CC1101) are connected, which ranges of frequency they cover (I mean the real frequency, around 2-3 GHz??)?

    Also, can you explain AGC characteristics? The problem using CC1101 to detect garage door remote control signals, is that frames are separated by 10-30ms of blank time, where AGC raise its gain to try to decode noise.
    What I see is that with the same configuration, at 868 MHz I see that demodulator output (on GDOx pin) is stable low without any good signal, while at 433 and indeed at 303 MHz, there are several commutations caused by noise. Is it possible to configure some registers to avoid those spurious commutations on the demodulator output?
    As said before, I configured agcctrl0 to 0xf0 and very small bitrate: in this way AGC seems to be slower and sometimes doesn't toggle output during the blank time between frames. How can I get the demodulator output stays low for all the time without a valid signal received (as happen at 868MHz)? If I set agcctrl0 to 0xf1 or 0xf2 (or 0x91 or 0x92), demodulator output stays 1 all the time (and sensitivity is much lower than with 0xX0), while I expect that when agcctrl0 is 0xX1 or 0xX2 the demodulator output stays down much more than with agcctrl0 =0xX0.
    Thanks a lot for your time and support.
  • There are 2 VCO’s (called “low” and “high”). Difference is the on-chip inductor value. The two VCO’s are connected to a MUX.

    When TEST0.VCO_SEL_CAL_EN = 0, the VCO to use is set manually through FSCAL2[5] (0 = low, 1 = high).

    When TEST0.VCO_SEL_CAL_EN = 1, the VCO used by CC1101 is always the lower one. FSCAL2[5] is dont't care in this case.

    In SmartRF Studio we set FSCAL2.VCO_CORE_H_EN = 1 for both TEST0.VCO_SEL_CAL_EN = 0 and TEST0.VCO_SEL_CAL_EN = 1, but this setting is only relevant for TEST0.VCO_SEL_CAL_EN = 0.

    Frequency range 779- 928.  

    freq >= 861 => TEST0.VCO_SEL_CAL_EN = 0 & FSCAL2.VCO_CORE_H_EN = 1
    freq < 861 => TEST0.VCO_SEL_CAL_EN = 1 & FSCAL2.VCO_CORE_H_EN = 1
    (Alternative: TEST0.VCO_SEL_CAL_EN = 0 & FSCAL2.VCO_CORE_H_EN = 0 )

    High VCO goes up to 928 x 6 MHz

    Low VCO goes down to 779 x 6 MHz

    There is an overlap between the two VCO’s around 861 x 6 MHz.


    The AGC adjusts down the gain very fast, but increases the gain rather slowly. If this were not the case OOK demodulation would not work as the logic 0’s and logic 1’s (low and high power respectively) would have the same amplitude internal to the chip.

    Your frame does not include a preamble nor a sync word. The first frame will then most likely not be received correctly across the full input dynamic range as the AGC needs a few bits to settle. I assume you send 2 or more frames with the same information (at least that is common in some older protocols). One thought is then to treat the first frame as a “preamble” and read the AGC gain at the end of the frame through register AGCTEST. Next freeze the AGC gain by setting AGCCTRL0. AGC_FREEZE[1:0] = 3 and write back AGCTEST values.

    AGCTEST[7:6]: First LNA. “00” is max gain; “10” is minimum gain

    AGCTEST[5:3]: Second LNA. “000” is mimimum gain; “111” is maximum gain

    AGCTEST[2:0]: Digital LNA. “000” is minimum gain; “111” is max gain

  • Hi Sverre,

    very nice explanation of the internal side of CC1101, thanks.

    I'm really sorry to annoying you with my problems with 303MHz, but I've found that problem was caused by indoor noise (oscilloscope and PC!!): when PC and oscilloscope are ON, I can see several carriers (-80 -90dBm) around 303 MHz, and this is the reason that lead to huge noise in the demodulated signal at 303 MHz, and poor radiated sensitivity (while connecting the RF generator, always was perfect).
    I've just switched off everything in my lab, test CC1101 receiver again and got a quite good range.

    Thanks a lot for your support.


  • Hello,

    What is the full range of each of the VCOs (min and max frequency)? We have been using the low VCO for carrier operation at 450 MHz and not noticed any obvious problems. Should we switch to the high VCO or is the overlap between VCOs sufficient to cover that frequency?

    Thank You,
  • When TEST0.VCO_SEL_CAL_EN = 0, the VCO to use is set manually through FSCAL2[5] (0 = low, 1 = high).
    When TEST0.VCO_SEL_CAL_EN = 1, the VCO used by CC1101 is always the lower one. FSCAL2[5] is dont't care in this case. 

    Freq. range 300 - 348
    freq >= 322.88 => TEST0.VCO_SEL_CAL_EN = 0 & FSCAL2.VCO_CORE_H_EN = 1
    freq < 322.88 => TEST0.VCO_SEL_CAL_EN = 1 & FSCAL2.VCO_CORE_H_EN = don't care 

    Freq. range 400- 464
    freq >= 430.5 => TEST0.VCO_SEL_CAL_EN = 0 & FSCAL2.VCO_CORE_H_EN = 1
    freq < 430.5 => TEST0.VCO_SEL_CAL_EN = 1 & FSCAL2.VCO_CORE_H_EN = don't care 

    Freq. range 800- 928
    freq >= 861 => TEST0.VCO_SEL_CAL_EN = 0 & FSCAL2.VCO_CORE_H_EN = 1
    freq < 861 => TEST0.VCO_SEL_CAL_EN = 1 & FSCAL2.VCO_CORE_H_EN = don't care

    There is an overlap between high and low VCO, but the guaranteed VCO range is as given above. When operating at 450 MHz you should be using the "high VCO" to ensure operation across process variations.