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.

Vista en detalle del módulo RF CC1101 868 MHz con el chip de Texas Instruments

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:

Diagrama de pinout del módulo CC1101 868 MHz con sus 11 pines etiquetados

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:

C
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:

C
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.

C
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.

C
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:

Código
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:

Antena helicoidal de cuarto de onda para 868 MHz

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 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.