MSP430平台下实现Si4432的收发数据
来源:互联网 发布:网络最热门表情包 编辑:程序博客网 时间:2024/06/05 17:49
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; }}
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 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;}
- MSP430平台下实现Si4432的收发数据
- MSP430平台下实现AT24C02的读写操作
- LINUX下串口数据的并发收发
- PS模式下的数据收发
- Android下实现短信的收发
- Android下实现短信SMS的收发
- Android下实现短信的收发
- WIFI power save 模式下的数据收发
- WIFI power save 模式下的数据收发
- WIFI power save 模式下的数据收发
- WIFI power save 模式下的数据收发
- 求教应用MSP430如何实现数据存储
- FPGA控制DM9000A进行以太网数据收发的Verilog实现
- PHP 通过Socket收发十六进制数据的实现代码
- 基于QT5实现十六进制串口数据的收发
- 命令行下实现Email收发
- 全志R16平台TINAV2.0下的UART3的串口收发程序
- FL2440在linux平台下minicom的使用 串口收发文件
- k-means聚类算法的java实现
- 装饰者设计模式
- mysql悲观锁总结和实践
- React-classnames库
- 表格存储在QCon2017的分享
- MSP430平台下实现Si4432的收发数据
- Netty 时间轮算法实现HashedWheelTimer
- Linux搭建邮件服务器
- SpringBoot整合Netty
- 怎样把U盘里的文件,复制到LINUX下?
- 浅谈物联网的关键技术和难点
- Gradle for Android(二)——build.gradle基本配置
- a标签实现下载图片功能
- List存放map值