找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23953|回复: 57
收起左侧

分享调试SI4432的一些经验和程序

  [复制链接]
ID:82008 发表于 2015-6-4 14:12 | 显示全部楼层 |阅读模式
本帖最后由 huyun 于 2015-6-4 14:13 编辑

最近想做无线遥控,选用SI4432这个模块,因为这个芯片需要配置的寄存器比较多,调试的时候遇到了很多困难,在网上搜索了很久没找到几篇好的文章。曾多方求助,经过几天的努力终于将该模块调试成功。在此随笔写些调试的主要步骤希望给其他开始学SI4432的人一些帮助。另外,本人菜鸟一枚,写这篇文章目的在于避免其他新手像我一样无助,请大家多提宝贵意见,共同进步!欢迎转载。
    好了,开始。
    一、无线模块选型。
    根据无线通讯的频段,平常用的无线模块主要有315MHZ,433MHZ,2.4GHZ。2.4G最近貌似比较火,像24L01,好多开发板上都配这一款芯片。433MHZ频段的模块常用的有NRF905、CC1101、SI4432。在315MHZ频段好像做普通的遥控器比较多,像超外差模块。
   本人想做无线通信,选择在2.4GHZ和433MHZ之间。说下区别,2.4G无线通信频率高、波长短、传输速率高、绕射能力差、通信距离短。网上卖的模块不加功率放大也就是一百米以内。433MHZ无线通信频率低、波长较长、传输速率低、绕射能力强、通信距离远。价格和2.4GHZ模块相当,但是距离一般在几百米甚至更远,据说加上功率放大可达一两千米。本人想用来遥控智能车,通信数据量不大,但是想让距离远一点。所以选择433MHZ模块,具体型号是SI4432。
   二、初次接触SI4432   
    该芯片价格低、传输距离远,网上用的人挺多的。曾经找过一些资料发现很多商业上的无线通信也是用这一款。于是在网上买了一对,加运费一共四十多。没有广告嫌疑,感兴趣自己搜。买回来之后开始看相关的手册和例程。我嘞个去,需要配置的寄存器真多,而且通讯速率、频段、前导码、同步字等等都是自己定义的,大家写的都不一样。加上没有专业的知识,更是加大难度。 卖家配的资料室51的版本,说实话程序写的有点乱,主要是因为他们的程序是配套他们的开发板的,有很多都看不懂。而对于我们初学者而言,最需要的却是最简单的:简单收发就行。我使用的控制器型号:STM32F103RB。分析了很久慢慢移植到STM32里面,失败。多次修改,失败。在网上搜索,网上虽然用的人多,但是资料甚少。而且一般都是51单片机驱动的,而且是虚拟SPI!然后是几天的调试,不多说。
    经过几天的调试,终于成功,下面说下使用这款芯片的要点。
   三、SPI
    我用的控制芯片是STM32F103RB。SPI可以软件模拟,也可以用硬件的。再次,建议大家用硬件的SPI,稳定,减少CPU负担。
    配置硬件SPI要点:
        1、速率不要太高,SI4432手册上说不要大于10MHZ。
        2、MOSI、MOSO、SCK三个引脚配置为复用功能推挽输出。
        3、SPI的时钟极性配置为:同步时钟的空闲状态为
低电平
        4、SPI的时钟的第2个跳变沿数据被采样。(SPI_CPHA)
        5、片选信号软件控制,自己定义一个IO空控制片选吧,方便。
   四、硬件连接
    STM32和SI4432硬件连接,具体看模块吧。我简单说几个比较重要的
        1、SI4432的SDN引脚,为高时:芯片停止工作。为低时:芯片允许工作。
我买的模块里,这个引脚是被引出来的,别费劲了,直接接地,不要用IO口控制高低。高手略过。
        2、模块的引脚有些是2.54mm间距,有些是1.27mm。想DIY的朋友注意了,我当时就忘了结果买了个1.27mm的后来转接,麻烦了。
        3、尽量不要用杜邦线。
我开始一直用杜邦线连起来,但是经常在发送和接收的时候出错,初始化正常。后来用洞洞板连起来,正常。
      4、SI4432是3.3V供电,电源线和地线尽量和STM32的3.3V和地线连在一起。不然的话容易出错,水平有限,不解释,等高人。
     五、软件
