文档库 最新最全的文档下载
当前位置:文档库 › si4432-51例程-发送端代码

si4432-51例程-发送端代码

#include
#include
#include
#include

//------------------RF4432配置口定义-------------------
sbit RF4432_PAC=P1^4; //收发模式切换控制端
sbit RF4432_SDO=P2^2; //SPI数据输出
sbit RF4432_SDI=P2^1; //SPI数据输入
sbit RF4432_SCLK=P2^3; //SPI时钟输入端口
sbit RF4432_SEL=P2^4; //SPI片选
sbit RF4432_SDN=P2^0; //SDN=1时关闭芯片工作 ,SDN=0时芯片正常工作
sbit RF4432_IRQ=P2^5; //SI4432工作状态指示端口

sbit LED1=P3^7;
//-----------------------------------------------------
//sbit RF4432_IO0=P1^0; //IO-0可以不用
//sbit RF4432_IO1=P3^2; //IO-1可以不用
//sbit RF4432_IO2=P1^1; //IO-2可以不用
//-------------------数码管位选-----------------------
//sbit led3=P2^0;
//sbit led2=P2^1;
//sbit led1=P2^2;
//sbit led0=P2^3;
//------------------------DS1820----------------------
//sbit DQ=P2^7 ;
//------------------射频芯片相关定义-------------------
#define RF4432_TxRxBuf_Len 32 //定义RF4432数据包长度
char RF4432_TxRxBuf[RF4432_TxRxBuf_Len]=
{
0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
//---------------RF4432 配置寄存器地址---------------
#define DEVICE_TYPE 0x00
#define DEVICE_VERSION 0x01 //版本号
#define DEVICE_STATUS 0x02 //设备状态
#define INTERRUPT_STATUS_1 0x03
#define INTERRUPT_STATUS_2 0x04
#define INTERRUPT_ENABLE_1 0x05
#define INTERRUPT_ENABLE_2 0x06
#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
#define ADC_CONFIGURATION 0x0F
#define ADC_SENSOR_AMPLIFIER_OFFSET 0x10
#define ADC_VALUE 0x11
#define TEMPERATURE_SENSOR_CONTROL 0x12 //温度传感器校准
#define TEMPERATURE_VALUE_OFFSET 0x13
#define WAKE_UP_TIMER_PERIOD_1 0x14
#define WAKE_UP_TIMER_PERIOD_2 0x15
#define WAKE_UP_TIMER_PERIOD_3 0x16
#define WAKE_UP_TIMER_VALUE_1 0x17
#define WAKE_UP_TIMER_VALUE_2 0x18
#define LOW_DUTY_CYCLE_MODE_DURATION 0x19
#define LOW_BATTERY_DETECTOR_THRESHOLD 0x1A //低压检测阈值寄存器
#define BATTERY_VOLTAGE_LEVEL 0x1B
#define IF_FILTER_BANDWIDTH 0x1C //中频滤波器带宽寄存器
#define AFC_LOOP_GEARSHIFT_OVERRIDE 0x1D
#define AFC_TI

MING_CONTROL 0x1E
#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
#define RSSI_THRESHOLD_FOR_CLEAR_CHANNEL_INDICATOR 0x27
#define ANTENNA_DIVERSITY_REGISTER_1 0x28
#define ANTENNA_DIVERSITY_REGISTER_2 0x29
#define DATA_ACCESS_CONTROL 0x30
#define EZMAC_STATUS 0x31
#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 //发送数据包长度,详细请看P125页
#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 //锁相环切换时间
#define CALIBRATION_CONTROL 0x55
#define MODEM_TEST 0x56
#define CHARGEPUMP_TEST 0x57
#define CHARGEPUMP_CURRENT_TRIMMING_OVERRIDE 0x58
#define DIVIDER_CURRENT_TRIMMING 0x59
#define VCO_CURRENT_TRIMMING 0x5A
#define VCO_CALIBRATION_OVERRIDE 0x5B
#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
#define RC_OSCILLATOR_FINE_CALIBRATION_OVERRIDE 0x64
#define LDO_CONTROL_OVERRIDE_ENSPOR 0x65
#define LDO_LEVEL_SETTING 0x66
#define DELTASIGMA_ADC_TUNING_1 0x67
#define DELTASIGMA_ADC_TUNING_2 0x68
#define AGC_OVERRIDE_1 0x69
#define AGC_OVERRIDE_2 0x6A
#define GFSK_FIR_FILTER_COEFFICIENT_ADDRESS 0x6B
#define GFSK_FIR_FILTER_COEFFICIENT_VALUE 0x6C
#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 //跳频频道选择,详细请见P158
#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读写方式设置,
//----------------------RF4432控制指令----------------------
#define RR 0x00
#define WR 0x80
//------------------------函数申明----------------------
void delay_10us(char n); //短延时

void delay_ms(int num); //长延时

unsigned char SPI_Read(void); //SPI单字节读取函数

void SPI_Write(unsigned char txdata); //SPI单字节写入函数

unsigned char RF4432_ReadReg(unsigned char addr); //RF4432寄存器读取函数

void RF4432_WriteReg(unsigned char addr, unsigned char value); //RF4432寄存器写函数

void RF4432_WriteBurestReg(unsigned char addr,unsigned char *p,unsigned char count);

void RF4432_ReadBurestReg(unsigned char addr,unsigned char *p,unsigned char count);

void RF4432_Init(void); //RF4432射频芯片初始化函数

void RF4432_SetRxMode(void); //RF4432设置接收模式函数

unsigned char RF4432_RxPacket(void); //RF4432数据包接收函数

void RF4432_TxPacket(void); //RF4432数据

包发送函数

//----------------------延时------------------------
void delay_10us(char n)
{
int i;
while(n--)
for(i=0;i<5;i++);
}
//---------------------------------------------------

void delay_ms(int num)
{
int x,y;
for(y=0;y{
for(x = 0;x < 500;x)
x++;
}
}

//---------------SPI单字节读取函数----------------
unsigned char SPI_Read(void)
{

unsigned char i,rxdata;
rxdata = 0x00;
for (i = 0;i < 8;i++)
{
rxdata = rxdata<<1;
RF4432_SCLK=1;
RF4432_SDO=1;
if (RF4432_SDO==1) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
rxdata |= 0x01;
}
else
{
rxdata &= ~0x01;
}
delay_10us(2);
RF4432_SCLK=0;
delay_10us(2);
}
return rxdata;

}
//---------------------SPI单字节写入函数----------------------
void SPI_Write(unsigned char txdata)
{
unsigned char 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=0;
}
}
//---------------------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;
}
//---------------RF4432寄存器写入函数---------------------
void RF4432_WriteBurestReg(unsigned char addr,unsigned char *p,unsigned char count)
{
unsigned char i;
RF4432_SEL=0;
SPI_Write(addr|WR);
for(i=0;i{
SPI_Write(p[i]);
}
RF4432_SEL=1;
}
//---------------------RF4432寄存器读取函数-----------------------
void RF4432_ReadBurestReg(unsigned char addr,unsigned char *p,unsigned char count)
{
unsigned char i;
RF4432_SEL=0;
SPI_Write(addr|RR);
for(i=0;i{
p[i] = SPI_Read();
}
RF4432_SEL=1;
}
//----------------------RF4432射频芯片初始化函数------------------
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, 0x00);

RF4432_WriteReg( IF_FILTER_BANDWIDTH, 0x8b);
RF4432_WriteReg( CLOCK_RECOVERY_OVERSAMPLING_RATIO, 0x2c);
RF4432_WriteReg( CLOCK_RECOVERY_OFFSET_2, 0x20);
RF4432_WriteReg( CLOCK_RECOVERY_

OFFSET_1, 0x6d);
RF4432_WriteReg( CLOCK_RECOVERY_OFFSET_0, 0x3a);
RF4432_WriteReg( CLOCK_RECOVERY_TIMING_LOOP_GAIN_1, 0x00);
RF4432_WriteReg( CLOCK_RECOVERY_TIMING_LOOP_GAIN_0, 0x18);
RF4432_WriteReg( RSSI_THRESHOLD_FOR_CLEAR_CHANNEL_INDICATOR, 0xf0);

RF4432_WriteReg( DATA_ACCESS_CONTROL, 0x88);
RF4432_WriteReg( HEADER_CONTROL_1, 0x8c);
RF4432_WriteReg( HEADER_CONTROL_2, 0x0a);
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);
RF4432_WriteReg (HEADER_ENABLE_2, 0x00);
RF4432_WriteReg( HEADER_ENABLE_1, 0x00);
RF4432_WriteReg( HEADER_ENABLE_0 ,0x00);

