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
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.
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.
| Item | Value |
|---|---|
| Chip | Texas Instruments CC1101, QLP 20-pin, 4 × 4 mm |
| Frequency bands | 300 to 348 MHz, 387 to 464 MHz and 779 to 928 MHz |
| Modulation | 2-FSK, 4-FSK, GFSK and MSK, plus OOK and flexible ASK shaping |
| Data rate | 0.6 to 600 kbps, depends on the modulation |
| Output power | Programmable, up to +12 dBm |
| Sensitivity | −112 dBm at 1.2 kBaud and 868 MHz, 1 % packet error rate |
| Supply | 1.8 to 3.6 V, 3.9 V absolute maximum |
| Current | 14.7 mA in receive at 1.2 kBaud and 868 MHz, 200 nA in sleep |
| Start-up | 240 µs from sleep to receive or transmit |
| Interface | SPI, plus two configurable output pins GDO0 and GDO2 |
| Extras | Wake-on-radio (automatic low-power receive polling), RSSI and link quality indication |
| Temperature | −40 to 85 °C |
| On this board | The 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.
Specifications
Radio
| Frequency bands | 300 to 348 MHz, 387 to 464 MHz and 779 to 928 MHz. The module in this guide is tuned for 868 MHz |
| Modulation | 2-FSK, GFSK, 4-FSK, MSK, OOK and ASK |
| Data rate | 0.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 power | Up to +12 dBm at 868 MHz |
| Sensitivity | -112 dBm at 1.2 kBaud and 868 MHz |
| Crystal | 26 MHz, on the module |
Electrical
| Supply | 1.8 to 3.6 V, the module is used at 3.3 V. Absolute maximum 3.9 V |
| Receive current | 14.7 to 15.7 mA at 1.2 kBaud and 868 MHz |
| Transmit current | 16.8 mA at 0 dBm, 30.0 mA at +10 dBm and 34.2 mA at +12 dBm, at 868 MHz |
| Sleep current | 0.2 µA typical, 1 µA maximum |
| SPI clock | Up to 10 MHz. For single accesses 9 MHz, for burst accesses 6.5 MHz |
| Interface | SPI, 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.
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.
Pins at a glance
The 11 pins grouped by job.
Pin reference
| Pin | Name | Function | Note |
|---|---|---|---|
| 1 | VCC | 3.3 V supply | Never 5 V |
| 2 | GND | Ground | |
| 3 | MOSI | SPI data in | From the microcontroller |
| 4 | CLK | SPI clock (SCK) | |
| 5 | MISO | SPI data out | Also shows when the crystal is ready after CSN goes low |
| 6 | GDO2 | Configurable output | Can signal for example a received packet or carrier detect |
| 7 | GDO0 | Configurable output | Used as the interrupt for packet sent and packet received |
| 8 | CSN | Chip select, active low | |
| 9 | GND | Ground | Next to the antenna pad |
| 10 | ANT | Antenna | Connect an antenna of 50 Ω, with ground on both sides |
| 11 | GND | Ground | Next 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:
| CC1101 | ESP32 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SCK | GPIO18 |
| MISO | GPIO19 |
| MOSI | GPIO23 |
| CSN | GPIO5 |
| GDO0 | GPIO4 |
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:
| Route | What 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 |
| RadioLib | Arduino and PlatformIO library with a CC1101 class next to many other radios. Add jgromes/RadioLib to lib_deps |
| ESP-IDF | Use the SPI master driver as in this guide, or port one of the libraries above |
| SmartRF Studio | TI’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
- Set device to IDLE
- Flush TX FIFO
- Write packet length
- Write payload
- Send STX strobe
- 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
- Send SRX strobe
- Wait for GDO0 interrupt
- Read packet length
- Read payload
- 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.
| Feature | CC1101 | SX1276 |
|---|---|---|
| Modulation | FSK, GFSK, OOK | LoRa + FSK |
| Max Range | ~1 km | 5–15 km |
| Sensitivity | ~ -110 dBm | Down to -148 dBm |
| Data Rate | Up to 600 kbps | Very low (LoRa mode) |
| Latency | Low | High |
| Deterministic timing | Yes | No (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.
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.
More guides
Keep building.
From ESP32 HomeKit accessories to Arduino and ATtiny reference guides, there’s more where this came from.
All guides

