Skip to content
My Account

Reference

CC1101 868MHz SPI RF Module – Complete Guide

A programmable sub-GHz transceiver for the 868 MHz ISM band with hardware packet handling, CRC and RSSI built in. The pinout of the module with labeled diagrams, ESP32 wiring, ESP-IDF SPI setup, register configuration, and how it compares to LoRa.

  • 868 MHz ISM band
  • SPI interface
  • Up to 600 kbit/s
  • 3.3 V only
No ratings yet, be the first.

Overview

The CC1101 868 MHz SPI RF module is a small, low-power sub-GHz transceiver for IoT, telemetry, home automation and your own radio networks. It is built around the CC1101 chip from Texas Instruments and gives you far more control than a simple ASK/OOK transmitter module: packet handling, CRC, address filtering and signal strength are done in hardware.

A real transceiverIt both sends and receives, with 64-byte FIFOs for each direction, so the microcontroller only has to move bytes over SPI.
Packets in hardwarePreamble, sync word, length, address check and CRC are handled by the chip, which keeps the firmware small.
3.3 V onlyThe chip runs from 1.8 to 3.6 V and 3.9 V is the absolute maximum. Never connect the module to 5 V.

What is the CC1101?

The CC1101 is a programmable sub-GHz RF transceiver from Texas Instruments for low-power wireless communication in the ISM bands 315, 433, 868 MHz (Europe) and 915 MHz (US). Unlike a basic ASK/OOK module it is a true transceiver: it sends and receives, handles packets, CRC and address filtering in hardware, measures the signal strength and keeps 64 bytes of FIFO for each direction. The module you buy is this chip on a small board with the matching network and a header or pads.

ItemValue
ChipTexas Instruments CC1101, QLP 20-pin, 4 × 4 mm
Frequency bands300 to 348 MHz, 387 to 464 MHz and 779 to 928 MHz
Modulation2-FSK, 4-FSK, GFSK and MSK, plus OOK and flexible ASK shaping
Data rate0.6 to 600 kbps, depends on the modulation
Output powerProgrammable, up to +12 dBm
Sensitivity−112 dBm at 1.2 kBaud and 868 MHz, 1 % packet error rate
Supply1.8 to 3.6 V, 3.9 V absolute maximum
Current14.7 mA in receive at 1.2 kBaud and 868 MHz, 200 nA in sleep
Start-up240 µs from sleep to receive or transmit
InterfaceSPI, plus two configurable output pins GDO0 and GDO2
ExtrasWake-on-radio (automatic low-power receive polling), RSSI and link quality indication
Temperature−40 to 85 °C
On this boardThe drawing shows a 26.000 MHz crystal next to the chip. The data sheet recommends a 26 MHz crystal below 869 MHz and a 27 MHz crystal above it

Source: Texas Instruments CC1101 data sheet SWRS061I, checked 6 November 2026.

Getting started

The steps below use an ESP32 and ESP-IDF, the same setup as the rest of this guide.

1. What you needThe module, an antenna (a piece of wire of about 8.2 cm is a start, see Practical engineering tips), an ESP32 board and six jumper wires.
2. Wire it upConnect VCC to 3V3, GND to ground, and the SPI pins and GDO0 as in the table “Connecting to an ESP32”. Connect the antenna to the ANT pad, with a ground pad on either side.
3. Read a registerInitialise SPI, wait until the chip is ready and read the status registers PARTNUM and VERSION (addresses 0x30 and 0x31, read with the burst bit set). If you only read 0x00 or 0xFF, check power, CSN and the wiring first.

Specifications

Radio

Frequency bands300 to 348 MHz, 387 to 464 MHz and 779 to 928 MHz. The module in this guide is tuned for 868 MHz
Modulation2-FSK, GFSK, 4-FSK, MSK, OOK and ASK
Data rate0.6 to 500 kBaud with 2-FSK, 0.6 to 250 kBaud with GFSK, OOK and ASK, up to 600 kbit/s with 4-FSK
Output powerUp to +12 dBm at 868 MHz
Sensitivity-112 dBm at 1.2 kBaud and 868 MHz
Crystal26 MHz, on the module

