Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[Moved] RF12BP/868 communication problem

Status
Not open for further replies.

Zegdus

Newbie level 2
Joined
Jul 24, 2011
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,300
Hi, I've a problem with communication between two modules RFM12BP. For communication between the MCU (Atmega644PA) and RFM12BP i use hardware SPI. Problem :
- In transmitter mode I can send (or second RFM recieves) only one byte followed by 0xAA, 0xAA, 0x2D, 0xD4, (byte), 0xAA, 0xAA.
- Modules work only with 4.8 kbps baudrate (if I increase or decrease baudrate I've got no data on reciever - i've tried changing reciever baseband bandwitch and dFSK - bottom page 37 in Si4421 datasheet)
To receieve data I use polling mode - page 31 in Si4421 datasheet.
Datasheet : https://www.silabs.com/Support Documents/TechnicalDocs/Si4421.pdf

Thanks in advance! Code below:
Code:
#include <avr/io.h>
#include <util\delay.h>
#include "Pinout.h"
#include "RF_CTRL.h"
#include "Frame.h"
	
#define RF12FREQ(freq)	((freq-860.0)/0.005)							

#ifndef F_CPU 
#define F_CPU  20000000UL 
#endif 
#define RS_BAUD 9600
#define RS_UBRR F_CPU / 16 / RS_BAUD - 1

void SPI_MasterInit(void);
void SPI_MasterTransmit(uint8_t cData); 
void SPI_MasterTransmit_DATA16(uint16_t cData);
uint8_t SPI_sendbyte (uint8_t data);

uint16_t RF_write_cmd(uint16_t aCmd);
void InitPins(void);
void RF12Init(void);
uint16_t RF_write_cmd(uint16_t aCmd);
uint16_t RF_write_data(uint16_t aCmd);
uint16_t RF_Read_FIFO(void);
void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi);
void rf12_setfreq(unsigned short freq);
void rf12_setbaud(unsigned short baud);
void rf12_setpower(unsigned char power, unsigned char mod);
uint16_t status_read(void);
void RF_send_packet(uint8_t *tab,uint8_t len);
void RF12_direct_data_in(void);
uint8_t countByte(void);

void USART0_Init(unsigned int myubrr);
void USART0_Transmit(unsigned char data );
char USART0_Receive( void );
void checkBuff(void);

uint8_t dataBuff[32];
uint8_t tempVal = 0;
uint8_t endFrameFlag = 0;


	uint8_t packet[4] = {
	0x77,				//naglowekA
	0xFF,				//naglowekB - nadawca, odbiorca, dlugosc pakietu
	0xAA,				//dane
	0x55};					//end frame

void InitPins(void)
{
	DDRA = 0x00;
	DDRB = 0xFF;
	DDRC = 0xEF;
	DDRD = 0xEF;
	PORTB = 0x0F;
 	RF_RST_H();
	nFFS_H();
}

void RF12Init(void)
{
	RF_RST_L();
	_delay_ms(100);
	RF_RST_H();
	_delay_ms(100);
	RF_write_cmd(0x0000);
	
	RF_write_cmd(0x80E7);	//EN_TX, EN_RX_FIFO, 868MHz, 12.5pF
	RF_write_cmd(0xC2AC);
	RF_write_cmd(0xCA81);
	RF_write_cmd(0xE000);
	RF_write_cmd(0xC4E7);

}

uint16_t RF_write_cmd(uint16_t aCmd)
{
	
	uint16_t reply;
	RF_CS_L();

    SPDR = aCmd >> 8;
    while (!(SPSR & _BV(SPIF)));
    reply = SPDR << 8;

    SPDR = aCmd;
    while (!(SPSR & _BV(SPIF)));
    reply |= SPDR;

    RF_CS_H();
	USART0_Transmit(reply>>8);
	USART0_Transmit(reply);
    return reply;
}

uint16_t RF_write_data(uint16_t aCmd)
{
	
	uint16_t reply;

    SPDR = aCmd >> 8;
    while (!(SPSR & _BV(SPIF)));
    reply = SPDR << 8;

    SPDR = aCmd;
    while (!(SPSR & _BV(SPIF)));
    reply |= SPDR;


//	USART0_Transmit(reply>>8);
//	USART0_Transmit(reply);
    return reply;
}

