This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cc1101 not receiving packets from cc110L

Other Parts Discussed in Thread: CC110L, CC1101, TEST2

Hello,

I am trying to create a wireless link between the evalbot and a msp430 launchpad populated with the g2553 chip.

The evalbot has the c1101 868MHz - 915MHz EM kit plugged in, the launchpad is using the anaren air booster pack which uses he cc110L rf chip.

Some background;

Before attempting to setup the link bewteen the evalbot and msp430, I tested two msp430's with air booster packs attached and successfully sent a packet of data from one to the other to turn on/off the launchpad leds. I did this by using register settings from smart studio and reading the datasheet to adjust the packet length register to send only 1 byte.

I am only sending 1 byte of data with CRC and RSSI appended to it. I just want to get things up an running before I move onto larger packet sizes. I am using GDO0 as my interrupt source for the evalbot. It will go low when the end of the 3 byte packet is received (1 byte CRC, 1 byte data, 1 byte RSSI).

The code on the MSP430 simply increments a counter when on board switch is pressed. This value is then sent over the air and if the evalbot receives a "4" it turns on the LEDS. I used this with the two msp430s and it worked perfectly.

I thought it would be an easy case of just pasting the code into my evalbot project to get up and running. This was definitely not the case ;)

I am using IAR embedded workbench 6.60 to setup the evalbot. I used ccs to setup the msp430->msp430 link.

The problem;

I moved my code over to my evalbot project on IAR and it seems that I cannot receive a packet from the msp430 module. Literally nothing happens on the GDO0 line, I have checked this line by setting it up to use a clock source (IOCFG0=0x30) . I verified the clock signal using an oscilloscope and it is working.

Below are the files I am using

The first is my main file - In it,I first include my necessary files from the stellaris ware library and my own header files (RF_SPI_FUNCTIONS.h,Air_Booster_Pack.h) 

the second is the functions I use to read/write to the cc1101 chip -  these are the functions pointed to by my header file RF_SPI_FUNCTIONS.h. 

the third is my startup ewarm file - which just shows I have set the interrupt up correctly (or so I believe)

Questions;

1. What am I missing here? Honestly I know it's probably something minute but my brain is fried. Or maybe ti's something huge and I'm blind?

2. I use the char Buf to store the value from the SSI1 RX FIFO (or so I believe) to show the values returned by reading status registers of the cc1101. I did this because I had a hard time understanding what was being returned to the evalbot spi interface. This proved to be more confusing because the value in the debug register window was different that that in the local window for Buf.....did I miss something in my CC1101_ST_REG()? Maybe I implemented it incorrectly? When I used the msp430 it was no problem reading the spi FIFO because there was two separate values in the debug window. With the evalbot however I can't figure out whether the value shown in SSIDR is the RX or TX FIFO value.

3. I have read about WOR and from what I understand it only applies when the radio is put in a power save mode.

My concern is that I am missing some other timeout mechanism? or that I have to constantly place the unit in RX mode if I don't set a bit in the main state machine register.

I have tried to give all the information I can in this initial post. If I have left something out please let me know. This is my first post and I hold my hands up if I missed something.

//////////////////////////////////////////////////MAIN FILE BEGIN////////////////////////////////////////////////////////////////////////////////////////////

#include "inc/hw_memmap.h"
#include "inc/hw_ssi.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"
#include "driverlib/interrupt.h"
#include "driverlib/ssi.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "utils/uartstdio.h"
#include "RF_SPI_FUNCTIONS.h"
#include "Air_Booster_Pack.h"

