MSP430平台下实现Si4432的收发数据

来源:互联网 发布:网络最热门表情包 编辑:程序博客网 时间:2024/06/05 17:49

Si4432芯片是Silicon Labs公司推出集成度、低功耗、多频段的EZRadioPRO系列无线收发芯片。可以工作在433M免费频段。早期生产的V2版本的不太稳定,经过SI公司改进后,B1版本的性能比较稳定,最大功率可以到20dBm(100mw),接收灵敏度可以到-121dbm,工作电压为1.9~3.6 V20引脚QFN封装(4 mm×4 mm),可工作在315/433/868/915 MHz四个频段;内部集成分集式天线、功率放大器、唤醒定时器、数字调制解调器、64字节的发送和接收数据FIFO,以及可配置的GPIO等。因其发射功率大,接收灵敏度高,可以传输到上千米的距离,素有"穿墙王"之称。他与NRF905CC1101无线模块相比,距离远好几倍,具有很高的性价比。

下面以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;            }} 

RF4432_SDI_1RF4432_SDI_0为宏定义,代表430输出高电平和低电平,连接至si4432芯片的14引脚(SDI)RF4432_SCLK_1RF4432_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连接至si443213引脚(SDO),每一次循环从si4432读取一位数据,一个for循环实现读取一个字节的目的。 

