si4431程序示例[精校版本]_第1页
si4431程序示例[精校版本]_第2页
si4431程序示例[精校版本]_第3页
si4431程序示例[精校版本]_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/ 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 : Microchip high p

2、erformance 8 bit MCU :PIC16F689#include#includeconst unsigned char tx_test_data10 = 0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x6d; / 每秒发射的固定内容的测试信号,第10个数据是前9个数据的校验和#define SI4432_PWRSTATE_READY01/ 模块 Ready 状态定义#define SI4432_PWRSTATE_TX0x09/ 模块 发射状态定义#define SI4432_PWRSTATE_RX05/ 模块 接收状态定义#defin

3、e SI4432_PACKET_SENT_INTERRUPT04/ 模块 发射完成中断#define SI4432_Rx_packet_received_interrupt 0x02 / 模块 收到数据包中断#define TX1_RX0spi_rw(0x0e|0x80, 0x01)/ 发射状态的天线开关定义#define TX0_RX1spi_rw(0x0e|0x80, 0x02)/ 接收状态的天线开关定义#define TX0_RX0spi_rw(0x0e|0x80, 0x00) / 非发射,接收状态的天线开关定义#define nIRQ RC0/ MCU 输入口#define SDO R

4、C1/ MCU 输入口#define nSELRC2/ MCU 输出口#define SDI RC3/ MCU 输出口#define SCKRC4/ MCU 输出口#define SDNRC5/ MCU 输出口#define nIRQ_setTRISC0/ 设置IO口的输入,数出的寄存器#define SDO_setTRISC1/ 设置IO口的输入,数出的寄存器#define nSEL_setTRISC2/ 设置IO口的输入,数出的寄存器#define SDI_setTRISC3/ 设置IO口的输入,数出的寄存器#define SCK_setTRISC4/ 设置IO口的输入,数出的寄存器#de

5、fine SDN_setTRISC5/ 设置IO口的输入,数出的寄存器#define INPUT1#define OUTPUT0unsigned char count_50hz;unsigned char ItStatus1, ItStatus2;unsigned char rf_timeout;unsigned char rx_buf15;typedef struct unsigned char reach_1s: 1;unsigned char rf_reach_timeout: 1;unsigned char is_tx: 1;FlagType;FlagType Flag;void rx

6、_data(void);void tx_data(void);unsigned char spi_byte(unsigned char data);unsigned char spi_rw(unsigned char addr, unsigned char data);void SI4432_init(void);void delay_1ms(unsigned char time);void port_init(void); void timer_init(void);void main() unsigned char i, j, chksum;OSCCON = 0X70;/ 使用内部晶振,

7、8M crystalWDTCON = 0X00; / 看门狗设置port_init(); / IO 口初始化 SDN = 1; delay_1ms(10);/ RF 模块复位 SDN = 0; delay_1ms(200);/ 延时150ms RF 模块进入工作状态 SI4432_init(); / RF 模块初始化 TX0_RX0;/ 天线开关不在发射,接收状态 timer_init();count_50hz = 0;Flag.reach_1s = 0;INTCON = 0xc0; / enable interruptwhile(1)if(Flag.reach_1s)Flag.reach_1

8、s = 0;tx_data();/ 每间隔一段时间,发射一包数据,并接收 Acknowledge 信号if(!Flag.is_tx)if(!nIRQ) ItStatus1 = spi_rw(0x03,0x00);/ 清中断/read the Interrupt Status1 registerItStatus2 = spi_rw(0x04,0x00);/ 清中断SCK = 0;nSEL = 0;spi_byte(0x7f);/ 从缓冲区读数据for(i = 0;i10;i+)rx_bufi = spi_byte(0x00);nSEL = 1;spi_rw(0x07|0x80, SI4432_P

9、WRSTATE_READY);/ 数据接收完成,退出接收模式,chksum = 0;for(i=0;i9;i+)/ 计算Checksum chksum += rx_bufi; if( chksum = rx_buf9 )&( rx_buf0 = 0x41 ) ; / 数据收到了 else rx_data(); / 收到的数据不对,则要继续开始接收 void delay_1ms(unsigned char time)unsigned char i,k;for(k = 0; k time; k+)for(i = 0; i130; i+)NOP();void timer_init(void)T1CO