uint16_t RF_Read_FIFO(void)
{
	uint16_t reply;
	nFFS_L();

    SPDR = 0x00;
    while (!(SPSR & _BV(SPIF)));
    reply = SPDR << 8;
    SPDR = 0x00;
    while (!(SPSR & _BV(SPIF)));
    reply |= SPDR;
	if(bit_is_clear(PINC,PC4))
	{
    nFFS_H();
    }
	return reply;
}

void rf12_setbandwidth(unsigned char bandwidth, unsigned char gain, unsigned char drssi)
{
	RF_write_cmd(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
}

void rf12_setfreq(unsigned short freq)
{	if (freq<96)				
		freq=96;			//860,48  MHz
	else if (freq>3903)		
		freq=3903;			//879,515 MHz
	RF_write_cmd(0xA000|freq);
}

void rf12_setbaud(unsigned short baud)
{
	if (baud<663)
		return;
	if (baud<5400)					// Baudrate= 344827,58621/(R+1)/(1+CS*7)
		RF_write_cmd(0xC680|((43104/baud)-1));
	else
		RF_write_cmd(0xC600|((344828UL/baud)-1));
}

void rf12_setpower(unsigned char power, unsigned char mod)
{	
	RF_write_cmd(0x9800|(power&7)|((mod&15)<<4));
}

uint16_t status_read(void)
{	
	return RF_write_cmd(0x0000);	
}

void RF_send_packet(uint8_t *tab,uint8_t len)
{
	uint8_t data[4];
	data[0] = 0xAA;
	data[1] = 0xAA;
	data[2] = 0x2D;
	data[3] = 0xD4;
	RF_write_cmd((RF_CONFIGSET_CMD)|(0x0080));	//80e7
	RF_write_cmd((RF_POWERMAN_CMD)|(0x0020));
	RF_TX_H();
	LED_Y_H();
	_delay_ms(100);
	for(uint8_t a = 0; a<len ; a++)
	{
		for(uint8_t i=0; i<4 ; i++)
		{
			WAIT_IRQ_L();
			RF_write_cmd((0xB800)|(data[i]));
		}
			WAIT_IRQ_L();
			RF_write_cmd(0xB800|(tab[a]));
			_delay_ms(10);
		for(uint8_t i=0; i<2 ; i++)
		{
			WAIT_IRQ_L();
			RF_write_cmd((0xB800)|(data[i]));
		}
	}
	RF_TX_L();
	LED_Y_L();
	_delay_ms(100);
	RF_write_cmd(RF_POWERMAN_CMD);
	RF_write_cmd(RF_CONFIGSET_CMD);
	status_read();
}

void RF_send(uint8_t *tab,uint8_t len)
{
	uint8_t data[4];
	data[0] = 0xAA;
	data[1] = 0xAA;
	data[2] = 0x2D;
	data[3] = 0xD4;
	RF_write_cmd((RF_CONFIGSET_CMD)|(0x0080));	//80e7
	RF_write_cmd((RF_POWERMAN_CMD)|(0x0020));
	RF_TX_H();
	LED_Y_H();
	_delay_ms(100);

		for(uint8_t i=0; i<4 ; i++)
		{
			WAIT_IRQ_L();
			RF_write_cmd((0xB800)|(data[i]));
		}
		for(uint8_t a = 0; a<len ; a++)
		{
			
			RF_write_cmd((0xB800)|(tab[a]));
			WAIT_IRQ_L();
			_delay_ms(10);
		}
		for(uint8_t i=0; i<2 ; i++)
		{
			WAIT_IRQ_L();
			RF_write_cmd((0xB800)|(data[i]));
		}
	
	RF_TX_L();
	LED_Y_L();
	_delay_ms(100);
	RF_write_cmd(RF_POWERMAN_CMD);
	RF_write_cmd(RF_CONFIGSET_CMD);
	status_read();
}

void RF12_direct_data_in(void)
{
	unsigned char temp = 0;
	LED_A_L();
	while((PINC&(1<<PC4)))
	{
		RF_CS_H();
		LED_G_H();	
		temp = RF_Read_FIFO();
		if(temp!=0)
		{
			dataBuff[tempVal] = temp;			
			if((temp == END_F)&&(tempVal >=3))
			{
				endFrameFlag = 1;
				checkBuff();
				tempVal = 0;
			}
			
			tempVal++;
			
		}
	}
	_delay_ms(10);
	LED_G_L();

}


void checkBuff(void)
{	
	if(((dataBuff[tempVal -3])&0xF0) == START_F)
	{
		USART0_Transmit(dataBuff[tempVal -2]);
		USART0_Transmit(dataBuff[tempVal -1]);
	}
}



void RF_enableRX(void)
{
	RF_RX_H();
	RF_write_cmd(0x82C8);			// RX on
	RF_write_cmd(0xCAF1);			// set FIFO mode
	RF_write_cmd(0xCAF3);			// enable FIFO
}

void Init_SPI_com(void)
{
	RF_CS_H();
	SPI_MasterTransmit_DATA16(0xFF00);
}

void RF_enableTX(void)
{
	RF_write_cmd((0x8209)|(0x0020));
}

uint16_t _crc16_update(uint16_t crc, uint8_t a)
{ 
	int i;
 	crc ^= a;
	for (i = 0; i < 8; ++i)
	{   
	 if (crc & 1)
	 	crc = (crc >> 1) ^ 0xA001;
	 else
	 	crc = (crc >> 1);
	}
	return crc;
}

uint16_t CRC16(uint8_t *data, uint8_t len)
{	
	uint16_t  crc16=0xffff;							
	while(len--) crc16=_crc16_update(crc16,*data++);
	return crc16;
}


int main(void)
{
	InitPins();
	SPI_MasterInit();
	RF12Init();
	rf12_setfreq(RF12FREQ(869.40));
	rf12_setbandwidth(6, 0, 0);	//6,0,0
	rf12_setbaud(4800);			//4800
	rf12_setpower(0, 5);			//dewiacja 45kHz+/-
	unsigned char zegde[17] ="TEST 869.40 MHz\n";
					 
	USART0_Init(RS_UBRR);

	RF_enableRX(); //recieve

	while(1)
	{
/*Transmitt
	for(uint8_t i = 0; i<5; i++)
		{
			_delay_ms(200);
		}
	RF_send_packet(packet,4);
*/
	  	RF12_direct_data_in();

//		RF_write_cmd(0x0000);
	}
	return 0;
}

Pinout:
Code:
#define PORT_SPI	PORTB
#define DDR_SPI		DDRB

#define DD_MOSI		DDB5
#define DD_SCK		DDB7
#define DD_CS		DDB4
#define DD_RST		DDB1

#define DD_LEDA		DDB0
#define DD_LEDB		DDB1
#define DD_LEDC		DDB2
#define DD_LEDD		DDB3

#define RF_CS_H()	PORTB |= (1<<PB4)
#define RF_CS_L()	PORTB &=~(1<<PB4)

#define RF_RST_H()	PORTC |= (1<<PC2)
#define RF_RST_L()	PORTC &=~(1<<PC2)

#define RF_TX_H()	PORTC |= (1<<PC0)
/*---------PINOUT-------------
nSEL		5			PB4		O
nIRQ		18			PD4		I
FSK(nFFS)	25			PC3		O	
DCLK(FFIT)	26			PC4		I
RXEN		23			PC1		O
TXEN		22			PC0		O
nInt		21			PD7		O
nRes		24			PC2		O
LEDA		19			PD5		O
LEDB		20			PD6		O
SW			40			PA0		I
*/

#define RF_TX_L()	PORTC &=~(1<<PC0)

#define RF_RX_H()	PORTC |= (1<<PC1)
#define RF_RX_L()	PORTC &=~(1<<PC1)

#define nFFS_H()	PORTC |= (1<<PC3)
#define nFFS_L()	PORTC &= ~(1<<PC3)

#define LED_G_H()	PORTD |= (1<<PD6) 
#define LED_G_L()	PORTD &= ~(1<<PD6)

#define LED_Y_H()	PORTD |= (1<<PD5) 
#define LED_Y_L()	PORTD &= ~(1<<PD5)

#define LED_A_L()	PORTB |= (1<<PB0) 
#define LED_A_H()	PORTB &= ~(1<<PB0)

#define LED_B_L()	PORTB |= (1<<PB1) 
#define LED_B_H()	PORTB &= ~(1<<PB1)

#define LED_C_L()	PORTB |= (1<<PB2) 
#define LED_C_H()	PORTB &= ~(1<<PB2)

#define LED_D_L()	PORTB |= (1<<PB3) 
#define LED_D_H()	PORTB &= ~(1<<PB3)

#define WAIT_IRQ_L()	while(PIND&(1<<PD4))
#define WAIT_IRQ_H()	while(!(PIND&(1<<PD4)))


#define WAIT_FFIT_L()	while(PINC&(1<<PC4))
#define FFIT_S()		bit_is_set(PINC,PC4)

#define WAIT_FIFO()		while(!(PINB&(1<<PB6)))

#define CHECK_MISO_H()	bit_is_set(PINB,PB6)
#define WAIT_MISO_H()	while(!(PINB&(1<<PB6)))
 
Last edited:

Dear it is absolutly not working or you are recieving wrong messages.
I have used RFM12BP. I have used pic.
here is the code




Code:
#include<pic.h>
#include<math.h>

typedef unsigned char uchar;
typedef unsigned int  uint;


#define  power_option_0		RA0
#define  power_option_1		RA1
#define  nIRQ           	RA2
#define  MCLR	        	RA3
#define  TXEN           	RA4
#define  RXEN	        	RA5
                        	
#define  rate_0			RC0
#define  rate_1			RC1
#define  baud_0			RC2
#define  baud_1			RC3
#define  LED_GREEN		RC4

#define  test_mode_1	 	RC5
#define  nSEL			RC6
#define  SDO	         	RC7

#define  SDI           		RB4
#define  LED_RED			RB5
#define  SCK			RB6
#define  test_mode_0		RB7

#define R434		0
#define R869		1
#define R915		2

#define rx_normal 	0
#define rx_test		1
#define tx_normal 	2
#define tx_test 	3

#define tx_mode		(mode == tx_normal)||(mode == tx_test)



#define  nIRQ_IN()     TRISA2=1
#define  SDI_OUT()     TRISB4=0

#define  SDO_IN()      TRISC7=1
#define  SCK_OUT()     TRISB6=0
#define  nSEL_OUT()    TRISC6=0


unsigned char mode;
unsigned char count_50hz;

unsigned char node_value;
unsigned char node_1_value;
unsigned char node_2_value;
unsigned char temp;
unsigned char power;     
unsigned char rate;      
unsigned char rx_band_width;
unsigned char band;

unsigned char tx_buf[16];
unsigned char RF_RXBUF[19];

unsigned int rf_status;
typedef struct 
{
	
	unsigned char reach_1s				: 1;
	
	unsigned char reach_5hz				: 1;
	unsigned char is_txing				: 1;
	
}	FlagType;

FlagType	                Flag;

void delay_50ms(void);
void delay_200ms(void);
void delay_5ms(void);
void delay_1ms(void);
void option_detect(void);
void port_init(void); 
void power_on_delay(void);
void INIT_TX_BUF(void);
void Tx_data_by_spi(unsigned char tx_data);
void RF12bp_init(void);

unsigned int read_status(void);
void RF12bp_rx_init_no_power(void);




void Write0( void );
void Write1( void );
void WriteCMD( unsigned int command );

void timer2_init(void);

void tx_all_data(void);
void sub_program_1hz(void);
void Write8bitcommand(unsigned char command);
unsigned char rf12_rdpayload(void);
void rf12_init_com(void);
void RF12bp_tx_init(void);
void RF12bp_rx_init(void);



void INIT_TX_BUF(void)
{
  unsigned char i;
  
  	
  	RXEN = 0;
  	TXEN = 1;
  	
  	delay_50ms();
	for(i=0;i<16;i++)
  	{
    		tx_buf[i]=0x30+i;
  	}
}


void tx_all_data(void)
{
	unsigned char chksum;
  	unsigned char aByte,i;
  	unsigned char kk;
  
  	Flag.is_txing = 1;
  	
  	INIT_TX_BUF();		
	NOP();
	NOP();
	RF12bp_tx_init();	
	NOP();
	
  	

  	
  	WriteCMD(0xCA81);
  	WriteCMD(0xCA83);
  	
  	rf_status = read_status();
	NOP();
			
  	if(mode == tx_test)
  	{
  		LED_RED = 1;
  		
  		while(1)
  		{
  			Tx_data_by_spi( 0xAA );
  		}	
  	}	
  
  	LED_RED  ^= 1;
  	
  	
  	Tx_data_by_spi( 0xAA );
  	Tx_data_by_spi( 0xAA );
  	Tx_data_by_spi( 0xAA ); 
  	Tx_data_by_spi( 0x2D );
  	Tx_data_by_spi( 0xD4 );
  
  	chksum=0;
  	for(i=0;i<16;i++)
  	{
    		aByte=tx_buf[i];
    		Tx_data_by_spi(aByte);
    		chksum+=aByte;
  	}
     
  	Tx_data_by_spi( chksum );
  		
  	Tx_data_by_spi( 0xAA );
  	Tx_data_by_spi( 0xAA );
  	Tx_data_by_spi( 0xAA );
  			
	NOP();
	        	

	
	WriteCMD(0x8208);  
	
	NOP();
	rf_status = read_status();
	NOP();
	
	RF12bp_rx_init();		
  	
}	



void main()
{ 
	

	unsigned char number_byte, j, chksum;

	OSCCON = 0X70;	
	
	WDTCON = 0X00;
	
	power_on_delay();  
	port_init();  	
 	option_detect();
 	
 	LED_GREEN = LED_RED = 0;
	
	timer2_init();
	
	count_50hz = 0;
	Flag.reach_1s = 0;
	

	INTCON = 0xc0; 
	
	RF12bp_init();
	
	number_byte = 0;
	while(1)
	{		
		sub_program_1hz();
		
	if(!Flag.is_txing )
	{	
  		NOP();
		
	
				
		if(!nIRQ)
		{ 
      			RF_RXBUF[number_byte++]=rf12_rdpayload();  
      			NOP();
      			
      			if( number_byte == 17 )
      			{ 
        			number_byte = 0;
        			
				rf_status = read_status();
				NOP();
				  

        			WriteCMD(0xCA81);

  				WriteCMD(0xCA83);
        			
				rf_status = read_status();
				NOP();
				
        			chksum = 0;  
        			for(j=0;j<16;j++)
        	 			chksum += RF_RXBUF[j];  
        		
     				if( chksum == RF_RXBUF[16] )
     				{
        	 			LED_GREEN ^= 1;
        	 	
        	 			if(mode == rx_normal)
        	 			{
        	 				delay_200ms();
        	 				NOP();
        	 				tx_all_data();
        	 			}	
        	 		}
        	 		else
        	 		{
        	 			NOP();
        	 			NOP();
        	 		}	
        	 	}
        	 			
		}
	}	
	}	
}
//*/




unsigned char rf12_rdpayload(void)
{
  	unsigned char i,Result;
  	SCK=0;
  	SDI=0;
  	nSEL=0; 
  	for(i=0;i<16;i++)
  	{                     
  		SCK=1;
  		NOP();
  		
  		SCK=0;
  		NOP();
  		
  	}                   
  	Result=0;
  	for(i=0;i<8;i++)
  	{        
  	 	Result=Result<<1;
  	 	SCK=1;
  	 	NOP();
  	 	if(SDO)
  	 	{
  	 		Result|=1;
  	 	}
  	 	
  	 	SCK=0;
  	 	NOP();
  	 	
  	 }
  	 nSEL=1;
  	 return(Result); 
} 







void Write0( void )
{
  	SCK=0;  
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	
  	SDI=0;
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	
  	
  	
  	SCK=1;  
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
}

void Write1( void )
{
	SCK=0;  
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	
  	SDI=1;
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	
  	
  	
  	SCK=1;  
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();
  	NOP();

}

void Write8bitcommand(unsigned char command) 
{
	unsigned char n=8;
  	nSEL = 1;
  	SCK=0;
  	nSEL=0;
  	while(n--)
   	{
     		if(command&0x80)
      		Write1();
     		else
      		Write0();   
     		command = command << 1;
   	}
  	SCK=0;
  	
}	


void WriteCMD( unsigned int command )
{
  unsigned char n=16;
  nSEL = 1;
  SCK=0;
  nSEL=0;
  while(n--)
   {
     if(command&0x8000)
      Write1();
     else
      Write0();   
     command = command << 1;
   }
  SCK=0;
  nSEL=1;
}


void Tx_data_by_spi(unsigned char tx_data) 
{
	unsigned int command = 0xb800;
	command += (unsigned int)(tx_data);
	

	
	nSEL = 0;
	while( SDO == 0 )  
	{
		;
	
	}
	WriteCMD(command);
	NOP();
	NOP();
}	






 void option_detect(void)
 {
	if( RC5 == 0 ) 
	{
		mode = rx_test;
		if(RB7 == 0 ) mode = tx_test;
	}	
	else
	{
		mode = rx_normal;
		if( RB7 == 0 ) mode = tx_normal;
	}	
	
	
	if(RC3 == 1) band = R434;  // 433
	else
	{
		band = R869;  // 869
		if( RC2 == 0 ) band = R915;  // 915
	}	
	
	rate = (PORTC &0x03);
	rate ^= 0x03;
	
	power = (PORTA &0x03);
	power ^= 0x03;
	
	rx_band_width = (PORTA &0x03);
	rx_band_width ^= 0x03;	
}	

void delay_200ms(void)
{
	int i, j;
	for(j = 0; j<40; j++)
	{
		for(i = 0; i<167; i++)   // 85*5
		{
			;
		}	
	}	
}	
void delay_50ms(void)
{

	int i, j;
	for(j = 0; j<10; j++)
	{
		for(i = 0; i<167; i++)   // 85*5
		{
			;
		}	
	}	
	
}	

void delay_5ms(void)
{
	int i;
	for(i = 0; i<167; i++)   // 85*5
	{
		;
	}	
}	

void delay_1ms(void)
{
	int i;
	for(i = 0; i<33; i++)
	{
		;
	}	
}	


void timer2_init(void)
{
	T2CON = 0x7f; 
	PR2 = 78;  
	TMR2IE = 1;
}

void interrupt ISR_timer(void)
{
 
 	unsigned char i;
	if(TMR2IF)
   	{
   	
		count_50hz++;
    		if(count_50hz==50)  
     		{
       			count_50hz=0;
       			Flag.reach_1s = 1;
       			
     		}		
     		else if(count_50hz == 5)
     		{
			Flag.reach_5hz = 1;
     		}	
     		
    		TMR2IF=0;
	}
	
}  

void port_init(void) 
{ 
 	ANSEL = 0;
 	ANSELH = 0;
 	WPUA = 0;	
 	IOCA = 0;  
	TRISA = 0x0f;  
  	TRISB = 0x80;  
  	WPUB = 0x00; 
  	TRISC = 0b10101111; 
  	TXEN = RXEN = 0;
  	LED_GREEN = LED_RED = 0;
}	
void power_on_delay(void)
{
	unsigned int i;
	for(i = 0; i<1000; i++)
	{
		delay_1ms();
	}	
}	



void sub_program_1hz(void)
{
	
	if(Flag.reach_1s)
	{
		Flag.reach_1s = 0;
		
		if( tx_mode )
		{
			tx_all_data();	
			
		}	
	}		
}	


void RF12bp_rx_init(void)
{
	unsigned int i;
	
	TXEN = 0;
	RXEN = 1;
	
	Flag.is_txing = 0;
			
	delay_50ms();
			
	
	
	nSEL=1;
  	SDI=1;
  	SCK=0;  
  	
	WriteCMD(0x82d8);
		
  	delay_5ms();
  	
  	NOP();
	rf_status = read_status(); 
	NOP();
		
	rf12_init_com();
  	
}	
void RF12bp_rx_init_no_power(void)
{
	nSEL=1;
  	SDI=1;
  	SCK=0;  
  	
	WriteCMD(0x82d8);
		
  	delay_5ms();
  	
  	NOP();
	rf_status = read_status(); 
	NOP();
		
	rf12_init_com();
}	

void RF12bp_tx_init(void)
{
	unsigned int i;
	
	nSEL=1;
  	SDI=1;
  	SCK=0;  
  	
	WriteCMD(0x8238);
  	
  	delay_5ms();
  	
  	
  	NOP();
	rf_status = read_status(); 
	NOP();
  	
	rf12_init_com();	
}


void RF12bp_init(void)
{
	unsigned int i;
	
  	
	if(tx_mode)
	{
  		tx_all_data();
  	}	
	else
	{
		RF12bp_rx_init();
	
	}	  

}

void rf12_init_com(void)
{  	
	switch (rate)
  	{
  		case 3: 
  		{
  			WriteCMD(0xc623); 
  			break;
  		}
  		
  		case 0:   
  		{
  		
  			WriteCMD(0xc6a3); 
  			break;
  		}	
  		case 1: 
  		{
  			WriteCMD(0xc691); 
  			break;
  		}	
  		case 2: 
  		{
  			WriteCMD(0xc647); 
  		
  			break;
  		}	
  			
  	}	
  	
  	switch (power)
  	{
  		case 0:
  		{
  			WriteCMD(0x94c0);
  		
  			WriteCMD(0x9820);
  			break;
  		}	
  		case 1:
  		{
  			WriteCMD(0x94c0);
  			WriteCMD(0x9820);
  			break;
  		}	
  		case 2:
  		{
  			WriteCMD(0x94c0);
  			WriteCMD(0x9820);
  			break;
  		}	
  		case 3:
  		{
  			TXEN = RXEN = 0;
  			LED_GREEN  = LED_RED = 0;
  			
			rf_status = read_status(); 
			NOP();
  			
  			WriteCMD(0x8200);   
  			while(1)
  			{
  				;
  			}	
  			break;
  		}	
  	}	
  	
  	  		
  	
  	
 	WriteCMD(0xC2AF);   // dqd = 7
  	
  	WriteCMD(0xC477);


	WriteCMD(0xcc76);
	NOP();
	NOP();	

	
  	WriteCMD(0xE196);
  	WriteCMD(0xC80E);
  	WriteCMD(0xC0C0);
  	
	NOP();
	NOP();	

  
  
  	if(mode == rx_test)
	{
		LED_GREEN = 1;
		
		TXEN = 0;
		
		RXEN = 1;
		delay_50ms();
		
		switch(band)
		{	
			case R434:
			{
				WriteCMD(0x8018);
			

				WriteCMD(0xA640);
				
				break;
			}	
			case R869:
			{
				WriteCMD(0x8028);
				WriteCMD(0xa708);
				
				break;
			}	
			case R915:
			{
				WriteCMD(0x8038);
				NOP();		
				NOP();
				WriteCMD(0xa7d0);
				NOP();
				NOP();
				break;
			}	
		}
		
		while(1)
		{
			;
		}	
	}
  	else
  	{
  		switch(band)
		{	
			case R434:
			{
				WriteCMD(0x80D8);
			//	WriteCMD(0xAE10);
				WriteCMD(0xA640);
			
				
				break;
			}	
			case R869:
			{
				WriteCMD(0x80E8);
				WriteCMD(0xa708);
				
				break;
			}	
			case R915:
			{
				WriteCMD(0x80f8);
				NOP();		
				NOP();
				WriteCMD(0xa7d0);
				NOP();
				NOP();
				break;
			}	
		}	
  	}	
  	
  	
  	WriteCMD(0xCA81);
  	WriteCMD(0xCA83);
  	
  	NOP();
  	NOP();
	rf_status = read_status(); 
	NOP();
  	
	NOP();	
	WriteCMD(0xCA81);
  	WriteCMD(0xCA83);
}

unsigned int read_status(void)
{
	unsigned int command;
	unsigned char n=16;
	command = 0;
	
	nSEL = 1;
  	SCK=0;
 	nSEL=0;
 	SDI = 0;
 	while(n--)
 	 {
 	   	SCK=0;  
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		
  		
  		SCK=1;  
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();
  		NOP();  
  		
  		command = command << 1;	
  		if(SDO) command += 1;
  		
 	 }
 	 
 	SCK=0;
 	nSEL=1;
 	return(command);
}
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top