El mundo de la radio sub GHz suele esconderse detrás de módulos baratos que solo saben prender y apagar una señal. El CC1101 de Texas Instruments juega en otra liga: es un transceptor programable que maneja paquetes por hardware, calcula CRC, mide la potencia de la señal recibida y te deja armar tu propio protocolo RF desde cero. En esta guía vas a conectarlo a un ESP32 por SPI usando ESP IDF, vas a entender qué hace cada registro clave y vas a dejar funcionando un flujo de transmisión y recepción en la banda europea de 868 MHz.
Al terminar vas a saber para qué sirve el CC1101 frente a un módulo ASK simple, cómo cablearlo al bus VSPI del ESP32, cómo inicializar el periférico SPI, qué registros tocar para fijar frecuencia y modulación, y cómo leer el RSSI para estimar la calidad del enlace. Es un proyecto de nivel avanzado pensado para quien quiere control total del stack RF sin la complejidad de LoRaWAN.

Qué es el CC1101 y por qué no es un módulo RF cualquiera
El CC1101 es un transceptor de radiofrecuencia de bajo consumo diseñado para comunicación inalámbrica en las bandas ISM: 315 MHz, 433 MHz, 868 MHz (Europa) y 915 MHz (Estados Unidos). La diferencia con un transmisor RF básico está en todo lo que resuelve por dentro:
- Manejo de paquetes por hardware (preámbulo, palabra de sincronización y longitud).
- Generación y verificación de CRC automática.
- Filtrado por dirección, para que cada receptor escuche solo lo suyo.
- Medición de RSSI (potencia de la señal recibida).
- Modulación configurable.
- Buffers FIFO independientes para transmisión y recepción.
En resumen: es un transceptor de verdad, no un simple transmisor o receptor. Esa lógica integrada es justamente lo que baja la complejidad de tu firmware, porque tareas que tendrías que programar a mano las hace el chip.
Especificaciones técnicas
Estos son los parámetros que conviene tener a mano antes de diseñar:
| Parámetro | Valor |
|---|---|
| Rango de frecuencia | 387 a 464 MHz / 779 a 928 MHz |
| Versión común en Europa | 868 MHz |
| Interfaz | SPI |
| Modulación | 2 FSK, GFSK, MSK, OOK |
| Tasa de datos | 0.6 a 600 kbps |
| Potencia de salida | hasta +12 dBm |
| Sensibilidad de recepción | aprox. -110 dBm |
| Corriente en recepción | ~14 mA |
| Corriente en transmisión | 16 a 30 mA |
| Modo sleep | < 1 µA |
| Voltaje de alimentación | solo 3.3V |
Aviso importante: el CC1101 NO tolera 5V. Aliméntalo y conéctale las líneas SPI siempre a 3.3V. Por suerte, el ESP32 trabaja nativamente a 3.3V, así que es un compañero natural para este módulo.
Pinout del módulo
La mayoría de las placas breakout exponen estos pines. El diagrama de abajo muestra la distribución típica del módulo de 868 MHz:

