si4431程序示例.docx

上传人:b****4 文档编号:5403912 上传时间:2022-12-16 格式:DOCX 页数:14 大小:18.38KB
下载 相关 举报
si4431程序示例.docx_第1页
第1页 / 共14页
si4431程序示例.docx_第2页
第2页 / 共14页
si4431程序示例.docx_第3页
第3页 / 共14页
si4431程序示例.docx_第4页
第4页 / 共14页
si4431程序示例.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

si4431程序示例.docx

《si4431程序示例.docx》由会员分享,可在线阅读,更多相关《si4431程序示例.docx(14页珍藏版)》请在冰豆网上搜索。

si4431程序示例.docx

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

{

for(i=0;i<130;i++)

{

NOP();

}

}

}

voidtimer_init(void)

{

T1CON=0x31;

TMR1IE=1;

TMR1L=0x78;//定时器中断初始化

TMR1H=0xec;

}

voidinterruptISR_timer(void)

{

unsignedchari;

if(TMR1IF)

{

TMR1L=0x78;//20ms的定时器

TMR1H=0xec;

rf_timeout++;

if(rf_timeout==25)

{

Flag.rf_reach_timeout=1;//发射0.5秒,接收3秒的Timeout定时器,发射,接收共用此Ram

}

count_50hz++;

if(count_50hz==50)//

{

count_50hz=0;

Flag.reach_1s=1;//一秒的定时器

}

TMR1IF=0;

}

}

voidport_init(void)

{

ANSEL=0;

ANSELH=0;//不使用MCU的AD

WPUA=0;//没有上拉电阻

IOCA=0;//没有IO口中断

nIRQ_set=INPUT;

SDO_set=INPUT;

nSEL_set=OUTPUT;

SDI_set=OUTPUT;

SCK_set=OUTPUT;

SDN_set=OUTPUT;

TRISB5=OUTPUT;

}

voidSI4432_init(void)

{

ItStatus1=spi_rw(0x03,0x00);//清RF模块中断

ItStatus2=spi_rw(0x04,0x00);

spi_rw(0x06|0x80,0x00);//关闭不需要的中断

spi_rw(0x07|0x80,SI4432_PWRSTATE_READY);//进入Ready模式

spi_rw(0x09|0x80,0x7f);//负载电容=12P

spi_rw(0x0a|0x80,0x05);//关闭低频输出

spi_rw(0x0b|0x80,0xea);//GPIO0当做普通输出口

spi_rw(0x0c|0x80,0xea);//GPIO1当做普通输出口

spi_rw(0x0d|0x80,0xf4);///GPIO2输出收到的数据

spi_rw(0x70|0x80,0x2c);

spi_rw(0x1d|0x80,0x40);//使能afc

//1.2Kbpssetting

spi_rw(0x1c|0x80,0x16);//下面的设置根据Silabs的Excel

spi_rw(0x20|0x80,0x83);

spi_rw(0x21|0x80,0xc0);//

spi_rw(0x22|0x80,0x13);//

spi_rw(0x23|0x80,0xa9);//

spi_rw(0x24|0x80,0x00);//

spi_rw(0x25|0x80,0x04);//

spi_rw(0x2a|0x80,0x14);

spi_rw(0x6e|0x80,0x09);

spi_rw(0x6f|0x80,0xd5);

//1.2Kbpssettingend

spi_rw(0x30|0x80,0x8c);//使能PH+FIFO模式,高位在前面,使能CRC校验

spi_rw(0x32|0x80,0xff);//byte0,1,2,3作为头码

spi_rw(0x33|0x80,0x42);//byte0,1,2,3是头码,同步字3,2是同步字

spi_rw(0x34|0x80,16);//发射16个Nibble的Preamble

spi_rw(0x35|0x80,0x20);//需要检测4个nibble的Preamble

spi_rw(0x36|0x80,0x2d);//同步字为0x2dd4

spi_rw(0x37|0x80,0xd4);

spi_rw(0x38|0x80,0x00);

spi_rw(0x39|0x80,0x00);

spi_rw(0x3a|0x80,'s');//发射的头码为:

“swwx"

spi_rw(0x3b|0x80,'w');

spi_rw(0x3c|0x80,'w');

spi_rw(0x3d|0x80,'x');

spi_rw(0x3e|0x80,10);//总共发射10个字节的数据

spi_rw(0x3f|0x80,'s');//需要校验的头码为:

”swwx"

spi_rw(0x40|0x80,'w');

spi_rw(0x41|0x80,'w');

spi_rw(0x42|0x80,'x');

spi_rw(0x43|0x80,0xff);//头码1,2,3,4的所有位都需要校验

spi_rw(0x44|0x80,0xff);//

spi_rw(0x45|0x80,0xff);//

spi_rw(0x46|0x80,0xff);//

spi_rw(0x6d|0x80,0x07);//设置为最大功率发射

spi_rw(0x79|0x80,0x0);//不需要跳频

spi_rw(0x7a|0x80,0x0);//不需要跳频

spi_rw(0x71|0x80,0x22);//发射不需要CLK,FiFo,FSK模式

spi_rw(0x72|0x80,0x30);//频偏为30KHz

spi_rw(0x73|0x80,0x0);//没有频率偏差

spi_rw(0x74|0x80,0x0);//没有频率偏差

spi_rw(0x75|0x80,0x53);//频率设置433.5

spi_rw(0x76|0x80,0x57);//

spi_rw(0x77|0x80,0x80);

}

