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.

low output power of cc1101

Other Parts Discussed in Thread: CC1101

Hi

i am using CC1101 as transciever.

output power level is very low though it is transmitting data. i checked it on hyperterminal.

So Receiver is not receiving any data.

 can anyone pls tell me the reason for it???

  • i also forgot to mention that circuit is drawing very less current.

  • You'll need to provide some more information such as what steps you are taking to get the radio to transmit, etc. before I can make any guesses as to what the problem is.  Also, what platform are you using, i.e. what processor board and how is it connected to the CC1101.

    Jim Noxon

  • i am attaching the circuit diagram.

    Also can u tell me  are  there any settings that needs to be done if i am using a new ic of cc1101(first time)???

    i am able to transmit data from controller to cc1101 but not getting any  RF output from it.

    Also if i give a 433Mhz signal from outside from rf signal generator, there is no output on SO line which goes to MISO further,

     

    Plz help me out.

    is the ic not working or are there any settings that  i am not aware of while using cc1101 for the first time??

  • There are really only two reasons for the CC1101 to be pulling low current.  1) the ground pad under the chip is not properly connected, or 2) the chip has not received the appropriate commands to place it into either receive or transmit.

    Many people are caught off guard by the ground connection under the part and this can be especially difficult to manage for prototype builds where assembly is done on a lab bench rather than with a reflow oven as on a manufacturing line.  Not that it is impossible to solder on a lab bench, just that it can be difficult and if not practiced, may take several attempts to get it right.

    The second issue is generally for people who are working with these radios for the first time.  You can use the SmartRF Studio software (http://focus.ti.com/docs/toolsw/folders/print/smartrftm-studio.html) to help you create the appropriate register settings for the part to work in your application.  Note that the part does not power up ready to transmit or receive, you must initialize it with the proper set of commands to make this happen not only the first time you power it on but every time you power it on.

    Jim Noxon

  • hello sir

    it started working yesterday and was properly receiving data packets till last night.

    the die pad was not grounded as you said.

    it drew current and buzzer sounded every time it received a data packets as per my code.

    but it stopped working today morning :-(

    now on receiving a data packet it sounds a buzzer just once and current drops to zero.

    it sounds buzzer everytime we reset the ckt and then it doesnt.

  • It is possible your circuit originally was marginally working due to some debris or extra solder flux providing a workable ground connection.  Perhaps moving the board or doing some other rework has dislodged whatever debris was letting it work and now you need to reflow the part.

    Beyond this suggestion, I really cannot provide you much.  Intermittent systems, especially if there are no code changes between working and not working, are always frustrating to debug.  Persistence and creativity are about the only tools you have.

    Good luck,

    Jim Noxon

  • Sir it is finally working.

    yes it was actually very frustrating.

    Another doubt,Can cc1101 transmit and receive at the same time??

    Actually i want that after transmitting a data packet,it should get a confirmation signal from receiver.

     i  incorporated the receiver function in transmitter code and called it after the data transmitting function.but it's not working.

    current drawn by transmitter has reduced while it is drawing enough amount of current when it is only used as transmitter.

    i am sending u the code for transmitter.

    please go through it.

    #include <io.h>
    #include <sleep.h>
    #include <delay.h>
    #include <mega8.h>
    
    
     char data[20];  
     int k;
    
    
    
    
    void USART_Init(void)                    
    {
    
        UBRRL = 25;                // sets 1Mhz, 2400bps, .2% error
        UCSRB = (1<<RXEN)|(1<<TXEN);        // Enable receiver and transmitter
        UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);// Set frame format: 8data, 2stop bit
    }
    
    
    void USART_Transmit( char data )
    {
                        
        while ( !( UCSRA & (1<<UDRE)) )        // Wait for empty transmit buffer
        ;
        UDR = data;                // Put data into buffer, sends the data
    }
    
    
    unsigned char USART_Receive( void )
    {
    
        while ( !(UCSRA & (1<<RXC)) )        // Wait for data to be received
        ;
        
        return UDR;                // Get and return received data from buffer
    }
    
    
    void Check_If_Done(char *str)
    {
       
        while(*str) 
           
            USART_Transmit(*str++);
        
        
    }
    
    
    void SPI_MasterInit(void)            //Initialize Atmega8 as master
    {
                             
        DDRB = (1<<DDB5)|(1<<DDB3)|(1<<DDB2);    // Set MOSI,SCK and SS\ output, all others input
                            
        SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);    // Enable SPI, Master, set clock rate fck/16
    }
    
    
    void SPI_MasterTransmit(char cData)        //Transmit data on the SPI interface    
    {
        
        SPDR = cData;                // Start transmission 
        
        while(!(SPSR & (1<<SPIF)))        // Wait for transmission complete 
        ;
    }
    
    void CSn(int i)                    //Toggle CSn
    {
        if(i==1)
        PORTB|=0x04;
        else
        PORTB&=0xFB;
    }
    
    
    void Write_RegConfig(char addr,char value)    //send register value of a particular register
    {
        SPI_MasterTransmit(addr);
        SPI_MasterTransmit(value);    
    }
    
    
    
    void SPI_MasterReceive(void)
            {
                  char ReceivedValue[2];
               // SPI_MasterTransmit(0x3D);
    
            
                 for(k=0;k<2;k++)
                {
    
                    SPI_MasterTransmit(0x3D);
    
                    ReceivedValue[k] = SPDR;
    
                }
                         
                if((ReceivedValue[0]=='h') & (ReceivedValue[1]=='i'))
                {
                  Check_If_Done(ReceivedValue);
                    PORTC=0x01;
                        }
    
    
               
                   } 
                
                
                
    
      
    void Full_RegConfig(void)            //for full register configuration using BURST access
    {
        CSn(0);  
        while(PORTB.4==1){}
    
        SPI_MasterTransmit(0x3E);        //address for patable access
        SPI_MasterTransmit(0xC0);        //patable for PA power control settings
    
        SPI_MasterTransmit(0x40);        //burst transfer 1st address
    
        SPI_MasterTransmit(0x29);        //data written at register 0x00
        SPI_MasterTransmit(0x2E);        //data written at register 0x01
        SPI_MasterTransmit(0x06);        //data written at register 0x02
        SPI_MasterTransmit(0x47);        //data written at register 0x03
        SPI_MasterTransmit(0xD3);        //data written at register 0x04
        SPI_MasterTransmit(0x91);        //data written at register 0x05
        SPI_MasterTransmit(0x3D);        //data written at register 0x06
        SPI_MasterTransmit(0x00);        //data written at register 0x07 EARLIER 04
        SPI_MasterTransmit(0x01);        //data written at register 0x08 EARLIER 05
        SPI_MasterTransmit(0x00);        //data written at register 0x09
        SPI_MasterTransmit(0x00);        //data written at register 0x0A
        SPI_MasterTransmit(0x06);        //data written at register 0x0B
        SPI_MasterTransmit(0x00);        //data written at register 0x0C
        SPI_MasterTransmit(0x10);        //data written at register 0x0D
        SPI_MasterTransmit(0x09);        //data written at register 0x0E EARLIER A7 866
        SPI_MasterTransmit(0x7B);        //data written at register 0x0F EARLIER 62 866
        SPI_MasterTransmit(0xF5);        //data written at register 0x10    CA
        SPI_MasterTransmit(0x75);        //data written at register 0x11    EARLIER 83 866
        SPI_MasterTransmit(0x03);        //data written at register 0x12    13
        SPI_MasterTransmit(0x22);        //data written at register 0x13
        SPI_MasterTransmit(0xE5);        //data written at register 0x14    EARLIER F8 866
        SPI_MasterTransmit(0x14);        //data written at register 0x15 EARLIER 15 866
        SPI_MasterTransmit(0x07);        //data written at register 0x16
        SPI_MasterTransmit(0x30);        //data written at register 0x17
        SPI_MasterTransmit(0x18);        //data written at register 0x18
        SPI_MasterTransmit(0x16);        //data written at register 0x19
        SPI_MasterTransmit(0x6C);        //data written at register 0x1A
        SPI_MasterTransmit(0x03);        //data written at register 0x1B
        SPI_MasterTransmit(0x40);        //data written at register 0x1C
        SPI_MasterTransmit(0x91);        //data written at register 0x1D
        SPI_MasterTransmit(0x87);        //data written at register 0x1E
        SPI_MasterTransmit(0x6B);        //data written at register 0x1F
        SPI_MasterTransmit(0xF8);        //data written at register 0x20
        SPI_MasterTransmit(0x56);        //data written at register 0x21
        SPI_MasterTransmit(0x10);        //data written at register 0x22
        SPI_MasterTransmit(0xE9);        //data written at register 0x23
        SPI_MasterTransmit(0x2A);        //data written at register 0x24
        SPI_MasterTransmit(0x00);        //data written at register 0x25
        SPI_MasterTransmit(0x1F);        //data written at register 0x26
        SPI_MasterTransmit(0x41);        //data written at register 0x27
        SPI_MasterTransmit(0x00);        //data written at register 0x28
        SPI_MasterTransmit(0x59);        //data written at register 0x29
        SPI_MasterTransmit(0x7F);        //data written at register 0x2A
        SPI_MasterTransmit(0x3F);        //data written at register 0x2B
        SPI_MasterTransmit(0x81);        //data written at register 0x2C
        SPI_MasterTransmit(0x35);        //data written at register 0x2D
        SPI_MasterTransmit(0x09);        //data written at register 0x2E
    
        CSn(1);
        
    }
    
    
    
    void SimpleReceive(void)
            {
                
                CSn(0);    
                while(PINB.4==1){}
    
                SPI_MasterTransmit(0x34);        //SRX STROBE
    
                
               // while(PINB.0==0){}
                //Check_If_Done(sync);
    
               // while(PINB.0==1){}
               // Check_If_Done(pkt);
    
                            
                SPI_MasterTransmit(0xFF);        //BURST READ RXFIFO
    
                SPI_MasterReceive();
                CSn(1);
    
                }    
                
            
    
    void TransmitUDPacket(char *str)
    {
    
        char sync[] = "SYNC TX";
    
        char pkt[] = "PACKET TX";
    
        CSn(0);    
        while(PORTB.4==1){}
        
        SPI_MasterTransmit(0x35);
                    
        SPI_MasterTransmit(0x7F);        //write TXFIFO
    
        while(*str)
            SPI_MasterTransmit(*str++);  
            
             
           SimpleReceive();   
    
       CSn(1);
    
    }
    // Timer1 overflow interrupt service routine
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    // Reinitialize Timer1 value
    TCNT1H=0xF85D >> 8;
    TCNT1L=0xF85D & 0xff;
    // Place your code here
    delay_ms(1000);  
    }
    
        
    void main()
    {
    
        char done[] = "Done";
    
        char start[] = "Start";
    
       
    
    
        // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 0.977 kHz
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: On
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x05;
    TCNT1H=0xF8;
    TCNT1L=0x5D;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x04;
    
        
    //#asm("sei")
     SFIOR=(0<<PUD);
      //  DDRC = (0<<DDC3)|(0<<DDC2)|(1<<DDC0);
       // PORTC = (1<<PC3)|(1<<PC2)|(0<<PC0);
         DDRC=0x01;
         
        SPI_MasterInit();            //initialize SPI
    
        USART_Init();                //initialize USART
    
        Check_If_Done(start);            //print Start
    
        Full_RegConfig();            //CC1101 configured
    
        Check_If_Done(done);            //print Done
    
            data[0]=9;
            data[1]='a';
            data[2]='b';
            data[3]='c';
            data[4]='d';
            data[5]='e';
            data[6]='f';
            data[7]='g';
            data[8]='h';
            data[9]='K';
            data[10]='\0';
            
        
        while(1) 
       { 
            
           #asm("sei") 
          sleep_enable();
          idle();
          data[9]='y';        
             PORTC=0x01;
          // delay_ms(100);
            TransmitUDPacket(data);    
               
          Check_If_Done(data);
          PORTC=0x00;   
       
    //        TransmitUDPacket(data);    
                
        }
        
      //  return 0;    
    }
    

     

  • Jaspreet Kaur said:
    yes it was actually very frustrating.

    I'm sure there are plenty of people on the forum who would be happy to start up a support group for intermittent problems.  I certainly would have plenty of stories to relate!  :-)

    As for your code, I think you need to issue an SIDLE strobe to the radio before you move to the RX state.  EIther that or make sure you wait for the radio to move to IDLE state before you issue the SRX command.  I would suggest just issuing the SIDLE command as that will alleviate the need to check for other invalid states due to a failed transmission but then again you may not receive the acknowledge packet if your transmission never went out.

    It is always the question of how much intelligence to put into the code vs how much usefulness it will provide you.  Since you will need to manage having not received an acknowledgment packet anyway, does it really matter why it was not received?  Other than for your own comfort level or to understand the actual failure, simply managing the missing acknowledgement should suffice.

    Jim Noxon

  • Sir i am not able to switch between rx and tx modes.

    In receiver side, i issued sidle,sfrx strobes and after a delay of 50ms i issued scal strobe.

    these strobes were issued before transmitter function.

    there are no results ,buzzer sounds once and then nothing happens unless a reset o

            #include <avr/io.h>
            #include <util/delay.h>
    		#define F_CPU 1000000
    
            void USART_Init(void)					
            {
    
                UBRRL = 25;				// sets 1Mhz, 2400bps, .2% error
                UCSRB = (1<<RXEN)|(1<<TXEN);		// Enable receiver and transmitter
                UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);// Set frame format: 8data, 2stop bit
    
            }
    
    
            void USART_Transmit( char data )
            {
            					
                while ( !( UCSRA & (1<<UDRE)) )		// Wait for empty transmit buffer
                ;
                UDR = data;				// Put data into buffer, sends the data
            }
    
    
            void Check_If_Done(char *str)
            {
               
                while(*str) 
                   
                    USART_Transmit(*str++);
                
            	
            }
    
    
            void SPI_MasterInit(void)			//Initialize Atmega8 as master
            {
            						 
                DDRB = (1<<DDB5)|(1<<DDB3)|(1<<DDB2);	// Set MOSI,SCK and SS\ output, all others input
            						
                SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);	// Enable SPI, Master, set clock rate fck/16
            }
    
    
            void SPI_MasterTransmit(char cData)		//Transmit data on the SPI interface	
            {
            	
                SPDR = cData;				// Start transmission 
            	
                while(!(SPSR & (1<<SPIF)))		// Wait for transmission complete 
                ;
            }
    
    
    		void TransmitUDPacket(char *str)
    		{
    
        char sync[] = "SYNC TX";
    
        char pkt[] = "PACKET TX";
    
        //CSn(0);    
      //  while(bit_is_set(PINB,4)){}
         SPI_MasterTransmit(0x36);     //idle mode
    	 SPI_MasterTransmit(0x3A);     //rx flush
    
    	  _delay_ms(50);
    
    	 SPI_MasterTransmit(0x33);	   // scal strobe
        
    
    
        SPI_MasterTransmit(0x35);
        SPI_MasterTransmit(0x7F);        //write TXFIFO
    
        while(*str)
            SPI_MasterTransmit(*str++);
    
    
    		SPI_MasterTransmit(0x3B);
    
       /* while(bit_is_clear(PINB,0))
        {
        //PORTC=0x01; //set PC0 high 
        //delay_ms(100);
    
        }
        Check_If_Done(sync);            //print SYNC TX when sync transmission gets completed
    
        while(bit_is_set(PINB,0)) 
        {
        //PORTC=0x00;
        }
        Check_If_Done(pkt);            //print PACKET TX when packet transmission gets completed
         //*/ 
    
        //CSn(1);
    
    }
    
    
            void SPI_MasterReceive(void)
            {
                char RegValue, i;
                char ReceivedValue[11];
    			unsigned char c;
    			float RSSI_dec;
    			float RSSI_dBm;
    			char trans[3];
    			trans[0]= 'h';
    			trans[1]= 'i';
    			trans[2]= '\0';
    
                char on[]="ON";
                char off[]="OFF";
    
                SPI_MasterTransmit(0x3D);
    
                RegValue = SPDR;
            	
                USART_Transmit(RegValue);
    
                for(i=0; i<11; i++)
                {
    
                    SPI_MasterTransmit(0x3D);
    
                    ReceivedValue[i] = SPDR;
    
                }
    			     	
                if((ReceivedValue[0]=='a') & (ReceivedValue[1]=='b') & (ReceivedValue[2]=='c') & (ReceivedValue[3]=='d') & (ReceivedValue[4]=='e') & (ReceivedValue[5]=='f') & (ReceivedValue[6]=='g') & (ReceivedValue[7]=='h'))
                {
                    if((ReceivedValue[8]=='y'))
    			   
                    {
                       PORTC|=((1<<PC0)|(1<<PC1)|(1<<PC2));
    				   Check_If_Done(ReceivedValue);
                            _delay_ms(250);
    					TransmitUDPacket(trans);
    					Check_If_Done(trans);
                        PORTC&=~(1<<PC0);
                        
    					
    				}
    				/*c=ReceivedValue[9];
    				RSSI_dec=(float)c;
    
    				if(RSSI_dec>= 128) 
    				RSSI_dBm =((RSSI_dec - 256)/2 - 74);
    				else 
    				RSSI_dBm =((RSSI_dec)/2 - 74);
    				 
    				 if(RSSI_dBm<(-107))
    				{
    				PORTC|=(1<<PC0);
    				 _delay_ms(1000);
                    PORTC&=~(1<<PC0);
    					}
    
    
    			/*	if (RSSI_dec<190)
    				{
    				PORTC|=(1<<PC0);
    				 _delay_ms(1000);
                    PORTC&=~(1<<PC0);
    				}
    
    				
    
                    /*else if((ReceivedValue[8]=='n'))
                    {
                        PORTC&=~((1<<PC1)|(1<<PC2));
                        PORTC|=(1<<PC0);
                            _delay_ms(1000);
                        PORTC&=~(1<<PC0);
                        Check_If_Done(off);*/
                    } 
                }
            
    
    
            void CSn(int i)					//Toggle CSn
            {
                if(i==1)
                PORTB|=0x04;
                else
                PORTB&=0xFB;
            }
    
    
            void Write_RegConfig(char addr,char value)	//send register value of a particular register
            {
                SPI_MasterTransmit(addr);
                SPI_MasterTransmit(value);	
            }
    
            	
            void Full_RegConfig(void)			//for full register configuration using BURST access
            {
                CSn(0);
                while(bit_is_set(PINB,4)){}
    
                SPI_MasterTransmit(0x3E);		//address for patable access
                SPI_MasterTransmit(0xC0);		//patable for PA power control settings
    
                SPI_MasterTransmit(0x40);		//burst transfer 1st address
    
                SPI_MasterTransmit(0x29);		//data written at register 0x00
                SPI_MasterTransmit(0x2E);		//data written at register 0x01
                SPI_MasterTransmit(0x06);		//data written at register 0x02
                SPI_MasterTransmit(0x47);		//data written at register 0x03
                SPI_MasterTransmit(0xD3);		//data written at register 0x04
                SPI_MasterTransmit(0x91);		//data written at register 0x05
                SPI_MasterTransmit(0x3D);		//data written at register 0x06
                SPI_MasterTransmit(0x04);		//data written at register 0x07 EARLIER 04
                SPI_MasterTransmit(0x01);		//data written at register 0x08 EARLIER 05
                SPI_MasterTransmit(0x00);		//data written at register 0x09
                SPI_MasterTransmit(0x00);		//data written at register 0x0A
                SPI_MasterTransmit(0x06);		//data written at register 0x0B
                SPI_MasterTransmit(0x00);		//data written at register 0x0C
                SPI_MasterTransmit(0x10);		//data written at register 0x0D
                SPI_MasterTransmit(0x09);		//data written at register 0x0E EARLIER A7 866
                SPI_MasterTransmit(0x7B);		//data written at register 0x0F EARLIER 62 866
                SPI_MasterTransmit(0xF5);		//data written at register 0x10	CA
                SPI_MasterTransmit(0x75);		//data written at register 0x11	EARLIER 83 866
                SPI_MasterTransmit(0x03);		//data written at register 0x12	13
                SPI_MasterTransmit(0x22);		//data written at register 0x13
                SPI_MasterTransmit(0xE5);		//data written at register 0x14	EARLIER F8 866
                SPI_MasterTransmit(0x14);		//data written at register 0x15 EARLIER 15 866
                SPI_MasterTransmit(0x07);		//data written at register 0x16
                SPI_MasterTransmit(0x30);		//data written at register 0x17
                SPI_MasterTransmit(0x18);		//data written at register 0x18
                SPI_MasterTransmit(0x16);		//data written at register 0x19
                SPI_MasterTransmit(0x6C);		//data written at register 0x1A
                SPI_MasterTransmit(0x03);		//data written at register 0x1B
                SPI_MasterTransmit(0x40);		//data written at register 0x1C
                SPI_MasterTransmit(0x91);		//data written at register 0x1D
                SPI_MasterTransmit(0x87);		//data written at register 0x1E
                SPI_MasterTransmit(0x6B);		//data written at register 0x1F
                SPI_MasterTransmit(0xF8);		//data written at register 0x20
                SPI_MasterTransmit(0x56);		//data written at register 0x21
                SPI_MasterTransmit(0x10);		//data written at register 0x22
                SPI_MasterTransmit(0xE9);		//data written at register 0x23
                SPI_MasterTransmit(0x2A);		//data written at register 0x24
                SPI_MasterTransmit(0x00);		//data written at register 0x25
                SPI_MasterTransmit(0x1F);		//data written at register 0x26
                SPI_MasterTransmit(0x41);		//data written at register 0x27
                SPI_MasterTransmit(0x00);		//data written at register 0x28
                SPI_MasterTransmit(0x59);		//data written at register 0x29
                SPI_MasterTransmit(0x7F);		//data written at register 0x2A
                SPI_MasterTransmit(0x3F);		//data written at register 0x2B
                SPI_MasterTransmit(0x81);		//data written at register 0x2C
                SPI_MasterTransmit(0x35);		//data written at register 0x2D
                SPI_MasterTransmit(0x09);		//data written at register 0x2E
    
                CSn(1);
            	
            }
    
    
            void SimpleReceive(void)
            {
    			//char RSSI_value;
    
                char sync[] = "SYNC TX";
    
                char pkt[] = "PACKET TX";
    
                while(1)
                {
    
                CSn(0);	
                //while(bit_is_set(PINB,4)){}
    			 _delay_ms(100);
                SPI_MasterTransmit(0x34);		//SRX STROBE
    
            	
                while(bit_is_clear(PINB,0)){}
                Check_If_Done(sync);
    
                while(bit_is_set(PINB,0)){}
                Check_If_Done(pkt);
    
            				
                SPI_MasterTransmit(0xFF);		//BURST READ RXFIFO
    
                SPI_MasterReceive();
    			
    			//SPI_MasterTransmit(0xF4);
    			//RSSI_value=SPDR;
    			//USART_Transmit(RSSI_value);
    					
            	
                CSn(1);
    
                }	
            	
            }
    
            	
            int main()
            {
    
                char done[] = "Done";
    
                char start[] = "Start";
    
                DDRC =(1<<DDC2)|(1<<DDC1)|(1<<DDC0);	// 0 for Buzzer, 1 for LED, 2 for Relay
                PORTC =(1<<PC2)|(0<<PC1)|(0<<PC0);
    
                SPI_MasterInit();
    
                USART_Init();
    
    
                Check_If_Done(start);
    
                Full_RegConfig();			//CC1101 configured
    
                Check_If_Done(done);
    
                SimpleReceive();
            	
                return 0;	
            }
    
    ccurs.

    i am attaching the receiver code.please go through it. earlier i gave u the transmitter code.

  • Hello Sir,

    I am facing a peculiar problem.

    CC1101 is transmitting well but not able to receive the data packet.

    The codes are well tested.Can it be a hardware problem???

  • Sure, it can be hardware.  I recently debugged an issue where the 56k bias resistor was replaced with a 56 ohm resistor.  This caused an asymmetric response between transmit and receive, the distance in receive was about 2 orders of magnitude shorter than in transmit.  That's not to say this is your problem but just to show there can be real hardware issues that cause asymmetric operation of the RF path.

    Usually when people have these types of problems it generally is a configuration issue.  When you say the code is well tested, how do you know that.  Does it run on one of the EM boards properly but not on yours?

    I'll need a bit more information to be able to help you much.

    Jim Noxon

  • Yes sir it did run on the similar boards...but now when i have the new pcb with me..it's not receiving but it is doing the transmitting part....

    That it is transmitting, grounding of the die pad won't be a problem i guess...

    What could be the problem then???

  • There's really no way for me to tell exactly.  My suggestion is to make sure all the components (bias resistor, bypass capacitors, etc.) match what the reference designs use.  Also make sure the RF path is using good quality components to minimize tolerance issues.  Finally, does your layout conform to one of the reference designs especially with respect to the bypass capacitors and power line traces.  The last item can have a significant effect on generation of asymmetric operation as different power pins are more closely associated with RX and TX blocks within the parts.

    Jim Noxon

  • Hi Jim

    Gin here, from IdentiTag, South Africa

    I hope you could possibly give me some advice

    We recently had some issues using the CC1101 in our manufacturing process.

    A set of boards were processed using a proper solder stencil, pick and place, and re-flow oven.

    A lead-free paste and oven profile was used. 

    Approximately 40% of the units failed on main test, due to the boards not being able to produce an RF carrier.

    The following was confirmed for all affected boards:

    • The CC1101 RF was to be tested by configuring through a micro-controller, to operate in transparent OOK mode.
    • The microcontroller was able to establish working SPI comms to the CC1101
    • The CC1101 RF was to be tested by configuring through a micro-controller, to operate in transparent OOK mode.
    • All supply pins were fed 3V
    • All passive components were the correct value
    • The crystal oscillator was verified as running
    • The test firmware/software was correct and working, using a known working board
    • Reworking the CC1101 IC (removing with hot air, reworking pads, replacing same IC) did not solve the problem
    • Completely replacing the CC1101 with a new part solved the problem.

    I do not think this was MSD or ESD related, as the same identical symptoms were seen over a fair number of units.

    Surely the symptoms would be more random if the ICs were damaged by static, or mechanical strain?

    Thus far all I can imagine is that perhaps a poor centre pad connection, and enabling the RF PA, somehow damaged the chips.

    Our SMD production manager mentioned that we do run a slightly cooler re-flow profile than usual.

    This might explain a possible poor re-flow on the centre pad, due to it being effectively heatsinked by the ground plane it is connected to.

    Have you had any similar complaints / feedback from other users?

  • Yes I have.  Lead free solders tend to have a higher melting point and therefore need a higher temperature profile during reflow.  This carries the potential to damage the part and as you have seen, lowering the temperature profile can lead to incomplete reflow.  If replacing the part fixes the problem then it appears the RF path is valid so we don't need to investigate that path.  I would suggest you X-ray the modules that are failing and compare them with X-rays of modules which are passing.

    Another option is the solder past mask is too large and you are getting shorts from the ground pad to other pins (such as the RF pins) on the part causing failure.  This usually can be determined if the pass/fail criteria have a very large gap whereas poor ground pad connections do to failed reflow usually show a more distributed failure of output power.

    I have also heard of some cases where older reflow equipment had larger than acceptable gradients within the oven and the area where the radio was at failed purely due to these gradients.  This is a long shot but you can check with your CM to see how old the equipment being used is.  You can use a blank board with several different temperature test strips placed on it at several locations to validate an even reflow process if there is any question.

    Another option is if the via's under the part trap air or more importantly gas from the flux as it boils away.  This can lift the part or create large voids under the part.  Eliminating the center via can sometimes circumvent this failure.  Another option would be to specify these vias be filled during the board fabrication process.

    Unfortunately there is no magic answer for such problems.  This is usually more of a Sherlock Holmes type of process where you eliminate all that is not failing and you are finally left with the real failure.  Regrettably this is usually a long and drawn out process.  Keep us informed of anything you find as it may trigger some old memory that I have yet to conjure up.

    Best of luck,

    Jim Noxon

  • Hi Jim

    Our oven is indeed old - a four stage from the 90's. 

    I know that our production manager has been looking at running a thermal data-logger through the oven, to get a better idea of what it's actually doing.

    We should have an answer on that hopefully soon.

    I'm quite confident that we're not getting shorts.

    I tested for continuity along the pins of three problem units, nothing suspicious was found. 

    As for Vias, I have four vias in the ground pad, 0.3mm drill, tented on the bottom side.

    I'm quite certain that we could specify these to be filled by our manufacturer.

    Thank you for your advice, it is very much appreciated.

    I shall let you know as soon as we have resolved this problem.

    Kind regards

    Gin