| Pin | Descripción |
|---|---|
| VCC | Alimentación 3.3V |
| GND | Tierra |
| SCK | Reloj SPI |
| MISO | SPI MISO |
| MOSI | SPI MOSI |
| CSN | Chip select |
| GDO0 | Pin de interrupción configurable |
| GDO2 | Pin de interrupción configurable |
Los pines GDO son clave para un diseño eficiente, porque pueden avisar eventos como paquete enviado, paquete recibido, detección de portadora o umbrales del FIFO. Si querés un firmware que no viva haciendo polling, los GDO son tu mejor herramienta.
Conexión al ESP32
El cableado típico usa el bus VSPI del ESP32. Esta combinación de pines funciona bien con la configuración SPI por defecto de ESP IDF:
| CC1101 | ESP32 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SCK | GPIO18 |
| MISO | GPIO19 |
| MOSI | GPIO23 |
| CSN | GPIO5 |
| GDO0 | GPIO4 |
Fijate que GDO0 va a un GPIO de entrada (GPIO4) para poder atender la interrupción de paquete enviado o recibido. GDO2 puede quedar sin conectar si no lo necesitás en esta primera etapa.
Inicialización del SPI en ESP IDF
La configuración mínima del bus SPI y del dispositivo se ve así. El código va byte a byte como en el proyecto original, no le cambies los nombres de campos ni los valores:
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(VSPI_HOST, &buscfg, SPI_DMA_CH_AUTO);
spi_bus_add_device(VSPI_HOST, &devcfg, &cc1101_handle);
Un detalle de ingeniería: el CC1101 soporta SPI de hasta 10 MHz, pero arrancar a 1 MHz es lo más estable durante el desarrollo. Una vez que tengas el enlace funcionando, podés subir la velocidad si tu cableado y la integridad de señal lo permiten.
Configuración de registros explicada
El CC1101 se controla por completo a través de registros de configuración. Conviene agruparlos por función para no perderse.
Registros de frecuencia
Los registros FREQ2, FREQ1 y FREQ0 definen la portadora RF mediante el sintetizador de frecuencia interno. Para 868 MHz, los valores típicos son:
- FREQ2 = 0x21
- FREQ1 = 0x65
- FREQ0 = 0x6A
Configuración de modulación
Los registros MDMCFG4, MDMCFG3 y MDMCFG2 controlan la tasa de datos, el ancho de banda del canal, el formato de modulación y el manejo de la palabra de sincronización. Un ejemplo de configuración apunta a 38.4 kbps, modulación 2 FSK y CRC activado.
Configuración de paquetes
Los registros PKTCTRL1, PKTCTRL0 y PKTLEN definen cómo se arman los paquetes. Una configuración típica es:
PKTCTRL0 = 0x05 // Variable length + CRC enabled
Con esto, el CC1101 maneja automáticamente el preámbulo, la palabra de sincronización, el CRC y la longitud del paquete. Eso reduce muchísimo la complejidad del firmware: vos te concentrás en el dato útil y el chip se hace cargo del envoltorio.
Flujo de transmisión (TX)
La secuencia básica para transmitir es: poner el dispositivo en IDLE, vaciar el FIFO de transmisión, escribir la longitud, escribir el payload, lanzar el strobe STX y esperar la interrupción de GDO0.
cc1101_strobe(SIDLE);
cc1101_strobe(SFTX);
cc1101_write_reg(TXFIFO, length);
cc1101_write_burst(TXFIFO, payload, length);
cc1101_strobe(STX);
Usar GDO0 como interrupción de paquete enviado hace que el envío sea eficiente y no bloqueante: tu programa no se queda esperando, sino que reacciona cuando el chip avisa que terminó.
Flujo de recepción (RX)
Del lado del receptor la lógica es simétrica: lanzás el strobe SRX, esperás la interrupción de GDO0, leés la longitud del paquete, leés el payload y revisás el estado del CRC.
cc1101_strobe(SRX);
// Wait for interrupt
cc1101_read_reg(RXFIFO, &length);
cc1101_read_burst(RXFIFO, buffer, length);
La recepción guiada por interrupción evita el polling y mejora la eficiencia energética, algo que se agradece mucho en nodos a batería que tienen que escuchar durante horas.
Medición de RSSI
El registro RSSI entrega información de potencia de señal recibida. La fórmula para convertirlo a dBm es:
RSSI_dBm = (RSSI_dec / 2) - RSSI_offset
El offset típico es de aproximadamente 74. Tener el RSSI a mano te permite estimar la calidad del enlace, escanear canales, ajustar la potencia de transmisión de forma adaptativa y diseñar reintentos inteligentes cuando la señal está débil.
La antena: el componente que más rinde
La antena helicoidal de cuarto de onda de la foto siguiente es la que acompaña a la mayoría de estos módulos. Para 868 MHz, el largo de un cuarto de onda es de aproximadamente 8.6 cm:

Una antena mal sintonizada reduce drásticamente el alcance, así que no la subestimes: es lo más barato del proyecto y lo que más impacto tiene en el rendimiento real. Otras dos recomendaciones de ingeniería que valen oro:
- Bajar la tasa de datos mejora la sensibilidad del receptor, lo que se traduce en más alcance.
- Mantené la antena lejos de planos de tierra, las líneas SPI cortas y desacoplá bien el VCC. En RF, el layout importa tanto como el código.
Regulación de 868 MHz en Europa
La banda de 868 MHz en Europa está regulada con límites de ciclo de trabajo: 1% en general y 0.1% en ciertos sub bloques. Eso significa que si transmitís durante 1 segundo en una banda del 1%, tenés que quedarte en silencio los 99 segundos siguientes. Siempre verificá la normativa local antes de desplegar un equipo, porque las reglas cambian según el país y el uso.
CC1101 frente a SX1276 (LoRa)
Una alternativa habitual es el SX1276 de Semtech, el chip detrás de LoRa. No son rivales directos, resuelven necesidades distintas:
| Característica | CC1101 | SX1276 |
|---|---|---|
| Modulación | FSK, GFSK, OOK | LoRa + FSK |
| Alcance máximo | ~1 km | 5 a 15 km |
| Sensibilidad | ~ -110 dBm | hasta -148 dBm |
| Tasa de datos | hasta 600 kbps | muy baja (modo LoRa) |
| Latencia | baja | alta |
| Timing determinístico | sí | no (spreading de LoRa) |
Elegí el CC1101 cuando necesitás baja latencia, mayor throughput, un protocolo RF propio, timing determinístico o aplicaciones industriales. Elegí el SX1276 (LoRa) cuando buscás alcance extremo, sensores a batería a larga distancia, telemetría rural o cuando una tasa de datos muy baja es aceptable.
Variantes y mejoras
Una vez que tengas el enlace básico funcionando, hay varios caminos para llevar el proyecto más lejos. Estas ideas no están en la guía original y te sirven para experimentar:
- Red de varios nodos con direccionamiento: aprovechá el filtrado por dirección del CC1101 para armar una red de sensores donde cada nodo tenga su propio identificador y el receptor descarte por hardware los paquetes que no le corresponden. Ahorra CPU y consumo.
- Modo de bajo consumo para nodos a batería: combiná el deep sleep del ESP32 con el modo sleep del CC1101 (menos de 1 µA) y despertá el sistema solo cuando hay algo que transmitir. Con eso, un nodo alimentado por una batería 18650 puede durar meses.
- Telemetría con sello de tiempo y reintentos: agregá un módulo RTC DS3231 para marcar la hora exacta de cada lectura y usá el RSSI para decidir cuándo reintentar un envío. Así obtenés un enlace más robusto en ambientes con interferencia.
- Escáner de espectro casero: recorré los canales leyendo el RSSI de cada uno para visualizar qué tan ocupada está la banda de 868 MHz en tu zona antes de elegir el canal de trabajo.
Personalización para Chile
El protagonista de este proyecto es el módulo CC1101, que es un componente especializado de RF y no forma parte del catálogo de MechatronicStore. Igual lo dejamos en la lista de materiales para que tengas el panorama completo de lo que necesitás conseguir.
Donde sí podés comprar local es el cerebro del proyecto, el microcontrolador que habla SPI con el CC1101:
- ESP32 DevKit WROOM 32 (SKU 3688) por $7.990. Es exactamente la placa que apunta el cableado de esta guía: trabaja nativo a 3.3V, trae el bus VSPI listo para usar y se programa sin problema con ESP IDF.
Una nota sobre los niveles de voltaje: como el CC1101 no tolera 5V, el ESP32 es ideal porque su lógica ya es de 3.3V. No necesitás conversores de nivel entre ambos, lo que simplifica el armado. Para las conexiones vas a querer también un set de cables jumper hembra a hembra y un cable USB para programar y alimentar la placa.
Recursos
- Tutorial original (en inglés): CC1101 868MHz SPI RF Module Complete Guide, por Achim Pieters en StudioPieters.
- Documentación adicional: datasheet del CC1101 de Texas Instruments y la guía del periférico SPI Master en la documentación oficial de ESP IDF.
Versión chilena inspirada en el trabajo de StudioPieters, con el microcontrolador en stock local en MechatronicStore.