Electrical

Supply1.8 to 3.6 V, the module is used at 3.3 V. Absolute maximum 3.9 V
Receive current14.7 to 15.7 mA at 1.2 kBaud and 868 MHz
Transmit current16.8 mA at 0 dBm, 30.0 mA at +10 dBm and 34.2 mA at +12 dBm, at 868 MHz
Sleep current0.2 µA typical, 1 µA maximum
SPI clockUp to 10 MHz. For single accesses 9 MHz, for burst accesses 6.5 MHz
InterfaceSPI, plus two configurable output pins (GDO0 and GDO2)

The chip is not 5 V tolerant. Power the module from 3.3 V and use 3.3 V logic.

The values are those of the CC1101 chip. The range of your module also depends on the antenna and on the matching circuit on the board.

Source: Texas Instruments CC1101 data sheet SWRS061I, checked 6 November 2026.

Pinout diagram: front

The module has 11 pins: 8 along the bottom edge and 3 along the top edge, where the antenna is. Pin 1 is at the bottom left. The pin numbers are the ones printed in the pinout of the module: VCC, GND, MOSI, CLK, MISO, GDO2, GDO0 and CSN along the bottom, and GND, ANT and GND along the top.

CC1101 868 MHz module pinout, front, with the 8 pins at the bottom and the 3 pins at the top

Pinout diagram: back

The back is mirrored, so pin 8 is at the bottom left and pin 11 at the top right. The back has only vias and no components.

CC1101 868 MHz module pinout, back, mirrored

Pins at a glance

The 11 pins grouped by job.

The 11 pins of the CC1101 module grouped by job: power, SPI, configurable outputs and antenna

Pin reference

PinNameFunctionNote
1VCC3.3 V supplyNever 5 V
2GNDGround
3MOSISPI data inFrom the microcontroller
4CLKSPI clock (SCK)
5MISOSPI data outAlso shows when the crystal is ready after CSN goes low
6GDO2Configurable outputCan signal for example a received packet or carrier detect
7GDO0Configurable outputUsed as the interrupt for packet sent and packet received
8CSNChip select, active low
9GNDGroundNext to the antenna pad
10ANTAntennaConnect an antenna of 50 Ω, with ground on both sides
11GNDGroundNext to the antenna pad

The GDO pins can signal packet sent, packet received, carrier detect and the FIFO thresholds. They are what makes an interrupt-driven design possible. Their function is set in the registers IOCFG0 and IOCFG2.

The pin order is that of the module drawn in this guide. Many other CC1101 boards use a different order, so check the labels on your own board.

Connecting to an ESP32

Typical wiring using the VSPI bus:

CC1101ESP32
VCC3V3
GNDGND
SCKGPIO18
MISOGPIO19
MOSIGPIO23
CSNGPIO5
GDO0GPIO4

This uses the VSPI pins of the ESP32 (SPI3 in ESP-IDF). CSN is a normal GPIO that the SPI driver switches. See the ESP32-WROOM-32D pinout for the pins of the module.

Software setup

The chip has about 47 configuration registers, so most people use a library or generate the register values with TI’s SmartRF Studio. These are the usual routes:

RouteWhat to do
SmartRC-CC1101-Driver-Lib (ELECHOUSE)Arduino library for the CC1101, popular with ESP32 and Arduino. Install it from the Library Manager or from GitHub. It sets the frequency, power and modulation with simple calls
RadioLibArduino and PlatformIO library with a CC1101 class next to many other radios. Add jgromes/RadioLib to lib_deps
ESP-IDFUse the SPI master driver as in this guide, or port one of the libraries above
SmartRF StudioTI’s free tool: choose the band, data rate and modulation, then export the register values

Whichever route you take, set the pins first: SCK, MISO and MOSI to the SPI bus of your board, CSN to a free GPIO, and GDO0 to an input that can take an interrupt. Both ends of a link must use the same frequency, data rate, modulation and sync word, or they will not hear each other.