调试
     1、SPI配置好以后,向SI4432写数据注意地址最高位置1。 如:SPI1_ReadWriteByte(addr|0x80)
    2、
配置好以后,向0X00、0X01、0X02地址读取,应该有返回值,具体看手册,如果和手册上的差不多就证明SPI通讯成功了。
     3、  
前导码个数。SI4432_WriteReg(0x34, 0X0A);  0x34是向SI4432写入前导码的地址,0X0A是个数,但是表示其一半,也就是5个字节。
   
4、刚开始,不要配置帧头。直接禁止    SI4432_WriteReg(0x32, 0x00 );// 禁止帧头
    5、SI4432有3个GPIO,一般自己是不用的,但是依然要配置,因为这个和模块相关。具体问卖家。
    6、SI4432主要三个状态:接收状态、发送状态、挂起状态。发送和接收之间可以相互转换、但是转换之前需要先进入挂起状态然后至少15ms之后再进入发送或者接收状态。程序while(1)之前最好开始就配置为挂起状态:SI4432_WriteReg(0x07, 0x01);
六、一定要多看官方的程序设计指南和芯片的手册,我会放到附件里。
    以上算是对SI4432的初步认识和注意事项。但是这些细节是比较重要的,因为像这样的无线模块最主要是先实现通讯,高级的功能慢慢调。
具体程序不再分析,我会放在附件里。STM32F103RB,库函数。测试多次,但是需要根据自己的模块进行调整。
  
快毕业了,事多,时间有限,具体看程序,多调试,多看手册。
   欢迎多提意见,欢迎转载。


