si4431程序示例.docx
《si4431程序示例.docx》由会员分享,可在线阅读,更多相关《si4431程序示例.docx(14页珍藏版)》请在冰豆网上搜索。
![si4431程序示例.docx](https://file1.bdocx.com/fileroot1/2022-12/16/c26f0a82-c3a0-4625-95f2-41992ec1f197/c26f0a82-c3a0-4625-95f2-41992ec1f1971.gif)
si4431程序示例
//Demo程序适用范围:
Si4431F13,Si4432F20,Si4431F27
//RF模块的参数设置为:
FSK,433.5MHz,1.2KBPS,+/-10PPM,频偏:
30KHz,调制带宽:
61.2KHz
//使能AFC,使能CRC,PH+FIFO模式
//每秒钟发射的固定测试数据为:
0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d,
//0x6d=(0x41+0x42+0x43+0x44+0x45+0x46+0x47+0x48+0x49)
//MCU:
Microchiphighperformance8bitMCU:
PIC16F689
#include
#include
constunsignedchartx_test_data[10]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d};//每秒发射的固定内容的测试信号,第10个数据是前9个数据的校验和
#defineSI4432_PWRSTATE_READY01//模块Ready状态定义
#defineSI4432_PWRSTATE_TX0x09//模块发射状态定义
#defineSI4432_PWRSTATE_RX05//模块接收状态定义
#defineSI4432_PACKET_SENT_INTERRUPT04//模块发射完成中断
#defineSI4432_Rx_packet_received_interrupt0x02//模块收到数据包中断
#defineTX1_RX0spi_rw(0x0e|0x80,0x01)//发射状态的天线开关定义
#defineTX0_RX1spi_rw(0x0e|0x80,0x02)//接收状态的天线开关定义
#defineTX0_RX0spi_rw(0x0e|0x80,0x00)//非发射,接收状态的天线开关定义
#definenIRQRC0//MCU输入口
#defineSDORC1//MCU输入口
#definenSELRC2//MCU输出口
#defineSDIRC3//MCU输出口
#defineSCKRC4//MCU输出口
#defineSDNRC5//MCU输出口
#definenIRQ_setTRISC0//设置IO口的输入,数出的寄存器
#defineSDO_setTRISC1//设置IO口的输入,数出的寄存器
#definenSEL_setTRISC2//设置IO口的输入,数出的寄存器
#defineSDI_setTRISC3//设置IO口的输入,数出的寄存器
#defineSCK_setTRISC4//设置IO口的输入,数出的寄存器
#defineSDN_setTRISC5//设置IO口的输入,数出的寄存器
#defineINPUT1
#defineOUTPUT0
unsignedcharcount_50hz;
unsignedcharItStatus1,ItStatus2;
unsignedcharrf_timeout;
unsignedcharrx_buf[15];
typedefstruct
{
unsignedcharreach_1s:
1;
unsignedcharrf_reach_timeout:
1;
unsignedcharis_tx:
1;
}FlagType;
FlagTypeFlag;
voidrx_data(void);
voidtx_data(void);
unsignedcharspi_byte(unsignedchardata);
unsignedcharspi_rw(unsignedcharaddr,unsignedchardata);
voidSI4432_init(void);
voiddelay_1ms(unsignedchartime);
voidport_init(void);
voidtimer_init(void);
voidmain()
{
unsignedchari,j,chksum;
OSCCON=0X70;//使用内部晶振,8Mcrystal
WDTCON=0X00;//看门狗设置
port_init();//IO口初始化
SDN=1;
delay_1ms(10);//RF模块复位
SDN=0;
delay_1ms(200);//延时150msRF模块进入工作状态
SI4432_init();//RF模块初始化
TX0_RX0;//天线开关不在发射,接收状态
timer_init();
count_50hz=0;
Flag.reach_1s=0;
INTCON=0xc0;//enableinterrupt
while
(1)
{
if(Flag.reach_1s)
{
Flag.reach_1s=0;
tx_data();//每间隔一段时间,发射一包数据,并接收Acknowledge信号
}
if(!
Flag.is_tx)
{
if(!
nIRQ)
{
ItStatus1=spi_rw(0x03,0x00);//清中断//readtheInterruptStatus1register
ItStatus2=spi_rw(0x04,0x00);//清中断
SCK=0;
nSEL=0;
spi_byte(0x7f);//从缓冲区读数据
for(i=0;i<10;i++)
{
rx_buf[i]=spi_byte(0x00);
}
nSEL=1;
spi_rw(0x07|0x80,SI4432_PWRSTATE_READY);//数据接收完成,退出接收模式,
chksum=0;
for(i=0;i<9;i++)//计算Checksum
chksum+=rx_buf[i];
if((chksum==rx_buf[9])&&(rx_buf[0]==0x41))
{
;//数据收到了
}
else
{
rx_data();//收到的数据不对,则要继续开始接收
}
}
}
}
}
voiddelay_1ms(unsignedchartime)
{
unsignedchari,k;
for(k=0;k