有了SPI_Write()SPI_Read(),我们就可以实现430si4432相应地址的寄存器的读写操作了。

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_0RF4432_SEL_1连接至si443216引脚(即片选nSEL)nSEL处于低电平时导通,完成读操作后,关闭片选信号。RR也为宏定义0x00WR0x80,即最高位一个是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                                          0x00        //器件类型码#define DEVICE_VERSION                                0x01        //版本号#define DEVICE_STATUS                                     0x02         //器件状态#define INTERRUPT_STATUS_1                         0x03        //中断状态1#define INTERRUPT_STATUS_2                         0x04        //中断状态2#define INTERRUPT_ENABLE_1                                0x05        //中断使能1#define INTERRUPT_ENABLE_2                                0x06        //中断使能2#define OPERATING_FUNCTION_CONTROL_1                       0x07         //工作模式和功能控制1#define OPERATING_FUNCTION_CONTROL_2                     0x08         //工作模式和功能控制2#define CRYSTAL_OSCILLATOR_LOAD_CAPACITANCE         0x09         //晶振负载电容设置#define MICROCONTROLLER_OUTPUT_CLOCK                    0x0A        //微控制器输出时钟#define GPIO0_CONFIGURATION                            0x0B         //GPIO0功能设置寄存器见英文文档第105页#define GPIO1_CONFIGURATION                            0x0C#define GPIO2_CONFIGURATION                            0x0D#define IO_PORT_CONFIGURATION                                0x0E        //IO端口配置      #define ADC_CONFIGURATION                        0x0F        //ADC配置#define ADC_SENSOR_AMPLIFIER_OFFSET                   0x10        //ADC传感放大器偏差#define ADC_VALUE                                   0x11        //ADC值#define TEMPERATURE_SENSOR_CONTROL                  0x12         //温度传感器校准#define TEMPERATURE_VALUE_OFFSET               0x13        //温度传感器值偏差#define WAKE_UP_TIMER_PERIOD_1                              0x14        //唤醒定时器时期1#define WAKE_UP_TIMER_PERIOD_2                              0x15        //唤醒定时器时期2#define WAKE_UP_TIMER_PERIOD_3                              0x16        //唤醒定时器时期3#define WAKE_UP_TIMER_VALUE_1                               0x17        //唤醒定时器值1#define WAKE_UP_TIMER_VALUE_2                               0x18        //唤醒定时器值2#define LOW_DUTY_CYCLE_MODE_DURATION                   0x19         //低任务周期模式持续时间#define LOW_BATTERY_DETECTOR_THRESHOLD                   0x1A         //低压检测阈值寄存器#define BATTERY_VOLTAGE_LEVEL                           0x1B        //电池电压级别#define IF_FILTER_BANDWIDTH                               0x1C         //中频滤波器(IF)带宽寄存器#define AFC_LOOP_GEARSHIFT_OVERRIDE                 0x1D        //AFC循环变速超速#define AFC_TIMING_CONTROL                               0x1E        //AFC定时控制#define CLOCK_RECOVERY_GEARSHIFT_OVERRIDE           0x1F        //时钟恢复变速超速#define CLOCK_RECOVERY_OVERSAMPLING_RATIO         0x20        //时钟恢复过抽样率#define CLOCK_RECOVERY_OFFSET_2                   0x21        //时钟恢复偏差#define CLOCK_RECOVERY_OFFSET_1                             0x22#define CLOCK_RECOVERY_OFFSET_0                   0x23#define CLOCK_RECOVERY_TIMING_LOOP_GAIN_1          0x24        //时钟恢复定时循环增益#define CLOCK_RECOVERY_TIMING_LOOP_GAIN_0         0x25#define RECEIVED_SIGNAL_STRENGTH_INDICATOR          0x26        //接收信号强度指示器(RSSI)#define RSSI_THRESHOLD_FOR_CLEAR_CHANNEL_INDICATOR  0x27        //无干扰信道指示器接收信号强度指示(RSSI)#define ANTENNA_DIVERSITY_REGISTER_1                 0x28        //天线分集#define ANTENNA_DIVERSITY_REGISTER_2                 0x29#define DATA_ACCESS_CONTROL                            0x30        //时间存储控制#define EZMAC_STATUS                                     0x31        //EzMAC状态#define HEADER_CONTROL_1                          0x32         //Header 起始码设置#define HEADER_CONTROL_2                          0x33#define PREAMBLE_LENGTH                            0x34         //前导码长度#define PREAMBLE_DETECTION_CONTROL                   0x35         //前导码检测设置#define SYNC_WORD_3                                      0x36         //同步字节#define SYNC_WORD_2                                      0x37#define SYNC_WORD_1                                       0x38#define SYNC_WORD_0                                      0x39#define TRANSMIT_HEADER_3                                 0x3A        //发射帧头#define TRANSMIT_HEADER_2                         0x3B#define TRANSMIT_HEADER_1                         0x3C#define TRANSMIT_HEADER_0                         0x3D#define TRANSMIT_PACKET_LENGTH                               0x3E         //发送数据包长度#define CHECK_HEADER_3                                 0x3F        //检测帧头#define CHECK_HEADER_2                                 0x40#define CHECK_HEADER_1                                         0x41#define CHECK_HEADER_0                                 0x42#define HEADER_ENABLE_3                             0x43        //帧头使能#define HEADER_ENABLE_2                             0x44#define HEADER_ENABLE_1                             0x45#define HEADER_ENABLE_0                             0x46#define RECEIVED_HEADER_3                           0x47        //接收到的帧头#define RECEIVED_HEADER_2                           0x48#define RECEIVED_HEADER_1                           0x49#define RECEIVED_HEADER_0                           0x4A#define RECEIVED_PACKET_LENGTH                      0x4B     //接收数据包长度,详细请看P134页#define ANALOG_TEST_BUS                             0x50        //模拟测试总线选择#define DIGITAL_TEST_BUS_ENSCTEST_                  0x51        //数据测试总线选择#define TX_RAMP_CONTROL                             0x52        //发射斜率控制#define PLL_TUNE_TIME                               0x53       //锁相环(PPL)切换时间#define CALIBRATION_CONTROL                         0x55        //校正控制#define MODEM_TEST                                  0x56        //调制控制#define CHARGEPUMP_TEST                             0x57        //充电泵测试#define CHARGEPUMP_CURRENT_TRIMMING_OVERRIDE        0x58        //充电泵电流微调/超调#define DIVIDER_CURRENT_TRIMMING                          0x59        //电流分压器微调/Delta-Sigma测试#define VCO_CURRENT_TRIMMING                      0x5A        //VCO电流微调#define VCO_CALIBRATION_OVERRIDE                    0x5B        //VCO校正/超驰#define SYNTHESIZER_TEST                                   0x5C        //合成器测试#define BLOCK_ENABLE_OVERRIDE_1                             0x5D        //模块使能超驰#define BLOCK_ENABLE_OVERRIDE_2                             0x5E#define BLOCK_ENABLE_OVERRIDE_3                             0x5F#define CHANNEL_FILTER_COEFFICIENT_ADDRESS             0x60        //频道滤波器系数地址#define CHANNEL_FILTER_COEFFICIENT_VALUE         0x61        //频道滤波器系数值#define CRYSTAL_OSCILLATOR_CONTROL_TEST                       0x62 //晶体振荡器/上电复位控制#define RC_OSCILLATOR_COARSE_CALIBRATION_OVERRIDE   0x63 //RC振荡器粗略校正/超驰#define RC_OSCILLATOR_FINE_CALIBRATION_OVERRIDE          0x64   //RC震荡器精细校正#define LDO_CONTROL_OVERRIDE_ENSPOR                   0x65        //LDO控制超驰#define LDO_LEVEL_SETTING                          0x66        //保留?LDO等级设置?#define DELTASIGMA_ADC_TUNING_1                                 0x67        //Delta-sigma ADC调谐#define DELTASIGMA_ADC_TUNING_2                         0x68#define AGC_OVERRIDE_1                                     0x69        //AGC过载#define AGC_OVERRIDE_2                                0x6A#define GFSK_FIR_FILTER_COEFFICIENT_ADDRESS             0x6B        //GFSK FIR 滤波器系数地址#define GFSK_FIR_FILTER_COEFFICIENT_VALUE         0x6C        //GFSK FIR 滤波器系数值#define TX_POWER                                      0x6D        //发射功率设置,详细请见P153#define TX_DATA_RATE_1                                      0x6E         //数据发送波特率设置寄存器1#define TX_DATA_RATE_0                                    0x6F         //数据发送波特率设置寄存器0#define MODULATION_MODE_CONTROL_1                       0x70  //调制方式控制,详细请见P155#define MODULATION_MODE_CONTROL_2               0x71#define FREQUENCY_DEVIATION                           0x72        //频率偏差#define FREQUENCY_OFFSET_1                     0x73        //频率偏移#define FREQUENCY_OFFSET_2                     0x74        //频道控制#define FREQUENCY_BAND_SELECT                     0x75         //频段选择,详细请见P157#define NOMINAL_CARRIER_FREQUENCY_1              0x76         //基准载波频率#define NOMINAL_CARRIER_FREQUENCY_0              0x77#define FREQUENCY_HOPPING_CHANNEL_SELECT             0x79         //跳频频道选择#define FREQUENCY_HOPPING_STEP_SIZE                 0x7A         //跳频频道间隔#define TX_FIFO_CONTROL_1                        0x7C#define TX_FIFO_CONTROL_2                        0x7D#define RX_FIFO_CONTROL                                      0x7E#define FIFO_ACCESS                                0x7F        //FIFO读写方式设置