下面是发送端源代码:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"         
  5. #include "spi.h"
  6. // 0321 注意1:SPI 空闲时为低电平,第二跳边沿生效                         //注意2:SDN直接接DGND算了
  7. //      注意3:SI4432和STM32要用同一个VCC3.3否则的话收到全为0
  8. #define        SI4432_NSEL   PAout(4)  //SI4432_NSEL  使能
  9. #define        SI4432_SDN    PCout(4)  //SI4432_SDN   使能
  10. #define        SI4432_NIRQ   PCin(5)  //SI4432_NIRQ  中断状态

  11. void SI4432_Init(void) ;
  12. u8  SI4432_ReadReg(u8  addr) ;
  13. void SI4432_WriteReg(u8 addr, u8 value) ;
  14.         unsigned char i;

  15. u8 ItStatus1,ItStatus2,res;
  16. int main(void)
  17. {         
  18.         delay_init();                     //延时函数初始化          
  19.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  20.         uart_init(9600);                 //串口初始化为9600
  21.         LED_Init();                             //LED端口初始化
  22.         SPI1_Init();
  23.         GPIOSet();

  24.         SI4432_NSEL=0;  
  25.         delay_ms(600);

  26.         res = SI4432_ReadReg(0x00);
  27.         delay_ms(20);   printf("res =%02x \n",(unsigned short)res );          
  28.         res = SI4432_ReadReg(0x01);
  29.         delay_ms(20);          printf("res =%02x \n",(unsigned short)res );
  30.         res = SI4432_ReadReg(0x02);
  31.         delay_ms(20);           printf("res =%02x \n",(unsigned short)res );  
  32.         delay_ms(1000);
  33. //读取中断状态          清除中断  释放         SI4432_NIRQ
  34.         ItStatus1 = SI4432_ReadReg(0x03);  
  35.         ItStatus2 = SI4432_ReadReg(0x04);                          
  36. //软件复位
  37.         SI4432_WriteReg(0x07, 0x80); //向0X07地址  写入0X80  软件复位
  38.          while ( SI4432_NIRQ == 1);      
  39.         //读取中断状态          清除中断  释放         SI4432_NIRQ
  40.         ItStatus1 = SI4432_ReadReg(0x03);  
  41.         ItStatus2 = SI4432_ReadReg(0x04);  
  42. /////////////////////////开始设置
  43. // 频率设置 434                       
  44.         SI4432_WriteReg(0x75, 0x53);  
  45.         SI4432_WriteReg(0x76, 0x64);  //
  46.         SI4432_WriteReg(0x77, 0x00);
  47. // 1.2K bps 发射速率       
  48.         SI4432_WriteReg(0x2a, 0x14);
  49.         SI4432_WriteReg(0x6e, 0x09);
  50.         SI4432_WriteReg(0x6f, 0xd5);
  51.         SI4432_WriteReg(0x70, 0x2c);//

  52. //SpiWriteRegister(0x72, 0x48);        //(9.6kbps)       
  53.     SI4432_WriteReg(0x72, 0x38);        //频率偏差(1.2kbps)       
  54. // 下面的设置根据Silabs 的Excel        (9.6 kbps, deviation: 45 kHz, channel filter BW: 102.2 kHz
  55.         SI4432_WriteReg(0x1C, 0x1b);                                                                                                                        //write 0x1E to the IF Filter Bandwidth register               
  56.         SI4432_WriteReg(0x20, 0x83);                                                                                                                        //write 0xD0 to the Clock Recovery Oversampling Ratio register               
  57.         SI4432_WriteReg(0x21, 0xc0);                                                                                                                        //write 0x00 to the Clock Recovery Offset 2 register               
  58.         SI4432_WriteReg(0x22, 0x13);                                                                                                                        //write 0x9D to the Clock Recovery Offset 1 register               
  59.         SI4432_WriteReg(0x23, 0xa9);                                                                                                                        //write 0x49 to the Clock Recovery Offset 0 register               
  60.         SI4432_WriteReg(0x24, 0x00);                                                                                                                        //write 0x00 to the Clock Recovery Timing Loop Gain 1 register               
  61.         SI4432_WriteReg(0x25, 0x03);                                                                                                                        //write 0x24 to the Clock Recovery Timing Loop Gain 0 register               
  62.         SI4432_WriteReg(0x1D, 0x40);                                                                                                                        //write 0x40 to the AFC Loop Gearshift Override register               
  63.         SI4432_WriteReg(0x1E, 0x0A);                                                                                                                        //write 0x0A to the AFC Timing Control register               
  64.         SI4432_WriteReg(0x2A, 0x14);                                                                                                                        //write 0x20 to the AFC Limiter register                               
  65. //前导码 同步字
  66.         SI4432_WriteReg(0x34, 0X0A);  // 发射5字节的Preamble
  67.         SI4432_WriteReg(0x35, 0x2A);  // 需要检测 Preamble                                                       
  68.         SI4432_WriteReg(0x33, 0x02);// 同步字3,2 是同步字
  69.         SI4432_WriteReg(0x36, 0x2d);  // 同步字为 0x2dd4
  70.         SI4432_WriteReg(0x37, 0xd4);
  71.         SI4432_WriteReg(0x30, 0x8D);   // 使能PH+ FIFO模式,高位在前面,使能CRC校验        CCITTT        
  72.     SI4432_WriteReg(0x32, 0x00 );//        禁止帧头
  73.         SI4432_WriteReg(0x71, 0x63); // 发射不需要 CLK,FiFo , FSK模式       

  74. //GPIO
  75.         SI4432_WriteReg(0x0b, 0x12); //  
  76.         SI4432_WriteReg(0x0c, 0x15); //
  77. //其他设置
  78.         SI4432_WriteReg(0x09, 0xD7);  //  负载电容
  79.         SI4432_WriteReg(0x69, 0x60);  //AGC过载         
  80. //发射功率
  81.         SI4432_WriteReg(0x6d, 0x1e);
  82. //手动打开接收
  83.         SI4432_WriteReg(0x07, 0x05);
  84. //打开 接收中断
  85.         SI4432_WriteReg(0x05, 0x03);
  86.         SI4432_WriteReg(0x06, 0x00);
  87. //清中断
  88.         ItStatus1 = SI4432_ReadReg(0x03);          //read the Interrupt Status1 register
  89.         ItStatus2 = SI4432_ReadReg(0x04);          //read the Interrupt Status2 register               
  90.         SI4432_WriteReg(0x07, 0x05);//打开接收       
  91.         SI4432_WriteReg(0x0d, 0xf4);//GPIO2接收数据
  92.                                
  93.         while(1)
  94.         {
  95.                 GPIO_SetBits(GPIOB , GPIO_Pin_10);//信号灯
  96.                 res = SI4432_ReadReg(0x02); delay_ms(20);printf("res =%02x \n",(unsigned short)res );  
  97.                
  98.                 SI4432_WriteReg(0x07, 0x01);        // rf 模块进入Ready 模式                                       
  99.                 delay_ms(20);                // 延时 5ms, 让系统稳定       
  100.                
  101.                 SI4432_WriteReg(0x3e, 0x08);  // 总共发射8个字节的数据
  102.                 SI4432_WriteReg(0x7F, 0x42);
  103.                 SI4432_WriteReg(0x7F, 0x42);
  104.                 SI4432_WriteReg(0x7F, 0x42);
  105.                 SI4432_WriteReg(0x7F, 0x42);
  106.                 SI4432_WriteReg(0x7F, 0x42);
  107.                 SI4432_WriteReg(0x7F, 0x42);
  108.                 SI4432_WriteReg(0x7F, 0x42);
  109.                 SI4432_WriteReg(0x7F, 0x42);

  110.                 SI4432_WriteReg(0x05, 0x04);        // 整包数据发射完后,产生中断       
  111.                 SI4432_WriteReg(0x06, 0x00);
  112.                 ItStatus1 = SI4432_ReadReg(0x03);//清除中断          
  113.                 ItStatus2 = SI4432_ReadReg(0x04);
  114.                 SI4432_WriteReg(0x07, 0x09);//打开发射          
  115.                  while ( SI4432_NIRQ == 1);     
  116.              GPIO_ResetBits(GPIOB , GPIO_Pin_10);         
  117.                 //read interrupt status registers to release the interrupt flags
  118.                 ItStatus1 = SI4432_ReadReg(0x03);                  printf("ItStatus1 =%02x \n",(unsigned short)ItStatus1 );                          
  119.                 ItStatus2 = SI4432_ReadReg(0x04);            printf("ItStatus2 =%02x \n",(unsigned short)ItStatus2 );                         
  120.                 delay_ms(1000);
  121.         }

  122. }

  123. // 读取寄存器
  124. u8  SI4432_ReadReg(u8  addr)   //读取寄存器的值
  125. {
  126.         uint8_t temp=0;
  127.        
  128.         SI4432_NSEL=0;
  129.         SPI1_ReadWriteByte(addr);    //发送读取寄存器地址
  130.         temp=SPI1_ReadWriteByte(0Xff);
  131.         SI4432_NSEL=1;
  132.        
  133.         return temp;
  134. }
  135. //写寄存器
  136. void SI4432_WriteReg(u8 addr, u8 value)  //写寄存器
  137. {
  138.         SI4432_NSEL=0;
  139.         SPI1_ReadWriteByte(addr|0x80);  
  140.         SPI1_ReadWriteByte(value);   
  141.         SI4432_NSEL=1;
  142. }









