868MHz RF Transceiver CC1201 Module

Coral radio
2022-10-09

868MHz RF Transceiver CC1201 Module

CC1201 Introduction

TI CC1201 is designed for short range, very low-power and wireless transceiver.
N511ES based on TI CC1201. The CC1201 RF transceiver module is mainly used for the SRD ( Short Range Device) and ISM ( Scientific, car, Industrial, and Medical) . The frequency bands support 315, 433, 470, 868, and 915 MHz. And can changed CC1201 register easily be used for other frequencies in the 287-351 MHz, 359-439 MHz, 431-527 MHz, 718-878 MHz, and 861-1064 MHz bands.

N511ES-CC1201 module based CC1201, the module designed for 315, 433, 470, 778, 868, and 915 MHz. CC1201 module support all of the CC1201 function.

Model:

N511ES-CC1201-433M(431-527 MHz)

N511ES-CC1201-868M(860-960 MHz)

868MHz Narrowband RF Transceiver CC1201 Module

order now

Module Features

Operating voltage :2-3.6V

  • RF rate: 1.2 - 500 kbps, support 2-FSK, 4-FSK, 2-GFSK, 4-GFSK, and ASK/OOK modulation

  • Relevant parameters such as baud rate, RX filter BW, radio frequency, and transmission power can be modified through software

  • Sensitivity (<1.2 kbps -120 dBm, 1% packet error rate)

  • CRC error detection and built-in hardware address multipoint communication control

  • Lower RX current consumption (RX 17mA Peak Current in Low-Power Mode; 1.2 kbps, 868 MHz)

  • Power Down (0.12uA)

  • Programmable control of RF output power, maximum output power of +16 dBm

  • SMD package for SMT

  • Separate 128-byte RX and TX data FIFO

  • Transmission distance: 10 - 800 meters (Depending on the specific situation of the environment and RF baud rate, etc.)

N511ES CC1201 Module Pinout Description


Pin   Number

function

Describe

1

RF


2GND
3GND
4GDIO3Connected to MCU IO   port
5RSTConnected to MCU IO   port
6NCNC
7GPIO2Connected to MCU IO   port
8MOSISPI
9SCKSPI
10MISOSPI
11GPIO0Connected to MCU IO   port
12NSSSPI
13VCC1.8 - 3.6V
14GNDGND


N511ES CC1201 Module EDA package



868MHz RF Transceiver CC1201 Module EDA package



Usage

1.Hardware connection
868MHz RF Transceiver CC1201 Module Hardware connection‍   

1.Test hardware

868MHz Narrowband RF Transceiver CC1201 Module hardware Test   

CC1201 modulecan be configured using CCdebugger and SmartRF™ Studio software. SmartRF™ Studio is highly recommended for obtaining optimum register settings, and for evaluating performance and functionality.

After chip reset by CCdebugger, all registers have default values and these might differ from the optimum register setting. It is therefore necessary to configure/reconfigure the radio through the SPI interface after the chip has been reset. SmartRF Studio provides a code export function making it easy to implement this in firmware.

3. TX DEMO for Arduino

/*--

'                     TX DEMO

'                     -------

'

'

'   - need PinChangeInt library

'   - *.eep file must flashed to Arduino first -> use eeprom Tool

'   - put cc1100_arduino.h in your sketch folder. dont't install it as library

'    for this example.

'

'-----------------------------------------------------------------------------*/

#include"cc1100_arduino.h"

#include<PinChangeInt.h>



//---------------------------=[Global variables]=----------------------------



//--------------------------[Global Task variables]--------------------------

uint32_t prev_millis_1s_timer = 0;



constuint16_t INTERVAL_1S_TIMER = 1000;        // interval at which to blink (milliseconds)



//--------------------------[Global CC1100 variables]------------------------

uint8_t Tx_fifo[FIFOBUFFER], Rx_fifo[FIFOBUFFER];

uint8_t My_addr, Tx_addr, Rx_addr, Pktlen, pktlen, Lqi, Rssi;

uint8_t rx_addr,sender,lqi;

int8_t rssi_dbm;



volatileuint8_t cc1101_packet_available;



//--------------------------[class constructors]-----------------------------

//init CC1100 constructor

CC1100 cc1100;



//---------------------------------[SETUP]-----------------------------------

voidsetup()

{

// init serial Port for debugging

   Serial.begin(38400);Serial.println();



// init CC1101 RF-module and get My_address from EEPROM

   cc1100.begin(My_addr);                   //inits RF module with main default settings



   cc1100.silde();                          //set to ILDE first

   cc1100.set_mode(0x04);                   //set modulation array mode

   cc1100.set_ISM(0x03);                    //set frequency

   cc1100.set_channel(0x01);                //set channel

   cc1100.set_output_power_level(0);        //set PA level in dbm

   cc1100.set_myaddr(0x01);                 //set my own address



   cc1100.spi_write_register(IOCFG2, 0x06); //set module in sync mode detection mode



   cc1100.show_main_settings();             //shows setting debug messages to UART

   cc1100.show_register_settings();         //shows current CC1101 register values

   cc1100.receive();                        //set to RECEIVE mode



// init interrrupt function for available packet

attachPinChangeInterrupt(GDO2, rf_available_int, HIGH);



   Serial.println(F("CC1101 TX Demo"));   //welcome message

}

//---------------------------------[LOOP]-----------------------------------