int main(void)
{
char Buf =0; // used for reading SSI1 RX FIFO

//Setup system clock
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
//Setup Ports and SSI1
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
//Configure pins on port H for SSI1 function
GPIOPinConfigure(GPIO_PH4_SSI1CLK); //CLK
GPIOPinConfigure(GPIO_PH6_SSI1RX); //MISO
GPIOPinConfigure(GPIO_PH7_SSI1TX); //MOSI
GPIOPinTypeSSI(GPIO_PORTH_BASE, GPIO_PIN_6 | GPIO_PIN_4 |GPIO_PIN_7);

//Setup SSI1 for 8 bits SPI master running at 200KHz
SSIConfigSetExpClk(SSI1_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,
SSI_MODE_MASTER, 200000, 8);

//Enable SSI1
SSIEnable(SSI1_BASE);

//Setup input for interrupt from cc1101 GDO0 pin
GPIOPinTypeGPIOInput(GPIO_PORTH_BASE,GPIO_PIN_2);
// GPIOPadConfigSet(GPIO_PORTH_BASE,GPIO_PIN_2,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);

//Setup Port F pins 4&% as outputs to drive LEDS
GPIOPinTypeGPIOOutput(GPIO_PORTH_BASE, GPIO_PIN_5);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4 | GPIO_PIN_5);


//Power on Reset for cc1101
CC1101_POR_RES();

//Configure registers for cc1101
CC1101_SETUP();
CC1101_Write(PATABLE,0x50);
//Set cc1101 into IDLE state to flush RX and TX FIFO
CC1101_CMD_REG(SIDLE);
CC1101_CMD_REG(SFRX);
CC1101_CMD_REG(SFTX);

//Check current state
Buf = CC1101_ST_REG(MARCSTATE);

//Set cc1101 in RX mode
CC1101_CMD_REG(SRX);

//Check cc1101 is in RX mode
Buf = CC1101_ST_REG(MARCSTATE);

//Clear Interuppts for PORTH
GPIOPinIntClear(GPIO_PORTH_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

//Setup interrupt properties for pin 2 port H
GPIOIntTypeSet(GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_FALLING_EDGE);

//Enable interrupt for pin2 PortH
GPIOPinIntEnable(GPIO_PORTH_BASE, GPIO_PIN_2);

//Clear pending interrupts to processor
IntPendClear(INT_GPIOH);

//Enable interrupt for portH
IntEnable(INT_GPIOH);

//Check state of cc1101 and value of bytes in RX/TX FIFOs
Buf = CC1101_ST_REG(MARCSTATE);
Buf = CC1101_ST_REG(TXBYTES);
Buf = CC1101_ST_REG(RXBYTES);

//Set cc1101 in RX mode and read state
CC1101_CMD_REG(SRX);
Buf = CC1101_ST_REG(MARCSTATE);
Buf = CC1101_ST_REG(MARCSTATE);
Buf = CC1101_ST_REG(MARCSTATE);
Buf = CC1101_ST_REG(MARCSTATE);
Buf = CC1101_ST_REG(MARCSTATE);
Buf = CC1101_ST_REG(MARCSTATE);


while(1){
}
////////////////
}