复制代码


SI4432 发送 接收程序.rar

3.46 MB, 下载次数: 399, 下载积分: 黑币 -5

手册 和编程指南.rar

3.71 MB, 下载次数: 252, 下载积分: 黑币 -5

回复

使用道具 举报

ID:89536 发表于 2015-9-7 09:32 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:89846 发表于 2015-9-10 22:24 | 显示全部楼层
楼主讲的很细,非常感谢!!
回复

使用道具 举报

ID:89846 发表于 2015-9-10 22:25 | 显示全部楼层
STM32控制SI4432无线模块详解!
回复

使用道具 举报

ID:93752 发表于 2015-10-27 15:09 | 显示全部楼层
厉害,必须注册一个账号来顶一下
回复

使用道具 举报

ID:95108 发表于 2015-11-8 21:24 | 显示全部楼层
谢谢楼主分享。。
回复

使用道具 举报

ID:95108 发表于 2015-11-9 20:15 | 显示全部楼层
我使用TMS570板子,自带的gpio链接4432上的TXON和RXON,而不是4432自带的gpio控制发送接收可以吗??
其他流程和楼主一致,现在问题是发送完中断一直没来!
回复

使用道具 举报

ID:95218 发表于 2015-11-9 21:50 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:97689 发表于 2015-11-30 12:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:97689 发表于 2015-11-30 12:38 | 显示全部楼层
谢谢分享,老感谢了
回复

使用道具 举报

ID:98900 发表于 2015-12-8 21:41 | 显示全部楼层
非常感谢你的分享
回复

使用道具 举报

