📄 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 + -