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

📄 si4432.c

📁 Si4432资料
💻 C
字号:
#include "si4432.h"

void Si4432_Init(void)
{
	uchar i=0;
	//SW reset    
	SpiWriteRegister(0x07, 0x80);
	while (nIRQ == 1);
 	i=SpiReadRegister(0x03);		       // 清RF模块中断	
	i=SpiReadRegister(0x04);
	//Set the physical parameters
	//Frequency:       433MHz
	//Modulation type: GFSK	  PH_FIFO
	//CrytalTolerance: Rx,10ppm; Tx, 10ppm
	//Data rate:       Default data rate: 1.2kbps	BE:42.7
	//AFC:             Enable
	//Frequency deviation: 20KHz
	//set the center frequency to 433 MHz

	SpiWriteRegister(0x75, 0x53);//write data to the Frequency Band Select register             
	SpiWriteRegister(0x76, 0x4B);//write data to the Nominal Carrier Frequency1 register
	SpiWriteRegister(0x77, 0x00); //write data to the Nominal Carrier Frequency0 register


	SpiWriteRegister(0x6D, 0x1F);//write 0x1F to the TX Power register 						
	SpiWriteRegister(0x34, 0x0C);//write 0x14 to the Preamble Length register 	

	//set preamble detection threshold to 20bits
	SpiWriteRegister(0x35, 0x2A); 															//write 0x2A to the Preamble Detection Control  register

	//Disable header bytes; set variable packet length (the length of the payload is defined by the
	//received packet length field of the packet); set the synch word to two bytes long
	SpiWriteRegister(0x33, 0x02);															//write 0x02 to the Header Control2 register    
	
	//Set the sync word pattern to 0x2DD4
	SpiWriteRegister(0x36, 0x2D);															//write 0x2D to the Sync Word 3 register
	SpiWriteRegister(0x37, 0xD4);															//write 0xD4 to the Sync Word 2 register

	//enable the TX & RX packet handler and CRC-16 (IBM) check
	SpiWriteRegister(0x30, 0x8D);															//write 0x8D to the Data Access Control register
	//Disable the receive header filters
   	SpiWriteRegister(0x32, 0x00 );															//write 0x00 to the Header Control1 register            

	//enable FIFO mode and GFSK modulation
	SpiWriteRegister(0x71, 0x63);															//write 0x63 to the Modulation Mode Control 2 register
												

   	SpiWriteRegister(0x0B, 0xCA);															//Set GPIO0 output
   	SpiWriteRegister(0x0C, 0xCA);															//Set GPIO1 output
   	SpiWriteRegister(0x0D, 0xCA);															//Set GPIO2 output

	//Set Crystal Oscillator Load Capacitance register, the user should change the value of this register while use different crystal.
	SpiWriteRegister(0x09, 0xB8);
	

	SpiWriteRegister(0x6E, 0x09);															//write data to the TXDataRate 1 register
	SpiWriteRegister(0x6F, 0xD5);															//write data to the TXDataRate 0 register
	SpiWriteRegister(0x58, 0x80);
	SpiWriteRegister(0x55, 0x14);//温度校正
	//set the Tx deviation register (+-20kHz)
	SpiWriteRegister(0x72, 0x20);															//write data to the Frequency Deviation register 

	SpiWriteRegister(0x70, 0x2f);															//write data to the Modulation Mode Control 1 register

	/*set the modem parameters according to the exel calculator(parameters: 1.2 kbps, deviation: 20 kHz*/
	SpiWriteRegister(0x1C, 0x2C);															//write data to the IF Filter Bandwidth register		
	SpiWriteRegister(0x20, 0xa1);															//write data to the Clock Recovery Oversampling Ratio register		
	SpiWriteRegister(0x21, 0x20);															//write data to the Clock Recovery Offset 2 register		
	SpiWriteRegister(0x22, 0x27);															//write data to the Clock Recovery Offset 1 register		
	SpiWriteRegister(0x23, 0x52);															//write data to the Clock Recovery Offset 0 register		
	SpiWriteRegister(0x24, 0x00);															//write data to the Clock Recovery Timing Loop Gain 1 register		
	SpiWriteRegister(0x25, 0x15);															//write data to the Clock Recovery Timing Loop Gain 0 register		
	SpiWriteRegister(0x1D, 0x44);															//write data to the AFC Loop Gearshift Override register		
	SpiWriteRegister(0x1E, 0x0A);
	SpiWriteRegister(0x2A, 0x1e);															//write data to the AFC Limiter register		
	SpiWriteRegister(0x1F, 0x03);
	SpiWriteRegister(0x69, 0x60);											
}
void Rec_data(uchar *p)
{
	uchar xdata length,i;
	SpiWriteRegister(0x07, SI4432_PWRSTATE_READY);//进入准备状态
	i=SpiReadRegister(0x04);
	i=SpiReadRegister(0x03);
	if( (i & 0x01) == 0x01 )
	{
   		SpiWriteRegister(0x08, 0x02);										
	    SpiWriteRegister(0x08, 0x00);
		length=0;
		*p=length;										
	}
	else if( (i & 0x02) == 0x02 )
	{
		length = SpiReadRegister(0x4B);
		*p=length;										
		{
			for(i=0;i< length;i++)
			{
				*(p+i+1) = SpiReadRegister(0x7F);
			}
		}
	}											
}
 void Si4432_RX(void)
{	
	uchar xdata i;
	SpiWriteRegister(0x07, SI4432_PWRSTATE_READY);	//进入 Ready 模式
	SpiWriteRegister(0x55,0x1e);//强制校正

	TX0_RX1;		// 设置天线开关
	
	SpiWriteRegister(0x08, 0x03);  //清发射,接收缓冲区
	SpiWriteRegister(0x08, 0x00);  //清发射,接收缓冲区
		
	SpiWriteRegister(0x07,SI4432_PWRSTATE_RX );  // RF 模块进入接收模式
	
	SpiWriteRegister(0x05,0x03);  // RF模块收到整包数据后,产生中断
	SpiWriteRegister(0x06,0x00);	
	i = SpiReadRegister(0x03);											//read the Interrupt Status1 register
	i = SpiReadRegister(0x04);		
}	
void Si4432_TX(uchar *p)
{
	uchar xdata i;

	SpiWriteRegister(0x07, SI4432_PWRSTATE_READY);	// rf 模块进入Ready 模式
	SpiWriteRegister(0x55,0x1e);//强制校正
	TX1_RX0;		//设置天线开关的方向
	SpiWriteRegister(0x08, 0x03);  // 
	SpiWriteRegister(0x08, 0x00);  // 清发射,接收缓冲区

	SpiWriteRegister(0x3e, 8);  // 总共发射8个字节的数据 包设置时用
 	// 将要发射的数据载入缓冲区
	SpiWriteRegister_Double(0x7f,p,8);

	SpiWriteRegister(0x05,0x04);	            // 整包数据发射完后,产生中断
	SpiWriteRegister(0x06,0x00);
	i = SpiReadRegister(0x03);											//read the Interrupt Status1 register
	i = SpiReadRegister(0x04);
	SpiWriteRegister(0x07, SI4432_PWRSTATE_TX); // 进入发射模式
	EA=0;
	TX=0;
	while(nIRQ==1);		// 等待中断
	i = SpiReadRegister(0x03);											//read the Interrupt Status1 register
	i = SpiReadRegister(0x04);	
	EA=1;	 
	TX=1;
}
void _sent(uchar number)
{
	uchar i=0;
	for(i=0;i<8;i++)
	{
		SCLK=0;
		delay_us(1);
		if(number&0x80)SDI=1;
			else SDI=0;
		SCLK=1;
		delay_us(1);
		number<<=1;
	}	
}
void SpiWriteRegister(uchar reg, uchar value)
{
	nSEL=0;//预备
	
	reg|=0x80;//1是写
	_sent(reg);//发送地址。
	_sent(value);//发送数据。
	nSEL=1;                          
}