完成初始化后,下面将开始使用Si4432完成数据的发送和读取。

2、发送数据

发送数据的功能封装在函数RF4432_TxPacket()当中,实现选定长度的数组数据的发送。

void RF4432_TxPacket(uchar RF4432_TxRxBuf, uchar RF4432_TxRxBuf_Len){         //RF4432_PAC_1; 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_WriteBurestReg(FIFO_ACCESS,RF4432_TxRxBuf,RF4432_TxRxBuf_Len );         RF4432_ReadReg(INTERRUPT_STATUS_1);         RF4432_ReadReg(INTERRUPT_STATUS_2);         RF4432_WriteReg(INTERRUPT_ENABLE_1, 0x04);         RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_1,0x09);//发射         while(1)         {                  if(!RF4432_IRQ_IN)                  {                      if(RF4432_ReadReg(INTERRUPT_STATUS_1)&0x04)                      {                            break;                      }                  }         }}


3、读取数据

读取数据需要先设置成接收模式。

void RF4432_SetRxMode(void){         //RF4432_PAC_0;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);         RF4432_ReadReg(INTERRUPT_STATUS_1);         RF4432_ReadReg(INTERRUPT_STATUS_2);         RF4432_WriteReg(INTERRUPT_ENABLE_1, 0x02);         RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_1,0x05);//接收}

设置完成后就可以利用Si4432天线接收数据了。

unsigned char RF4432_RxPacket(void){         //RF4432_IRQ_1;  //P1DIR &= ~BIT0;         if(!RF4432_IRQ_IN)         {                 if(RF4432_ReadReg(INTERRUPT_STATUS_1)&0x02)                  {                            return 1;                           }         }        return 0;}
 
原创粉丝点击