voidloop()

{



// one second update timer

if (millis() - prev_millis_1s_timer >= INTERVAL_1S_TIMER)

   {

    Rx_addr = 0x03;                                              //receiver address



    uint32_t time_stamp = millis();                              //generate time stamp



    Tx_fifo[3] = (uint8_t)(time_stamp >> 24);                    //split 32-Bit timestamp to 4 byte array

    Tx_fifo[4] = (uint8_t)(time_stamp >> 16);

    Tx_fifo[5] = (uint8_t)(time_stamp >> 8);

    Tx_fifo[6] = (uint8_t)(time_stamp);



    Pktlen = 0x07;                                               //set packet len to 0x13



    detachPinChangeInterrupt(GDO2);                              //disable pin change interrupt

    cc1100.sent_packet(My_addr, Rx_addr, Tx_fifo, Pktlen, 1);    //sents package over air. ACK is received via GPIO polling

    attachPinChangeInterrupt(GDO2, rf_available_int, HIGH);      //enable pin change interrupt



    Serial.print(F("tx_time: "));Serial.print(millis()-time_stamp);Serial.println(F("ms"));

    prev_millis_1s_timer = millis();

   }



}

//--------------------------[end loop]----------------------------



//-----interrrupt function not needed for this demo

//---------------------[ check incomming RF packet ]-----------------------

voidrf_available_int(void)

{

    detachPinChangeInterrupt(GDO2);



    if(cc1100.packet_available() == TRUE){

        cc1100.get_payload(Rx_fifo, pktlen, rx_addr, sender, rssi_dbm, lqi); //stores the payload data to Rx_fifo

        cc1101_packet_available = TRUE;                                      //set flag that an package is in RX buffer

      }



    attachPinChangeInterrupt(GDO2, rf_available_int, HIGH);

}

4. RX DEMO for Arduino

/*--

'                     RX_DEMO

'                     -------

'   - needs PinChangeInt library

'   - *.eep file must flashed to Arduino first -> use eeprom Tool

'   - put cc1100_arduino.h in your sketch folder. dont't install it as library

'    for this example.

'   

'   

'-----------------------------------------------------------------------------*/

#include"cc1100_arduino.h"

#include<PinChangeInt.h>



//---------------------------=[Global variables]=----------------------------

uint32_t rf_timecode = 0;

uint32_t rf_timecode_backup = 0;

//--------------------------[Global Task variables]--------------------------



//--------------------------[Global CC1100 variables]------------------------

uint8_t Tx_fifo[FIFOBUFFER], Rx_fifo[FIFOBUFFER];

uint8_t My_addr, Tx_addr, Rx_addr, Pktlen, pktlen, Lqi, Rssi;

uint8_t rx_addr,sender,lqi;

int8_t rssi_dbm;

volatileuint8_t cc1101_packet_available;



//--------------------------[class constructors]-----------------------------

//init CC1100 constructor

CC1100 cc1100;



//---------------------------------[SETUP]-----------------------------------

voidsetup()

{

// init serial Port for debugging

   Serial.begin(38400);Serial.println();



// init CC1101 RF-module and get My_address from EEPROM

   cc1100.begin(My_addr);                   //inits RF module with main default settings



   cc1100.silde();                          //set to ILDE first

   cc1100.set_mode(0x04);                   //set modulation array mode

   cc1100.set_ISM(0x01);                    //set frequency

   cc1100.set_channel(0x01);                //set channel

   cc1100.set_output_power_level(0);        //set PA level in dbm

   cc1100.set_myaddr(0x03);                 //set my own address



   cc1100.spi_write_register(IOCFG2, 0x06); //set module in sync mode detection mode



   cc1100.show_main_settings();             //shows setting debug messages to UART   

   cc1100.show_register_settings();         //shows current CC1101 register values

   cc1100.receive();                        //set to RECEIVE mode



// init interrrupt function for available packet

   attachPinChangeInterrupt(GDO2, rf_available_int, HIGH);



   Serial.println(F("CC1101 RX Demo"));   //welcome message

}



//---------------------------------[LOOP]-----------------------------------

voidloop()

{

    //if valid package is received

    if(cc1101_packet_available == TRUE){

        rf_timecode = ((uint32_t)Rx_fifo[3] << 24) +

                  ((uint32_t)Rx_fifo[4] << 16) +

                  ((uint16_t)Rx_fifo[5] <<   8) +

                             Rx_fifo[6];

        Serial.print(F("TX_Timecode: "));Serial.print(rf_timecode);Serial.println(F("ms"));



        rf_timecode_backup = millis();

        cc1101_packet_available = FALSE;

      }



}

//--------------------------[end loop]----------------------------



//---------------------[ check incomming RF packet ]-----------------------

voidrf_available_int(void)

{

    detachPinChangeInterrupt(GDO2);

    sei();

    uint32_t time_stamp = millis();                                   //generate time stamp



    if(cc1100.packet_available() == TRUE){

        cc1100.get_payload(Rx_fifo, pktlen, rx_addr, sender, rssi_dbm, lqi); //stores the payload data to Rx_fifo

        cc1101_packet_available = TRUE;                                      //set flag that an package is in RX buffer

      }

      Serial.print(F("rx_time: "));Serial.print(millis()-time_stamp);Serial.println(F("ms"));



    attachPinChangeInterrupt(GDO2, rf_available_int, HIGH);

}




share