Library names are given as pointers. I did not test them with this module.

SPI initialization (ESP-IDF)

Minimal SPI configuration:

spi_bus_config_t buscfg = {
    .miso_io_num = 19,
    .mosi_io_num = 23,
    .sclk_io_num = 18,
    .quadwp_io_num = -1,
    .quadhd_io_num = -1
};

spi_device_interface_config_t devcfg = {
    .clock_speed_hz = 1000000,
    .mode = 0,
    .spics_io_num = 5,
    .queue_size = 3,
};

spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO);
spi_bus_add_device(SPI3_HOST, &devcfg, &cc1101_handle);

The CC1101 can run the SPI clock at up to 10 MHz, but 1 MHz is a stable value during development. Every transfer starts with a header byte: the first bit is read or write, the second bit is the burst bit, and the other six bits are the address. After CSN goes low, wait until the MISO line goes low before you send the header, that shows the crystal is running. The snippets in this guide are examples and were not run on a board for this guide.

Source: Texas Instruments CC1101 data sheet SWRS061I, checked 6 November 2026.

Register configuration explained

The CC1101 is controlled through configuration registers.

Frequency registers

  • FREQ2
  • FREQ1
  • FREQ0

With the 26 MHz crystal, the carrier frequency is 26 MHz / 65536 x FREQ. A usual value for the 868 MHz band is:

FREQ2 = 0x21
FREQ1 = 0x65
FREQ0 = 0x6A   // 868.3 MHz

For exactly 868.0 MHz the three registers are 0x21, 0x62 and 0x76.

Modulation configuration

The registers MDMCFG4, MDMCFG3 and MDMCFG2 set the data rate, the channel bandwidth, the modulation and the sync word handling. A typical example is 38.4 kBaud, 2-FSK, with CRC enabled.

Packet configuration

The registers PKTCTRL1, PKTCTRL0 and PKTLEN set how packets are handled. A typical setup:

PKTCTRL0 = 0x05   // Variable length + CRC enabled

The chip then handles the preamble, sync word, CRC and packet length itself, which keeps the firmware small. Use the settings that the SmartRF Studio tool of Texas Instruments gives for your data rate, instead of building the register values by hand.

Source: Texas Instruments CC1101 data sheet SWRS061I, checked 6 November 2026.

Transmit (TX) and receive (RX) flow

Transmit

  1. Set device to IDLE
  2. Flush TX FIFO
  3. Write packet length
  4. Write payload
  5. Send STX strobe
  6. Wait for GDO0 interrupt
cc1101_strobe(SIDLE);
cc1101_strobe(SFTX);
cc1101_write_reg(TXFIFO, length);
cc1101_write_burst(TXFIFO, payload, length);
cc1101_strobe(STX);

Using GDO0 as a “packet sent” interrupt makes this efficient and non-blocking.

Receive

  1. Send SRX strobe
  2. Wait for GDO0 interrupt
  3. Read packet length
  4. Read payload
  5. Check CRC status
cc1101_strobe(SRX);
// Wait for interrupt
cc1101_read_reg(RXFIFO, &length);
cc1101_read_burst(RXFIFO, buffer, length);

Interrupt-driven RX avoids polling and improves power efficiency.

RSSI measurement

The RSSI register gives the signal strength as a number from 0 to 255. It is a signed value, so use the formula of the data sheet:

if (RSSI_dec >= 128)
    RSSI_dBm = (RSSI_dec - 256) / 2 - RSSI_offset;
else
    RSSI_dBm = RSSI_dec / 2 - RSSI_offset;

RSSI_offset is about 74 dB at 868 MHz, for data rates from 1.2 to 500 kBaud. It lets you estimate link quality, scan channels, adapt the transmit power and decide when to retry.

Source: Texas Instruments CC1101 data sheet SWRS061I, checked 6 November 2026.

EU 868 MHz regulations