uchar SpiReadRegister(uchar reg)
{
	uchar i=0,Tem=0;
	nSEL=0;//预备

	reg &=0x7f;//0是读
	_sent(reg);//发送地址。
	
	for(i=0;i<8;i++)//读信号
	{
		SCLK = 0;
		delay_us(1);
		SCLK = 1;
		delay_us(1);
		Tem<<=1;
		if(SDO==1)Tem|=0x01;
			else Tem&=0xfe;
	}
	nSEL=1;
	return (Tem);
}
void SpiWriteRegister_Double(uchar reg,uchar *number,uchar n)
{
	uchar i=0;
	nSEL=0;//预备
	
	reg|=0x80;//1是写
	_sent(reg);//发送地址
	
	for(i=0;i<n;i++)
	{
		reg=*(number+i);
		_sent(reg);//发送数据。	
	}
	nSEL=1;
}
void SpiReadRegister_Double(uchar reg,uchar *number,uchar n)
{
	uchar i=0,j=0,Tem=0;
	nSEL=0;//预备
	
	reg&=0x7f;//0是读
	_sent(reg);//发送地址。

	for(j=0;j<n;j++)
	{
		for(i=0;i<8;i++)//读信号
		{
			SCLK = 0;
			delay_us(1);
			SCLK = 1;
			delay_us(1);
			Tem<<=1;
			if(SDO==1)Tem|=0x01;
				else Tem&=0xfe;
		}		
		*(number+j)=Tem;
	}
	nSEL=1;
}
void delay_us(uchar i)
{
	uchar j;
	for(;i<20;i++)for(j=0;j<10;j++);
}





⌨️ 快捷键说明

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