原创 Si4432无线芯片调试经验分享

2012-12-29 21:43 4123 18 21 分类: MCU/ 嵌入式

 

Silicon Labs EZRadioPRO系列ISM频段无线芯片SI4432, 可工作在240-960MHZ频段范围内。最大输出功率可以达到+20DBm。外围可加入功率放大电路,以提高发送功率。

Si4432主要有关闭模式,挂机模式,发射模式和接收模式组成。关闭状态下可以降低功耗,各模式切换必须先进入挂起状态再切换。其中的挂机模式,给SPI寄存器地址07h赋予不同的值,又分为五种不同的子模式。待机模式,睡眠模式,传感器模式,预备模式,调谐模式。上电复位后,或者芯片由掉电状态退出后将默认进入预备模式。

Si4432数据传输方式主要有三种,FIFO模式,直接模式,和PN9模式。在 FIFO Mode 下,使用片内的先入先出堆栈区来发送和接收数据。对 FIFO 的操作是通过SPI 对 07H 寄存器的连续读或者写进行的。在FIFO Mode下,Si4432自动退出发送或者接收状态,当相关的中断信号产生,并且自动处理字头和CRC校验码。在接收数据时, 自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码。在直接收发模式下,Si4432如传统的射频收发器一样工作。PN9模式,在这种模式下的Tx数据是内部产生使用伪随机( PN9序列)位发生器。这种模式的目的是用作测试模式不断观察调制频谱,而不必负载/提供数据。

配置Si4432 模块是通过SPI 方式进行的,可配置为FIFO 方式和直接方式, 推荐Si4432 工作于 FIFO 收发模式,这种工作模式下,系统的程序编制会更加简单,并且稳定性也会更高.不过网上评论说,这种模式没有直接模式传输的距离远。其中配置Si4432 主要包括载波频率、调制方式、数据发送速率、CRC 校验、前导码、 同步字、数据头、地址等,具体可参考 Si4432(IA4432) RegisterSettings_RevV-v16 寄存器配置工具进行。

至于si4432是否带远程无线唤醒,看了半天手册也没找到。不过,网上的一位网友说:“以前产品用的是CC1100,确实出现近距离通信不正常的问题,空旷地带<150M(FSK,9.6k/s,433M,WOR休眠侦听通信方式),距离不够;然后改用CC1101+PA,但是瞬间发射电流>300mA,由于我们是电池供电,功耗太大了。 后来通过商家介绍用SI4432,前几天简单测试了下通信距离>330M(433M,40K/S,GFSK),可能更远的距离还行,就没测试了,下个星期再做详细测试。 对于现在的使用情况,个人觉得他们各有优点。CC1101的特点具有自动无线侦听,可以实现电磁波唤醒功能,但是通信距离不够;而SI4432通信距离不错,且内部自带PA,可以达到+18dB,发射电流在60mA左右。但不具备无线唤醒这样的功能,只能依*自身的定时器,配合单片机来实现电磁波唤醒功能,这样一来对MCU的稳定性要求就相当高。”

Si4432的寄存器操作:

Si4432共有128个寄存器(O一127),它们控制芯片的工作和记录芯片的状态。可通过SPI对它们进行访问。SPI的it顺序是可配置的,其缺省配置(MSB在前)与MCU的顺序相同。命令格式为2字节结构:读/写标志(1 bit,0—读,l一写),寄存器地址(7 bit)+待写数据(对于读操作,该值也必须有,只是可为任意值)。每次可以读写1/多(burst)个字节,它们是由时钟信号决定的,在读写一个字节后,如果时钟继续有效,那么,地址将会自动加1,接下来的操作将是对下一个寄存器的读写。通过Silicon Labs提供的WDS(Wirelessevelopment Suit)可访问这些寄存器并可生成相应的初始化代码。只能在空闲状态下对寄存器进行初始化,否则,可能会出现意外的结果。为了提高传输信号的质量,增大发射距离,保证数据的可*传输,系统使能数据白化、曼彻斯特Manchester)编码、CRC校验和采用GFSK调制。

状态机:

在完成不同的功能时,芯片所处的状态是不同的。这些状态在满足一定的条件时可实现相互转移。状态机如图:

关闭(shutdown)和空闲(idle)状态称为低功耗状态,而idle又可细分为5个不同的子状态,它们在低功耗下完成各种与无线数据收发无关的操作。发送(Tx)和接收(RX)状态称为激活状态,它们完成无线数据的收发。除了关闭状态外(只能通过MCU的I/O脚来设置),其余状态都可以通过SPI接El进行设置和读取。可通过寄存器07h实现状态的切换,这种切换表现在两个方面:1)当设置其中的某一位时,状态立即发生切换;2)在完成收发任务后,决定返回到idle状态的哪一个子状态(在本系统中为休眠状态,即设置enwt=1)。可通过02h寄存器获取当前的状态。芯片的常态为idle,为了保证不漏收数据,可利用唤醒定时器来定时唤醒芯片进入融状态(此时要设置08h寄存器中的enldm位为l,并设置定时常数寄存器14h和19h中的值),在确认没有数据/收完数据后再返回到原来的idle子状态。

用普通51单片机 IO 口模拟SPI:

SPI读操作函数:

unsigned char SPI_Read(void)