ID:99174 发表于 2015-12-10 17:41 | 显示全部楼层
特意注册一个账号,只为来顶一下。在这弄几天也没有进展了
回复

使用道具 举报

ID:100167 发表于 2015-12-23 16:42 | 显示全部楼层
正需要这个资料,谢谢了
回复

使用道具 举报

ID:100326 发表于 2015-12-24 15:13 | 显示全部楼层
好东西必须支持
回复

使用道具 举报

ID:99627 发表于 2015-12-29 17:28 | 显示全部楼层
我把代码复制到keil软件里,编译了一下。怎么有5处警告都是头文件,还有一处错误。是怎么回事?请指教。
回复

使用道具 举报

ID:106047 发表于 2016-2-22 09:58 | 显示全部楼层
毕业设计需要,好东西哇
回复

使用道具 举报

ID:106047 发表于 2016-2-22 09:59 | 显示全部楼层
好东西毕业设计需要,希望有机会可以向老师学习
回复

使用道具 举报

ID:40121 发表于 2016-2-27 15:46 | 显示全部楼层
不错的帖子,我必须要顶一下,我顶。。。。。。。
回复

使用道具 举报

ID:107677 发表于 2016-3-9 22:54 | 显示全部楼层
好资料,谢谢大家
回复

使用道具 举报

ID:110687 发表于 2016-3-26 15:59 | 显示全部楼层
谢谢楼主,谢谢楼主的共享!收藏了
回复

使用道具 举报

ID:112677 发表于 2016-4-7 11:43 | 显示全部楼层
顶一下 希望我可以下载啊
回复

使用道具 举报

ID:114848 发表于 2016-4-18 00:09 | 显示全部楼层

顶一下 正好我也在用
回复

使用道具 举报

ID:118636 发表于 2016-5-5 16:55 | 显示全部楼层
楼主有用SI4010吗?
回复

使用道具 举报

ID:123271 发表于 2016-5-26 08:45 | 显示全部楼层
谢楼主分享
回复

使用道具 举报

ID:124722 发表于 2016-6-2 17:05 | 显示全部楼层
不错不错不错不错不错
回复

使用道具 举报

ID:129793 发表于 2016-7-9 11:20 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:136504 发表于 2016-9-7 16:07 | 显示全部楼层
HW3000国产第一家433无线模块,完美替换si4432,4463.cc1101。咨询电话:13570852936;
回复

使用道具 举报

ID:151687 发表于 2016-12-2 16:57 | 显示全部楼层
原本准备自己折腾折腾了,这下好了
回复

使用道具 举报

ID:151861 发表于 2016-12-3 15:24 | 显示全部楼层
你好,我下载你的si4432代码程序的时候提示下载不了,你能单独发送给我一下吗?824564795@qq.com
回复

使用道具 举报

ID:151861 发表于 2016-12-3 15:27 | 显示全部楼层
你好楼主,我下载你的si4432的代码时候提示下载不了,能给我单独发一份吗?qq邮箱:824564795@qq.com
回复

使用道具 举报

ID:182980 发表于 2017-3-24 09:04 | 显示全部楼层
楼主很用心   社会需要你
回复

使用道具 举报

ID:193871 发表于 2017-4-26 16:01 | 显示全部楼层
想要学习一下,估计以后会用到
回复

使用道具 举报

ID:204598 发表于 2017-5-25 09:01 | 显示全部楼层
楼主好人
回复

使用道具 举报

ID:183147 发表于 2017-6-14 10:22 | 显示全部楼层
正好要用到!!!!谢谢楼主!
回复

使用道具 举报

ID:137543 发表于 2017-10-22 18:48 | 显示全部楼层
非常感谢,楼主辛苦了··
回复

使用道具 举报

ID:241124 发表于 2017-10-22 20:58 | 显示全部楼层
谢谢分享哈!!!
回复

使用道具 举报

ID:147350 发表于 2017-11-18 09:09 | 显示全部楼层
好资料,收藏了,多谢哈哈哈哈
回复

使用道具 举报

ID:48664 发表于 2017-11-28 14:16 | 显示全部楼层
MARK,收藏了
回复

使用道具 举报

ID:254772 发表于 2017-11-28 16:47 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:254771 发表于 2017-11-28 16:54 | 显示全部楼层
不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表