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)
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.)
Pin Number | function | Describe |
1 | RF | |
2 | GND | |
3 | GND | |
4 | GDIO3 | Connected to MCU IO port |
5 | RST | Connected to MCU IO port |
6 | NC | NC |
7 | GPIO2 | Connected to MCU IO port |
8 | MOSI | SPI |
9 | SCK | SPI |
10 | MISO | SPI |
11 | GPIO0 | Connected to MCU IO port |
12 | NSS | SPI |
13 | VCC | 1.8 - 3.6V |
14 | GND | GND |
1.Hardware connection
1.Test hardware
CC1201 module can 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); | |
} |