{

 

     unsigned char i,rxdata;

     rxdata = 0x00;

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

     {

           rxdata = rxdata<<1;

           RF4432_SCLK=0;

           if (RF4432_SDO==1)     //读取最高位,保存至最末尾,通过左移位完成整个字节

           {

                rxdata |= 0x01;

           }

           delay_10us(2);  

           RF4432_SCLK=1;

           delay_10us(2);  

      }

      return rxdata;

 

}

SPI写操作函数:

void SPI_Write(unsigned char txdata)

{

     unsigned char i;

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

     {

           RF4432_SCLK=0;

           if ((txdata&0x80)==0x80)    //总是发送最高位

           {

           RF4432_SDI=1;

           }

           else

           {

         RF4432_SDI=0;

           }

           txdata = txdata<<1;

           delay_10us(2);  

           RF4432_SCLK=1;

           delay_10us(2);  

     }

}

RF4432 寄存器读操作函数:

unsigned char  RF4432_ReadReg(unsigned char  addr)

{

     unsigned char value;

     RF4432_SEL=0;                 

     SPI_Write(addr|RR);     

     value = SPI_Read();         

     RF4432_SEL=1;        

     return value;

}

RF4432 寄存器写操作函数:

void  RF4432_WriteReg(unsigned char  addr, unsigned char value)

{

     RF4432_SEL=0;                 

     SPI_Write(addr|WR);     

     SPI_Write(value);         

     RF4432_SEL=1;                

}

SI4432寄存器定义:

#define DEVICE_TYPE                                     0x00

#define DEVICE_VERSION                             0x01   //版本号

……

参考附件。

 


RF4432 射频芯片初始化函数,RF4432 设置接收模式函数, RF4432 数据包接收函数, RF4432 数据包发送函数等。参考文档:si4432模块使用手册.pdf。这些附件我整理了一个压缩包http://www.51hei.com/f/452de.rar 大家可以去下载.

网上搜到的程序代码以及官方提供的代码大都是基于Silicon Labs的c8051f单片机的,虽然都是51核的,但编程环境以及运行速度都是不一样的,不能直接拿来在普通51上运行,得稍作修改。目前完成了基于普通51单片机的三份代码修改。一份是官方的,一份是买模块时送的,一份是网上找来的。网上还有一份基于pic单片机的源码,但看了后感觉跟官方的差不多,没去修改。修改后在51开发板上可以运行了。但是其中一个模块不能工作,没法看到效果。具体能否接收还不确定。因此,也就停留在了这个地方。可以通过串口观察到一些信息,比如初始化完成后产生低电平的NIRQ中断,以及发送完成后也产生低电平的NIRQ中断,程序 片段

RF4432_Init()

{

        ……

while ( RF4432_IRQ== 1); //等待软复位完成,当软复位完成后有中断发生

…….

}

UART_Send_Str("RF芯片si4432初始化完毕....\n");//串口发送调试信息

正常初始化完毕后通过串口会看到语句“RF芯片si4432初始化完毕....”,否则停留在while ( RF4432_IRQ== 1); 看不到串口输出的信息。但只有一个模块发送,一个模块接收,观察到接收模块收到了数据才能证明调试是没问题的。

附件:四份修改的程序。51的可以用keil直接打开。430的用IAR打开。分别在文件夹RFtest51_1,51test4432_1,RFtest430,430test4432。

官方的程序源码,买模块送的程序源码。

Si4432编程指南.pdf

修改过的可以用keil软件打开的官方程序代码。在文件夹51_si4432官方, 51_si4432官方_1。

文章评论3条评论)

登录后参与讨论

用户377235 2014-4-29 17:03

有没有代码啊。

用户1017182 2013-1-16 22:38

谢谢。这个图片不太好搞哦。经此测试记录。

用户403664 2013-1-5 14:43

好文,配图看着就更舒服了
相关推荐阅读
用户1017182 2016-03-20 13:49
STM8-STVD(COSMIC)定义变量指定其类型和位定义
stm8 stvd下near等于51的xdatatiny等于51的idata 如何分配变量到指定的地址 举例: unsigned ch...
用户1017182 2016-03-05 21:59
磁保持继电器的效率问题
怎样才能最大化的发挥磁保持继电器的优势呢?...
用户1017182 2014-05-03 14:38
指示电量不足的简单电路设计
图中所示的设计实例可指示使用四节AA电池供电的音频测试仪器出现的电量不足状态。由于该仪器采用的是分立式设计,相较于单一来源的集成电路,该相同方法看似更符合项目初衷。   普通的红色LED既...
用户1017182 2014-05-03 14:19
source insight调用Keil编译器并且定位到错误行
  EDN博客精华文章  作者:mubo   效果图如下: 点击看原图   下面是实现方法:   1、Source Insight -> Options -> Custom Comma...
用户1017182 2014-05-03 14:13
解决source insight输入中文间距大,删除键Del键左右方向光标半个汉字的问题
在默认情况下,往Source Insight里输入中文,字间距相当的大,下面将帮助你解决这个问题。具体设置如下:1.Options->Style Properties2. 在左边Style Na...
用户1017182 2013-07-06 10:33
评论:@汽车电子设计之路 博客中提到的“功率Mosfet参数介绍”
好...
我要评论
3
18
关闭 站长推荐上一条 /2 下一条