10、N = 0x31; TMR1IE = 1;TMR1L = 0x78; /定时器中断初始化TMR1H = 0xec;void interrupt ISR_timer(void) unsigned char i;if(TMR1IF) TMR1L = 0x78;/ 20ms 的定时器 TMR1H = 0xec;rf_timeout+;if(rf_timeout = 25)Flag.rf_reach_timeout = 1;/ 发射0.5秒,接收3秒的Timeout定时器,发射,接收共用此Ramcount_50hz+; if(count_50hz=50) / count_50hz=0; Flag.re

11、ach_1s = 1;/一秒 的定时器 TMR1IF=0; void port_init(void) ANSEL = 0; ANSELH = 0;/ 不使用的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;void SI4432_init(void)ItStatus1 = spi_rw(0x03,0x00);/ 清RF模块中断I

12、tStatus2 = spi_rw(0x04,0x00);spi_rw(0x06|0x80, 0x00); / 关闭不需要的中断spi_rw(0x07|0x80, SI4432_PWRSTATE_READY); / 进入 Ready 模式 spi_rw(0x09|0x80, 0x7f); / 负载电容= 12Pspi_rw(0x0a|0x80, 0x05);/ 关闭低频输出spi_rw(0x0b|0x80, 0xea); / GPIO 0 当做普通输出口spi_rw(0x0c|0x80, 0xea); /GPIO 1 当做普通输出口spi_rw(0x0d|0x80, 0xf4); / /GPI

13、O 2 输出收到的数据spi_rw(0x70|0x80, 0x2c); spi_rw(0x1d|0x80, 0x40); / 使能 afc/ 1.2K bps settingspi_rw(0x1c|0x80, 0x16);/ 下面的设置根据Silabs 的Excelspi_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|

14、0x80, 0x14);spi_rw(0x6e|0x80, 0x09);spi_rw(0x6f|0x80, 0xd5);/1.2K bps setting endspi_rw(0x30|0x80, 0x8c); / 使能PH+ FIFO模式,高位在前面,使能CRC校验 spi_rw(0x32|0x80, 0xff); / byte0, 1,2,3 作为头码 spi_rw(0x33|0x80, 0x42);/ byte 0,1,2,3 是头码,同步字3,2 是同步字spi_rw(0x34|0x80, 16); / 发射16个Nibble的Preamblespi_rw(0x35|0x80, 0x2

15、0); / 需要检测4个nibble的Preamblespi_rw(0x36|0x80, 0x2d); / 同步字为 0x2dd4spi_rw(0x37|0x80, 0xd4);spi_rw(0x38|0x80, 0x00);spi_rw(0x39|0x80, 0x00);spi_rw(0x3a|0x80, s); / 发射的头码为: “swwxspi_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); / 需要

16、校验的头码为:”swwxspi_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); / 不需要跳频

17、spi_rw(0x71|0x80, 0x22); / 发射不需要 CLK,FiFo , FSK模式spi_rw(0x72|0x80, 0x30); / 频偏为 30KHzspi_rw(0x73|0x80, 0x0); / 没有频率偏差spi_rw(0x74|0x80, 0x0); / 没有频率偏差spi_rw(0x75|0x80, 0x53); / 频率设置 433.5spi_rw(0x76|0x80, 0x57); / spi_rw(0x77|0x80, 0x80); void rx_data(void)unsigned char i, chksum;Flag.is_tx = 0;spi_r

18、w(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,0x

19、00);/清掉现有的中断标志ItStatus2 = spi_rw(0x04,0x00);/清掉现有的中断标志void tx_data(void)unsigned char i;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个

20、Nibble 的前导码spi_rw(0x3e|0x80, 10); / 总共发射10个字节的数据 for (i = 0; i10; i+)spi_rw(0x7f|0x80, tx_test_datai); / 将要发射的数据载入缓冲区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模块工作不正常,重新复位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论