//Port H interrupt Handler
void PortHIntHandler (void)
{
char a,i;

//Clear interrupt source
GPIOPinIntClear(GPIO_PORTH_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|
GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

//Read CRC byte, Data byte, then RSSI byte
for (i=0;i<3;i++){
//Store value from RX fifo in a
a= CC1101_Read(0x3F);
if (a==4)
{
GPIOPinWrite(GPIO_PORTF_BASE,(GPIO_PIN_4 | GPIO_PIN_5 ),0xFF);
//blink LED if =4
}
else
{
GPIOPinWrite(GPIO_PORTF_BASE,(GPIO_PIN_4 | GPIO_PIN_5 ),0x00);
//leds off
}
}
//Put cc1101 in RX state to await another packet
CC1101_CMD_REG(SRX);
}

//////////////////////////////////////////////////MAIN FILE END////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////RF SPI FUNCTIONS FILE BEGIN/////////////////////////////////////////////////////////////////

#include "RF_SPI_FUNCTIONS.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ssi.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "inc/hw_nvic.h"
#include "driverlib/interrupt.h"
#include "driverlib/ssi.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "utils/uartstdio.h"
#include "Air_Booster_Pack.h"


//Setup configuration for cc1101 registers
//Set for 868MHz,GFSK, packet length =1,no address checking,0dB power,1.2KBaud
void CC1101_SETUP(void){
CC1101_Write(IOCFG2,0x29);
CC1101_Write(IOCFG1,0x2E);
CC1101_Write(IOCFG0,0x41);
CC1101_Write(FIFOTHR,0x47);
CC1101_Write(SYNC1,0xD3);
CC1101_Write(SYNC0,0x91);
CC1101_Write(PKTLEN,0x01);
CC1101_Write(PKTCTRL1,0x04);
CC1101_Write(PKTCTRL0,0x04);
CC1101_Write(ADDR,0x00);
CC1101_Write(CHANNR,0x00);
CC1101_Write(FSCTRL1,0x06);
CC1101_Write(FSCTRL0,0x00);
CC1101_Write(FREQ2,0x21);
CC1101_Write(FREQ1,0x62);
CC1101_Write(FREQ0,0x76);
CC1101_Write(MDMCFG4,0xF5);
CC1101_Write(MDMCFG3,0x83);
CC1101_Write(MDMCFG2,0x13);
CC1101_Write(MDMCFG1,0x42);
CC1101_Write(MDMCFG0,0xF8);
CC1101_Write(DEVIATN,0x15);
CC1101_Write(MCSM2,0x07);
CC1101_Write(MCSM1,0x30);
CC1101_Write(MCSM0,0x18);
CC1101_Write(FOCCFG,0x16);
CC1101_Write(BSCFG,0x6C);
CC1101_Write(AGCCTRL2,0x03);
CC1101_Write(AGCCTRL1,0x40);
CC1101_Write(AGCCTRL0,0x91);
CC1101_Write(0x20,0xFB);
CC1101_Write(FREND1,0x56);
CC1101_Write(FREND0,0x10);
CC1101_Write(FSCAL3,0xE9);
CC1101_Write(FSCAL2,0x2A);
CC1101_Write(FSCAL1,0x00);
CC1101_Write(FSCAL0,0x1F);
CC1101_Write(0x27,0x41);
CC1101_Write(0x28,0x00);
CC1101_Write(0x29,0x59);
CC1101_Write(0x2A,0x7F);
CC1101_Write(0x2B,0x3F);
CC1101_Write(TEST2,0x81);
CC1101_Write(TEST1,0x35);
CC1101_Write(TEST0,0x09);
}

//Power on reset funciton
void CC1101_POR_RES()
{
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0x00); // CS FOR SPI INTERFACE ENABLE
SysCtlDelay(55);
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0xFF); // CS FOR SPI INTERFACE DISABLE
SysCtlDelay(215); //~40uS delay
CC1101_CMD_REG(SRES);//Reset command
}

//Command register access fucntion
void CC1101_CMD_REG(char address)
{
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0x00); // CS FOR SPI INTERFACE ENABLE
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataPut(SSI1_BASE, address| 0x80);// Send address with burst bit set
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0xFF); // CS FOR SPI INTERFACE DISABLE
}

//Read status register function
char CC1101_ST_REG(char address)
{

unsigned long x = 0;

GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0x00); // CS FOR SPI INTERFACE ENABLE
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataPut(SSI1_BASE, address| 0xC0);// Send address
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataPut(SSI1_BASE, 0x00);// Send address
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataGet(SSI1_BASE,&x); // Read data
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0xFF); // CS FOR SPI INTERFACE DISABLE

return (char) x;
}
void CC1101_Write(char address,char data) // writes to a register at an address specified
{
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0x00); // CS FOR SPI INTERFACE ENABLE
while(SSIBusy(SSI1_BASE)==1);// Wait for TXBUF ready
SSIDataPut(SSI1_BASE, address );
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataPut(SSI1_BASE, data ); // Send data
while(SSIBusy(SSI1_BASE)==1); // Wait for TX complete
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0xFF); // CS FOR SPI INTERFACE DISABLE
}

char CC1101_Read(char address) // reads from a register at an address specified
{

unsigned long x = 0;

GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0x00); // CS FOR SPI INTERFACE ENABLE
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataPut(SSI1_BASE, address| 0x80);// Send address
while(SSIBusy(SSI1_BASE)==1); // Wait for TXBUF ready
SSIDataPut(SSI1_BASE, 0x00 ); // Dummy write so we can read data
while(SSIBusy(SSI1_BASE)==1); // Wait for TX complete
SSIDataGet(SSI1_BASE,&x); // Read data
GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_5,0xFF); // CS FOR SPI INTERFACE DISABLE