RF4432_WriteReg(AGC_OVERRIDE_2, 0x0b);
RF4432_WriteReg(TX_POWER,0x07); //发射功率20dB
RF4432_WriteReg(TX_DATA_RATE_1, 0x0A); //通信速率40kbps
RF4432_WriteReg(TX_DATA_RATE_0, 0x3D);
RF4432_WriteReg(MODULATION_MODE_CONTROL_1, 0x02);
RF4432_WriteReg(MODULATION_MODE_CONTROL_2, 0x26); //设置为FIFO模式 FSK reg71H

RF4432_WriteReg(FREQUENCY_DEVIATION, 0x40); //
RF4432_WriteReg(FREQUENCY_BAND_SELECT, 0x53); //设置频率 reg75H
RF4432_WriteReg(NOMINAL_CARRIER_FREQUENCY_1, 0x4b); //通信频率433MHZ reg76H
RF4432_WriteReg(NOMINAL_CARRIER_FREQUENCY_0, 0x00); // reg77H

RF4432_WriteReg(TX_FIFO_CONTROL_1,0x3F);
RF4432_WriteReg(TX_FIFO_CONTROL_2,0x00);
RF4432_WriteReg(RX_FIFO_CONTROL,0x3F);
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);
}
//-----------------------RF4432设置接收模式函数-------------------
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); //接收

}
//-----------------------RF4432数据包接收函数-------------------------
unsigned char RF4432_RxPacket(void)
{
RF4432_IRQ=1;
if(!RF4432_IRQ)
{
if(RF4432_ReadReg(INTERRUPT_STATUS_1)&0x02)
{
return 1;
}
}
return 0;
}
//---------------------RF4432数据包发送函数---------------------
void RF4432_TxPacket(void)
{
RF4432_PAC=1;
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_2,RF4432_ReadReg(OPERATING_FUNCTION_CONTROL_2)|0x01);

//FIFO模式
RF4432_WriteReg(OPERATING_FUNCTION_CONTROL_2,RF4432_ReadReg(OPERATING_FUNCTION_CONTROL_2)&0xFE);

RF4432_WriteBurestReg(FIFO_ACCESS,RF4432_TxRxBuf,RF4432_TxRxBuf_Len );
//FIFO读写方式设置
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)
{
RF4432_IRQ=1;
if(!RF4432_IRQ)
{
if(RF4432_ReadReg(INTERRUPT_STATUS_1)&0x04) //详细请看P95页
{
break;
}
}
}
}

//--------------------------------------------------------------------
main()
{
RF4432_Init();
delay_ms(10);
P0=0xff;
while(1)
{
LED1=0; delay_ms(100);
RF4432_TxPacket(); //间隔固定发送1-32 字节数据
LED1=1; delay_ms(100);
}

}

相关文档