单片机
返回首页

Si4432无线芯片调试经验分享

2012-08-16 来源:51hei

前段时间主要是搜集了一些si4432的资料,包括芯片手册,原理图,官方代码等。调试买到的模块,看能否接收到数据。对具体的配置以及工作模式的了解还不是很清楚。现总结如下:

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); 看不到串口输出的信息。但只有一个模块发送,一个模块接收,观察到接收模块收到了数据才能证明调试是没问题的。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • CCFL的工作原理及电子驱动电路解析

  • 开关电源的基本组成及工作原理

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 比较常见的功率整流器和滤波电路

  • 一个简单的红外耳机电路

  • 基于CA3193的热电偶放大器电路

    相关电子头条文章