voidrx_data(void)

{

unsignedchari,chksum;

Flag.is_tx=0;

spi_rw(0x07|0x80,SI4432_PWRSTATE_READY);//进入Ready模式

delay_1ms(5);//

TX0_RX1;//设置天线开关

spi_rw(0x08|0x80,0x03);//清发射,接收缓冲区

spi_rw(0x08|0x80,0x00);//清发射,接收缓冲区

spi_rw(0x07|0x80,SI4432_PWRSTATE_RX);//RF模块进入接收模式

spi_rw(0x05|0x80,SI4432_Rx_packet_received_interrupt);//RF模块收到整包数据后,产生中断

ItStatus1=spi_rw(0x03,0x00);//清掉现有的中断标志

ItStatus2=spi_rw(0x04,0x00);//清掉现有的中断标志

}

voidtx_data(void)

{

unsignedchari;

Flag.is_tx=1;

spi_rw(0x07|0x80,SI4432_PWRSTATE_READY);//rf模块进入Ready模式

TX1_RX0;//设置天线开关的方向

delay_1ms(5);//延时5ms,让系统稳定

spi_rw(0x08|0x80,0x03);//

spi_rw(0x08|0x80,0x00);//清发射,接收缓冲区

spi_rw(0x34|0x80,40);//发射40个Nibble的前导码

spi_rw(0x3e|0x80,10);//总共发射10个字节的数据

for(i=0;i<10;i++)

{

spi_rw(0x7f|0x80,tx_test_data[i]);//将要发射的数据载入缓冲区

}

spi_rw(0x05|0x80,SI4432_PACKET_SENT_INTERRUPT);//整包数据发射完后,产生中断

ItStatus1=spi_rw(0x03,0x00);//清RF模块中断

ItStatus2=spi_rw(0x04,0x00);

spi_rw(0x07|0x80,SI4432_PWRSTATE_TX);//进入发射模式

rf_timeout=0;

Flag.rf_reach_timeout=0;

while(nIRQ)//等待中断

{

if(Flag.rf_reach_timeout)

{

SDN=1;//如果0.5秒还没有中断,则RF模块工作不正常,重新复位并初始化模块

delay_1ms(10);

SDN=0;

delay_1ms(200);

SI4432_init();

break;//则强制跳出

}

}

rx_data();//rf发射完成,进入接收模式

}

unsignedcharspi_byte(unsignedchardata)

{

unsignedchari;

for(i=0;i<8;i++)//控制SCK和SDI,发射一个字节的命令,同事读取1个字节的数据

{//没有包括nSEL的控制

if(data&0x80)

SDI=1;

else

SDI=0;

data<<=1;

SCK=1;

if(SDO)

data|=0x01;

else

data&=0xfe;

SCK=0;

}

return(data);

}

//-------------------------------------------

unsignedcharspi_rw(unsignedcharaddr,unsignedchardata)

{

unsignedchari;

SCK=0;

nSEL=0;

for(i=0;i<8;i++)

{

if(addr&0x80)

SDI=1;

else

SDI=0;

addr<<=1;

SCK=1;

asm("NOP");

SCK=0;

}

for(i=0;i<8;i++)

{

if(data&0x80)

SDI=1;

else

SDI=0;

data<<=1;

SCK=1;

if(SDO)

data|=0x01;

else

data&=0xfe;

SCK=0;

}

nSEL=1;

SCK=1;

return(data);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1