In Europe the 868 MHz band is divided in sub-bands with their own limits on power and duty cycle. Many of them allow 1% or 0.1% duty cycle. With 1%, if you transmit for 1 second, you must stay silent for 99 seconds. Some sub-bands allow a higher duty cycle, so look up the sub-band you use in the rules for your country (ETSI EN 300 220 and the national frequency table). Always verify the local rules before you deploy.

CC1101 vs SX1276 (LoRa)

A common alternative is the SX1276 from Semtech.

FeatureCC1101SX1276
ModulationFSK, GFSK, OOKLoRa + FSK
Max Range~1 km5–15 km
Sensitivity~ -110 dBmDown to -148 dBm
Data RateUp to 600 kbpsVery low (LoRa mode)
LatencyLowHigh
Deterministic timingYesNo (LoRa spreading)

When to Choose CC1101

  • Low latency required
  • Higher throughput needed
  • Custom RF protocol
  • Deterministic timing
  • Industrial applications

When to Choose SX1276 (LoRa)

  • Extreme range
  • Battery-powered long-distance sensors
  • Rural telemetry
  • Very low data rate acceptable

Real gotchas

  • It is a 3.3 V device. 5 V on VCC or on a signal pin can destroy the chip. Use 3.3 V logic or a level shifter.
  • Wait for MISO after CSN goes low. The chip has to wake its crystal first. Sending the header too early gives wrong data, which looks like a broken module.
  • Burst bit for status registers. The status registers 0x30 to 0x3D, like PARTNUM, VERSION and RSSI, are only read when the burst bit is set in the header. Without it you read a command strobe instead of the register.
  • The module is tuned for one band. A 868 MHz board and a 433 MHz board look alike. The chip can tune more widely, but the matching network and the antenna are made for one band, so check the marking.
  • The antenna sets the range. Without an antenna or with a badly cut one the range falls to a few metres. Do not transmit for long without an antenna connected.
  • The GDO pins have defaults. Until you set IOCFG0 and IOCFG2, GDO0 and GDO2 output other signals than packet events. Set them before you use an interrupt.
  • Different boards, different pin order. The order in this guide is the order of this module. Check the labels on your own board.

Practical engineering tips

1. Antenna Is Critical

A quarter-wave antenna for 868 MHz is about 8.6 cm in free air. A real wire is a bit shorter, so start slightly below that and tune. A poorly tuned antenna reduces range dramatically.

Quarter-wave antenna length diagram for 868 MHz

2. Lower Data Rate = Longer Range

Reducing bitrate improves receiver sensitivity.

3. Use Interrupts

Use GDO0 for TX complete and RX received. Polling wastes CPU cycles and power.

4. Shielding & Layout

  • Keep antenna away from ground planes
  • Keep SPI lines short
  • Decouple VCC properly

RF layout matters.

What to build

The CC1101 suits remote sensors, your own low-latency links, and receiving or sending the signals of 868 MHz remotes. The HomeKit Bathroom Ventilation Controller project uses it to copy a real 868 MHz remote. For long distances and very low data rates, look at LoRa instead.

Safety notes

Before you wire anything up

  • Power the module from 3.3 V only. The absolute maximum of the chip is 3.9 V.
  • Connect an antenna before you transmit.
  • Stay within the duty cycle and power limits of your country for the 868 MHz band.
  • Do not use the module for anything where a lost message could cause harm. A radio link can drop out.

Conclusion

The CC1101 868 MHz SPI RF module remains one of the most useful sub-GHz modules for firmware developers. It uses little power, has hardware packet handling and gives you full control of the protocol with predictable timing. For ESP32 and ESP-IDF projects with your own RF stack it is a good choice, and it avoids the weight of LoRaWAN when you do not need the range. Power it from 3.3 V, wait for MISO, and give it a good antenna.

Chip values are from the Texas Instruments CC1101 data sheet. The pin order is that of the module in the supplied drawing.

Advertisement
All guides

More guides

Keep building.

From ESP32 HomeKit accessories to Arduino and ATtiny reference guides, there’s more where this came from.

All guides