si4431程序示例Word版

上传人:每**** 文档编号:57095934 上传时间:2022-02-23 格式:DOC 页数:12 大小:45.50KB
收藏 版权申诉 举报 下载
si4431程序示例Word版_第1页
第1页 / 共12页
si4431程序示例Word版_第2页
第2页 / 共12页
si4431程序示例Word版_第3页
第3页 / 共12页
资源描述:

《si4431程序示例Word版》由会员分享,可在线阅读,更多相关《si4431程序示例Word版(12页珍藏版)》请在装配图网上搜索。

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口的输入,数出的寄存

5、器#define 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;voi

6、d rx_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

8、.reach_1s = 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|0x

9、80, SI4432_PWRSTATE_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 time

10、r_init(void)T1CON = 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

11、_50hz=0; Flag.reach_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(0

12、x03,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); / 负载电容= 12Pspi_rw(0x0a|0x80, 0x05);/ 关闭低频输出spi_rw(0x0b|0x80, 0xea); / GPIO 0 当做普通输出口spi_rw(0x0c|0x80, 0xea); /GPIO 1 当做普通输出口spi_rw(0x0d

13、|0x80, 0xf4); / /GPIO 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|0x

14、80, 0x04); /spi_rw(0x2a|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的Pream

15、blespi_rw(0x35|0x80, 0x20); / 需要检测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个字节的

16、数据spi_rw(0x3f|0x80, s); / 需要校验的头码为:”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

17、_rw(0x7a|0x80, 0x0); / 不需要跳频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,

18、 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模块收到整包数据

19、后,产生中断ItStatus1 = spi_rw(0x03,0x00);/清掉现有的中断标志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); / 清发射,接收缓

20、冲区spi_rw(0x34|0x80, 40); / 发射40个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|0x8

21、0, 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 发射完成,进入接收模式unsigned char spi_byte(unsigned char data)unsigned ch

22、ar i;for (i = 0; i 8; i+)/ 控制SCK 和 SDI,发射一个字节的命令,同事读取1个字节的数据/ 没有包括nSEL的控制if (data & 0x80)SDI = 1;elseSDI = 0;data = 1;SCK = 1;if (SDO)data |= 0x01;推荐精选elsedata &= 0xfe;SCK = 0;return (data);/-unsigned char spi_rw(unsigned char addr, unsigned char data)unsigned char i;SCK = 0;nSEL = 0;for (i = 0; i 8; i+) if (addr & 0x80)SDI = 1;elseSDI = 0;addr = 1;SCK = 1;asm(NOP);SCK = 0;for (i = 0; i 8; i+) if (data & 0x80)SDI = 1;elseSDI = 0;data = 1;SCK = 1;if (SDO)data |= 0x01;elsedata &= 0xfe;SCK = 0;nSEL = 1;SCK = 1;推荐精选return (data); (注:可编辑下载,若有不当之处,请指正,谢谢!) 推荐精选

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!