return (char) x;
}

//////////////////////////////////////////////////RF SPI FUNCTIONS FILE END/////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////START UP EWARM FILE BEGIN/////////////////////////////////////////////////////////////////

//*****************************************************************************
//
// startup_ewarm.c - Startup code for use with IAR's Embedded Workbench,
// version 5.
//
// Copyright (c) 2009-2012 Texas Instruments Incorporated. All rights reserved.
// Software License Agreement
//
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
//
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 9107 of the EK-LM3S9B92 Firmware Package.
//
//*****************************************************************************

//*****************************************************************************
//
// Enable the IAR extensions for this source file.
//
//*****************************************************************************
#pragma language=extended

//*****************************************************************************
//
// Forward declaration of the default fault handlers.
//
//*****************************************************************************
void ResetISR(void);
static void NmiSR(void);
static void FaultISR(void);
static void IntDefaultHandler(void);

//*****************************************************************************
//
// The entry point for the application startup code.
//
//*****************************************************************************
extern void __iar_program_start(void);
extern void PortHIntHandler(void);

//*****************************************************************************
//
// Reserve space for the system stack.
//
//*****************************************************************************
static unsigned long pulStack[64] @ ".noinit";

//*****************************************************************************
//
// A union that describes the entries of the vector table. The union is needed
// since the first entry is the stack pointer and the remainder are function
// pointers.
//
//*****************************************************************************
typedef union
{
void (*pfnHandler)(void);
unsigned long ulPtr;
}
uVectorEntry;

//*****************************************************************************
//
// The vector table. Note that the proper constructs must be placed on this to
// ensure that it ends up at physical address 0x0000.0000.
//
//*****************************************************************************
__root const uVectorEntry __vector_table[] @ ".intvec" =
{
{ .ulPtr = (unsigned long)pulStack + sizeof(pulStack) },
// The initial stack pointer
ResetISR, // The reset handler
NmiSR, // The NMI handler
FaultISR, // The hard fault handler
IntDefaultHandler, // The MPU fault handler
IntDefaultHandler, // The bus fault handler
IntDefaultHandler, // The usage fault handler
0, // Reserved
0, // Reserved
0, // Reserved
0, // Reserved
IntDefaultHandler, // SVCall handler
IntDefaultHandler, // Debug monitor handler
0, // Reserved
IntDefaultHandler, // The PendSV handler
IntDefaultHandler, // The SysTick handler
IntDefaultHandler, // GPIO Port A
IntDefaultHandler, // GPIO Port B
IntDefaultHandler, // GPIO Port C
IntDefaultHandler, // GPIO Port D
IntDefaultHandler, // GPIO Port E
IntDefaultHandler, // UART0 Rx and Tx
IntDefaultHandler, // UART1 Rx and Tx
IntDefaultHandler, // SSI0 Rx and Tx
IntDefaultHandler, // I2C0 Master and Slave
IntDefaultHandler, // PWM Fault
IntDefaultHandler, // PWM Generator 0
IntDefaultHandler, // PWM Generator 1
IntDefaultHandler, // PWM Generator 2
IntDefaultHandler, // Quadrature Encoder 0
IntDefaultHandler, // ADC Sequence 0
IntDefaultHandler, // ADC Sequence 1
IntDefaultHandler, // ADC Sequence 2
IntDefaultHandler, // ADC Sequence 3
IntDefaultHandler, // Watchdog timer
IntDefaultHandler, // Timer 0 subtimer A
IntDefaultHandler, // Timer 0 subtimer B
IntDefaultHandler, // Timer 1 subtimer A
IntDefaultHandler, // Timer 1 subtimer B
IntDefaultHandler, // Timer 2 subtimer A
IntDefaultHandler, // Timer 2 subtimer B
IntDefaultHandler, // Analog Comparator 0
IntDefaultHandler, // Analog Comparator 1
IntDefaultHandler, // Analog Comparator 2
IntDefaultHandler, // System Control (PLL, OSC, BO)
IntDefaultHandler, // FLASH Control
IntDefaultHandler, // GPIO Port F
IntDefaultHandler, // GPIO Port G
PortHIntHandler, // GPIO Port H
IntDefaultHandler, // UART2 Rx and Tx
IntDefaultHandler, // SSI1 Rx and Tx
IntDefaultHandler, // Timer 3 subtimer A
IntDefaultHandler, // Timer 3 subtimer B
IntDefaultHandler, // I2C1 Master and Slave
IntDefaultHandler, // Quadrature Encoder 1
IntDefaultHandler, // CAN0
IntDefaultHandler, // CAN1
IntDefaultHandler, // CAN2
IntDefaultHandler, // Ethernet
IntDefaultHandler, // Hibernate
IntDefaultHandler, // USB0
IntDefaultHandler, // PWM Generator 3
IntDefaultHandler, // uDMA Software Transfer
IntDefaultHandler, // uDMA Error
IntDefaultHandler, // ADC1 Sequence 0
IntDefaultHandler, // ADC1 Sequence 1
IntDefaultHandler, // ADC1 Sequence 2
IntDefaultHandler, // ADC1 Sequence 3
IntDefaultHandler, // I2S0
IntDefaultHandler, // External Bus Interface 0
IntDefaultHandler // GPIO Port J
};

