⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 si4421.c

📁 芯科rf资料
💻 C
字号:
/*** ============================================================================**** FILE**  Si4421.c**** DESCRIPTION**  Contains all Si4421 handle function		    **** CREATED**  Silicon Laboratories Hungary Ltd**** COPYRIGHT**  Copyright 2008 Silicon Laboratories, Inc.  **	http://www.silabs.com**** ============================================================================*/#include "Si4421.h"#include "uart.h"#include "S8051.h"						/* =========================================================== *						 *						GLOBAL variables					   *						 * =========================================================== */rf_packet packet;xdata uint8 RxPacketPtr;                                             // receive packet pointerxdata uint8 RxPacketLen;                                             // receinve packet lengthxdata RX_STATES RxState;												// receive state	 	xdata uint8 rf_ch;													// frequency channel select										xdata uint8 rf_pwr;													// rf output powerxdata uint16 rf_dr;													// data rate select/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  void init_ezradio(void)  +  + DESCRIPTION:    Initialize the EZRadio   +  +	INPUT:			None  +  + RETURN:         None  +  + NOTES:          the header file -generated from WDS- has to be included!  +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void init_ezradio(void){		uint16 freq_set_cmd;	uint16 	transmitter_cont_cmd;	uint16 datarate_cmd;			/*default rf parameters*/		rf_ch = 0;				/*default frequency channel = 0*/ 	rf_dr = 9600;			/*default datarate*/	rf_pwr = 7;				/*default RF output power*/	//Initialize the IA4421 transceiver if it is included into the project	send_control_command(0xFF00);	delay_ms(10);	send_control_command(IA4421_CONFIGSET_CMD);	send_control_command(IA4421_POWERMAN_CMD);	freq_set_cmd = set_frq(rf_ch);	send_control_command(freq_set_cmd);	datarate_cmd = set_dr(rf_dr);	send_control_command(datarate_cmd);		send_control_command(IA4421_RECEIVERCNT_CMD);	send_control_command(IA4421_DATAFILTER_CMD);	send_control_command(IA4421_FIFO_RESET_CMD);	send_control_command(IA4421_SYNCPATT_CMD);	send_control_command(IA4421_AFC_CMD);	transmitter_cont_cmd = set_tx(RF_DEV, rf_pwr);	send_control_command(transmitter_cont_cmd);	send_control_command(IA4421_PLLSET_CMD);	send_control_command(IA4421_WTC_CMD);	send_control_command(IA4421_LOWDUTYCCL_CMD);	send_control_command(IA4421_LBD_CMD);	ia4421_status_read();}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  void ia4221_enable_pa(void)  +  + DESCRIPTION:    Turn on the power amplifier of the IA4421   +  +	INPUT:			None  +  + RETURN:         None  +  + NOTES:          None  +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_enable_tx(void){	//enable the crystal, synthesizer, PA and disable the uCLK output	send_control_command(IA4421_POWERMAN_CMD | 0x0020);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  void ia4421_enable_rx(void)  +  + DESCRIPTION:    Enable the receiver chain of IA4421   +  +	INPUT:			None  +  + RETURN:         None  +  + NOTES:          None  +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_enable_rx(void){	//disable TX and RX    send_control_command(IA4421_POWERMAN_CMD);      				//reset FIFO    send_control_command(IA4421_FIFO_RESET_CMD);    		//************************************************************************	send_control_command(IA4421_CONFIGSET_CMD | 0x0040);	//************************************************************************				   				//enable receiver    send_control_command(IA4421_POWERMAN_CMD | 0x0080); 	//enable FIFO synchron latch    send_control_command(IA4421_FIFO_RESET_CMD | 0x0002);	//read status to releaze all IT flags	ia4421_status_read();	RxPacketLen = 0;	RxPacketPtr = 0;	//initialize state machine	RxState = sWaitForLength;}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  uint8 Receive_packet(void)  +  + DESCRIPTION:    Try to receive bytes in FIFO mode   +  +	INPUT:			None  +  + RETURN:         PACKET_RECEIVED - a packet received correctly, RX stoped  + 				NODATA			- no incoming byte  +					DATA_RECEIVED	- next byte received	  +  + NOTES:             +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint8 Receive_packet(void){    static uint8 ch;      	        RF_NSEL = 0; 	                                                   // FFIT appears on SPI_SDI    if( RF_FFIT == 1 )                                 					// Read out the FIFO in case of FFIT    {       	//---- There is data in the RX FIFO       	       	RF_NFFS = 0;      		RF_NSEL = 1;		//Select FIFO into the SPI pins		//read one byte from the FIFO	    ch = spi_read_write_byte(0);		//packet receiving state machine		switch( RxState )		{			/*wait for the first byte: LENGTH*/			case sWaitForLength:				//check whether the length is correct or not	          	if( (ch > 0) && (ch < MAX_LENGTH) )                     	          	{//length is correct	             	RxPacketLen = ch;				 	//save the length byte				 	packet.name.header[LENGTH] = ch;										//next state					RxState = sReceivePayload;	          	}	          	else	          	{//length is incorrect, drop the packet, waits for a new packet	             	RF_NFFS = 1;                                    							 	//restart receiver				 	ia4421_enable_rx();	             	return NODATA;	          	}			break;			case sReceivePayload:				//save teh next byte of the payload	          	packet.name.payload[RxPacketPtr++] = ch;																//is the full packet received?	          	if(RxPacketPtr >= RxPacketLen)                           			          	{//packet is received					//disabe the receiver	             	send_control_command(IA4421_POWERMAN_CMD);      				             	RF_NFFS = 1;										return PACKET_RECEIVED;										}			break;		}		       	RF_NFFS = 1;		       	return DATA_RECEIVED;                                      		// next databyte received   	}   	else                                                           		// Read out the rest IT bits in case of no FFIT   	{      	//---- No data in the RX FIFO      	ch = spi_read_write_byte(0);      //read out the first byte of the status (5 out from 8 are the IRQ bits)      	return NODATA;   	}}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  void ia4421_get_received_payload(uint8 * sid, uint8 * did, uint8 * length, uint8 * payload)  +  + DESCRIPTION:    Get the payload of the received packet   +  +	INPUT:			None  +  +	RETURN:			*sid		- source address  +					*did		- destination address  +					*length		- length of the payload  +					*payload 	- payload of the packet  +  + NOTES:      	Call only if the Receive_packet() function returned  +					with PACKET_RECEIVED!        +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_get_received_payload(uint8 * length, uint8 * payload){		*length = packet.name.header[LENGTH];	memcpy(payload, packet.name.payload,(packet.name.header[LENGTH]));}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  uint16 ia4421_status_read(void)  +  + DESCRIPTION:    Read status word   +  +	INPUT:			None  +  + RETURN:         Status word  +  + NOTES:             +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 ia4421_status_read(void){		//read status 	return send_control_command(0x0000);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  void ia4421_send_packet(uint8 sid, uint8 did, uint8 length, uint8 * payload)  +  + DESCRIPTION:    Send a packet   +  +	INPUT:			length	 	- length of the payload  +					sid			- source ID  +					did			- destination ID  +					*payload 	- pointer to the payload of the packet  +  + RETURN:         None  +  + NOTES:             +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/void ia4421_send_packet(uint8 length, uint8 * payload){   	uint8 packet_length,i;      	//set the header of the packet		packet.name.header[0] = 0xAA;	packet.name.header[1] = 0xAA;   	packet.name.header[SYNCH_WORD_H] = 0x2D;		//synchron word   	packet.name.header[SYNCH_WORD_L] = 0xD4;	   	//set the length of the packet   	if( length > MAX_PAYLOAD_LENGTH ) 	{//if the length is longer than the buffer, then maximize it      	packet_length = MAX_PAYLOAD_LENGTH + HEADER_LENGTH + 2;      	packet.name.header[LENGTH] = MAX_PAYLOAD_LENGTH;	}   	else   	{      	packet_length = length + HEADER_LENGTH + 2;      	packet.name.header[LENGTH] = length;   	}		   	//set the payload of the packet 	memcpy(&packet.name.payload[0],payload,(packet.name.header[LENGTH]));		//enables the internal dataregister	send_control_command(IA4421_CONFIGSET_CMD | 0x0080);   	//start transmission    	send_control_command(IA4421_POWERMAN_CMD | 0x0020); //enable PA	   	//send the data			for(i=0;i<packet_length;i++)   	{    	//wait for the interrupt    	while( RF_NIRQ == 1);      	//send next byte    	send_control_command(TX_REGISTER_WRITE | packet._data[i]);			}   	//stop transmission   	send_control_command(IA4421_POWERMAN_CMD);	send_control_command(IA4421_CONFIGSET_CMD);	//release all IT   	ia4421_status_read();}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  uint16 set_frq(uint8 ch)  +  + DESCRIPTION:    Set the frequency channel   +  +	INPUT:			ch - channel number  +  + RETURN:         frequency setting command  +  + NOTES:             +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 set_frq(uint8 ch){  if( ch > FREQ_maxid )  {   ch = 0;  }  return (0xA000 + FREQ_start + ((uint16)ch * FREQ_step));}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  uint16 set_tx(uint8 dev,uint8 pwr)  +  + DESCRIPTION:    Set the deviation and the power    +  +	INPUT:			dev - deviation  +					pwr - power 	  +  + RETURN:         transmitter control command  +  + NOTES:     		set deviation (15 ... 240kHz) and relative output power: 0..7        +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 set_tx(uint8 dev, uint8 pwr)                                   // set deviation (15 ... 240kHz) and relative output power: 0..7{  if(dev < 15) dev = 15;  if(pwr > 7) pwr = 7;  if(dev == 255) dev = 90;  dev = dev / 15 - 1;  return(0x9800 + dev * 0x10 + 7 - pwr);}/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  +  + FUNCTION NAME:  uint16 set_dr(uint16 dr)  +  + DESCRIPTION:    Set the datarate   +  +	INPUT:			dr - datarate  +  + RETURN:         datarate command  +  + NOTES:    		set data rate (up to 32kbps)         +  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/uint16 set_dr(uint16 dr)                                             // set data rate (up to 32kbps){  		uint16 r;  		  	if(dr > 32000) dr = 32000;   	if(dr < 2700)  	{    	dr *= 8;    	dr /= 100;    	r = (3448 + dr / 2) / dr - 1;    	return(0xC680 + r);  	}	else  	{    	dr /= 100;    	r = (3448 + dr / 2) / dr - 1;		return(0xC600 + r);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -