Si4432芯片是Silicon Labs公司推出集成度、低功耗、多频段的EZRadioPRO系列无线收发芯片。可以工作在433M免费频段。早期生产的V2版本的不太稳定,经过SI公司改进后,B1版本的性能比较稳定,最大功率可以到20dBm(100mw),接收灵敏度可以到-121dbm,工作电压为1.9~3.6 V,20引脚QFN封装(4 mm×4 mm),可工作在315/433/868/915 MHz四个频段;内部集成分集式天线、功率放大器、唤醒定时器、数字调制解调器、64字节的发送和接收数据FIFO,以及可配置的GPIO等。因其发射功率大,接收灵敏度高,可以传输到上千米的距离,素有"穿墙王"之称。他与NRF905、CC1101无线模块相比,距离远好几倍,具有很高的性价比。
下面以MSP430为例,详细介绍其使用。
1、 初始化
Si4432对外以SPI接口形式实现互连,考虑到通用性,这里以软件模拟的方式实现读和写操作。
void SPI_Write(uint8 txdata)
{
uint8 i;
for (i = 0;i < 8;i++)
{
if (txdata&0x80) //总是发送最高位
{
RF4432_SDI_1;
}
else
{
RF4432_SDI_0;
}
RF4432_SCLK_1;
txdata = txdata<<1;
RF4432_SCLK_1;
}
}
SPI_Write(uint8 txdata)
{
uint8 i;
for (i = 0;i < 8;i++)
{
if (txdata&0x80) //总是发送最高位
{
RF4432_SDI_1;
}
else
{
RF4432_SDI_0;
}
RF4432_SCLK_1;
txdata = txdata<<1;
RF4432_SCLK_1;
}
}
RF4432_SDI_1、RF4432_SDI_0为宏定义,代表430输出高电平和低电平,连接至si4432芯片的14引脚(即SDI)。RF4432_SCLK_1、RF4432_SCLK_1连接至si4432芯片的15引脚(即SCLK),每一次循环均将左移后的txdata高位发送至si4432。
uint8 SPI_Read(void)
{
uint8 i,rxdata;
rxdata = 0x00;
for (i = 0;i < 8;i++)
{
rxdata = rxdata<<1;
RF4432_SCLK_1;
if (RF4432_SDO_IN) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
rxdata |= 0x01;
}
else
{
rxdata &= ~0x01;
}
delay_us(20);
RF4432_SCLK_0;
delay_us(20);
}
return rxdata;
}
RF4432_SDO_IN连接至si4432的13引脚(即SDO),每一次循环从si4432读取一位数据,一个for循环实现读取一个字节的目的。
有了SPI_Write()和SPI_Read(),我们就可以实现430对si4432相应地址的寄存器的读写操作了。
uint8 RF4432_ReadReg(uint8 addr)
{
uint8 value;
RF4432_SEL_0;
SPI_Write(addr|RR);
value = SPI_Read();
RF4432_SEL_1;
return value;
}
void RF4432_WriteReg(uint8 addr, uint8 value)
{
RF4432_SEL_0;
SPI_Write(addr|WR);
SPI_Write(value);
RF4432_SEL_1;
}
RF4432_SEL_0、RF4432_SEL_1连接至si4432的16引脚(即片选nSEL),nSEL处于低电平时导通,完成读操作后,关闭片选信号。RR也为宏定义0x00,WR为0x80,即最高位一个是0,一个是1.该位为指示位,即告诉si4432接下来是读操作还是写操作。
下面就可以对si4432进行初始化了,这里的初始化 其实就是对si4432内部的各个寄存器进行配置,程序如下:
void RF4432_Init(void)
{
RF4432_SDN_0; //允许RF4432工作
delay_ms(20);
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_1, 0x80);//软件复位,详细请见P101页
delay_ms(10);
RF4432_ReadReg(INTERRUPT_STATUS_1);
RF4432_ReadReg(INTERRUPT_STATUS_2);
RF4432_WriteReg(INTERRUPT_ENABLE_1, 0x00);
RF4432_WriteReg(INTERRUPT_ENABLE_2, 0x01); //中断使能
RF4432_WriteReg(IF_FILTER_BANDWIDTH, 0x8b); //IF滤波器带宽 BW = 75.2Khz; Rb = 50Kbps; Fd = 25Khz;
RF4432_WriteReg( CLOCK_RECOVERY_OVERSAMPLING_RATIO, 0x2c); //时钟恢复过抽样率
RF4432_WriteReg( CLOCK_RECOVERY_OFFSET_2, 0x20); //时钟恢复偏差2
RF4432_WriteReg( CLOCK_RECOVERY_OFFSET_1, 0x6d); //时钟恢复偏差1
RF4432_WriteReg( CLOCK_RECOVERY_OFFSET_0, 0x3a); //时钟恢复偏差0
RF4432_WriteReg( CLOCK_RECOVERY_TIMING_LOOP_GAIN_1, 0x00); //时钟恢复定时增益1
RF4432_WriteReg( CLOCK_RECOVERY_TIMING_LOOP_GAIN_0, 0x18); //时钟恢复定时增益0
RF4432_WriteReg( RSSI_THRESHOLD_FOR_CLEAR_CHANNEL_INDICATOR, 0xf0); //无干扰信指示器接收信号强度指示(RSSI)
RF4432_WriteReg( DATA_ACCESS_CONTROL, 0x88); //数据存储控制
RF4432_WriteReg( HEADER_CONTROL_1, 0x8c); //帧头控制1
RF4432_WriteReg( HEADER_CONTROL_2, 0x0a);
//帧头控制2
RF4432_WriteReg( PREAMBLE_LENGTH, 0x08);
//前导码长度
RF4432_WriteReg( TRANSMIT_PACKET_LENGTH, RF4432_TxRxBuf_Len ); //发送数据包长度设置
RF4432_WriteReg( RECEIVED_PACKET_LENGTH, RF4432_TxRxBuf_Len ); //接收数据包长度设置
RF4432_WriteReg( HEADER_ENABLE_3, 0x00); //帧头使能3
RF4432_WriteReg( HEADER_ENABLE_2, 0x00); //帧头使能2
RF4432_WriteReg( HEADER_ENABLE_1, 0x00); //帧头使能1
RF4432_WriteReg( HEADER_ENABLE_0 ,0x00); //帧头使能0
RF4432_WriteReg(AGC_OVERRIDE_2, 0x0b);
//AGC过载2
RF4432_WriteReg(TX_POWER,0x07);
//发射功率
RF4432_WriteReg(TX_DATA_RATE_1, 0x0c);
//发射数据波特率1 TX_DR=10^3*txdr[15:0]/2^16 kbit/s
RF4432_WriteReg(TX_DATA_RATE_0, 0xcc);
//发射数据波特率0
RF4432_WriteReg(MODULATION_MODE_CONTROL_1, 0x02);
//调制模式控制1
RF4432_WriteReg(MODULATION_MODE_CONTROL_2, 0x26);
//调制模式控制2(设置为FIFO模式 FSK reg71H)
RF4432_WriteReg(FREQUENCY_DEVIATION, 0x40);
//频率偏差 25KHz f=fd[7:0]*625Hz
RF4432_WriteReg(FREQUENCY_BAND_SELECT, 0x53); //频段选择 reg75H
RF4432_WriteReg(NOMINAL_CARRIER_FREQUENCY_1, 0x4b);
RF4432_WriteReg(NOMINAL_CARRIER_FREQUENCY_0, 0x00);
//标称载波频率(通信频率433MHZ reg76H)
RF4432_WriteReg(TX_FIFO_CONTROL_1,0x3F);
RF4432_WriteReg(TX_FIFO_CONTROL_2,0x00); //TX_FIFO控制
RF4432_WriteReg(RX_FIFO_CONTROL,0x3F); //RX_FIFO控制
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_2,
RF4432_ReadReg(OPERATING_FUNCTION_CONTROL_2)|0x01);
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_2,
RF4432_ReadReg(OPERATING_FUNCTION_CONTROL_2)&0xFE);
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_2,
RF4432_ReadReg(OPERATING_FUNCTION_CONTROL_2)|0x02);
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_2,
RF4432_ReadReg(OPERATING_FUNCTION_CONTROL_2)&0xFD);
//工作模式和功能控制
}
上面使用了大量的宏定义,这里给出这些宏定义对应的具体寄存器地址。
#define DEVICE_TYPE &nb