//*****************************************************************************
//
// This is the code that gets called when the processor first starts execution
// following a reset event. Only the absolutely necessary set is performed,
// after which the application supplied entry() routine is called. Any fancy
// actions (such as making decisions based on the reset cause register, and
// resetting the bits in that register) are left solely in the hands of the
// application.
//
//*****************************************************************************
void
ResetISR(void)
{
//
// Call the application's entry point.
//
__iar_program_start();
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a NMI. This
// simply enters an infinite loop, preserving the system state for examination
// by a debugger.
//
//*****************************************************************************
static void
NmiSR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a fault
// interrupt. This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
FaultISR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives an unexpected
// interrupt. This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
IntDefaultHandler(void)
{
//
// Go into an infinite loop.
//
while(1)
{
}
}

//////////////////////////////////////////////////START UP EWARM FILE END/////////////////////////////////////////////////////////////////

  • Hi

    Your register settings for the CC1101 seems fine. I do not have much experience with the evalbot, how is the cc1101 connected to this? Are you using a CC1101 Evaluation module? 

  • Hi Martin,

    The cc1101 is an evaluation module. It is connected to the evalbot using the two EM sockets on the evaluation module.

    The evalbot uses the LM3S9B92 Microcontroller.

  • Hi

    Do you have any evaluation board (TrxEB, SmartRF04EB or CC Debugger) that you can use to connect the radio to SmartRF Studio to verify that your CC1101EM works properly?

    Have you checked that the interrupt is properly set up on the right pin, and that there is nothing other that drives that line? I se that you set up your IO configurations after you have set the radio in RX. Any reason why you do that, and not set up the IO in advance?

    I would start debugging by setting the CC1110 in continuous RX and reading the RSSI value while you are transmitting to check that the received signal is strong enough.

     

     

  • HI Martin,

    I only have the evalbot and from looking online Smart RF does not have the drivers necessary to debug the CC1101 while it is connected to the evalbot.

    I code the interrupt on pin 2 of Port H after the radio is setup because the GDO0 pin was tripping the interrupt as it would send out a clock signal first. Once the radio is setup the GDO0 line is high as expected.


    I have written 0x50 (0dB) to the PA table. The units are spread across my desk by about 2 foot. I thought that maybe they were too close and lowered the PA value to minimum, no effect, then to maximum, no effect there either.

    I will try the RSSI value and output it to UART to see if is changing.


    Do you think there could be an issue with the microcontroller and the way I am configuring it?

    Even for example, configuring the interrupt I had tied the  line high through an internal pull up resistor to see if this made an effect(considering I set GDO0 as active low). but setting this made no difference.

    Perhaps after setting up my radio and interrupt I could code the GDO0 pin to output a clock signal, then pull the line low, then pull the line high and see if this changes the trace on my oscilloscope before testing the RSSI register.

    Is there incompatability with the cc1101 and cc110L ? I don't think there should be but I just want to leave no stone unturned.


  • Hi Nicholas

    The CC1101 and the CC110L are compatible. Actually the CC110L is based on the CC1101, but with some functionality removed in order to make it at a lower cost. So the CC1101 and CC110L will have no problem talking to each other.

    If you send with full output power the radio's will get saturated if you have them to close together, however at 0 dBm(0x50) I would expect you to have a link at two feet separation.

    The GDO0 reset value is 0x3F which corresponds to a downscaled XOSC clock signal. The recommended approach when you set up your GDO's would be as follows:

    1. Program all radio registers
    2. Set up IO configuration on the corresponding pins on the MCU
    3. Enable interrupt on the desired pins
    4. Set the radio in active mode (TX or RX)

    If you can get a hold of a CC Debugger it is fairly easy to connect the EM to SmartRF Studio. It is a very good way to check that you HW works ant that the register settings are OK. In that way you can more easily isolate the problem, at least to see if it is related to the radio part (CC1101EM) or the MCU part (evalbot).

    I do not have to much knowledge of the  stellaris mcu on the evalbot, but if you can read and write to the radio registers as expected you can et lest eliminate the SPI as part of the problem.

    For the interrupts I would do as you suggested, force the mcu to interrupt by toggling the output signal from the GDO. I would also check that there is no other interference in the GDO lines when you operate the evalbot.

  • Hi Martin,

    Just filling you in.

    In the end I couldn't get the system to work. 

    I checked the interrupt and it works fine when GDO0 is toggled High to low.

    I configured my I/O after the cc1101 was setup -  this made no difference

    I then decided to transmit from the evalbot to the msp430 launchpad with air booster pack - this did not work

    In the end I have decided to use a different board with prototyping capability and link it to another air booster pack. This will now be my main receiver.

    I honestly can't nail down why this didn't work because the register settings were fine and I observed correct signals on the spi interface so the evalbot was running fine. 

    Anyway thank you for your effort Martin, I appreciate it :)

    Nicholas

  • Hi Nicholas,

    I had the same problem what you. I use a CC1101 and CC430 chip family in other devices, and we needed comunicate a CC110L with a CC1101, but nothing worked.

    The problem is what Anaren designed the component with a crystal oscillator with 27MHz, and the other hardware what we have used 26Mhz. After see this, I just set the register and worked very well.

    See the diagram block.

    See more information in the documentation: http://www.anaren.com/air/cc110l-air-module-boosterpack-embedded-antenna-module-anaren#overlay-context=air/air-boosterpack

    I hope it woks for you....

  • Have you checked the signal with a spectrum analyzer and looked at the freq offset? Or tried to increase the RX filter bandwidth as a check? Does it work when you have your CC1101 communicate with a CC1101 or a CC110L to a Cc110L?

  • CHS,

    Yes, I did all this things before and after the CC110L comunication with the other radios.

    Before, with the register set to 26MHz, nothing happened in the spectrum or some comunication.

    When I set the registers for a crystal of 27MHz all worked very well. So after set, I could see the frequency change in the spectrum.

    Uilter Witte

  • So now I am a little confused, what hardware are you using? And what XTAL freq are you using? 

    And is it correct that you can get CC1101 to communicate with CC1101 and CC110L to communicate with CC110L? And you have checked with a spectrum analyzer that the freq is correct and the spectrum looks like expected? But you still do not get CC1101 to communicate with CC110L regardless of RX filter bandwidth? 

  • CHS,

    My problem is comunication between CC110L (Booster pack anaren) with CC1101. The problem what I found was the XTAL, what in the Anaren is 27MHz and the others CC1101 have a crystal with 26MHz.
    When I set the right configuration to the XTAL, all worked very well.
    So, then I could set the frequency what I wanted between the CC1101 and CC110L.

    Uilter Witte.

  • excellent. I am glad you solved it!