|
硬件电路图如下:
(原文件名:si1000无线.jpg)
发送程序:
//初始化部分
void RadioPro()
{
U8 Status1,Status2;
//reset
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1,0x80);
while(NIRQ==1);
//设置中心频率434MHz
WriteReg(EZRADIOPRO_FREQUENCY_BAND_SELECT,0x53);
WriteReg(EZRADIOPRO_NOMINAL_CARRIER_FREQUENCY_1,0x64);
WriteReg(EZRADIOPRO_NOMINAL_CARRIER_FREQUENCY_0,0x00);
//发射数据速率(9.6Kbps)
WriteReg(EZRADIOPRO_TX_DATA_RATE_1,0x4E);
WriteReg(EZRADIOPRO_TX_DATA_RATE_0,0xA5);
WriteReg(EZRADIOPRO_MODULATION_MODE_CONTROL_1,0x2C);
//发射偏差(+ -4.8kHz)
WriteReg(EZRADIOPRO_FREQUENCY_DEVIATION, 0x08);
WriteReg(EZRADIOPRO_MODULATION_MODE_CONTROL_2,0x00);
/*set the packet structure and the modulation type*/
WriteReg(EZRADIOPRO_PREAMBLE_LENGTH, 0x0A); //前导码长度
//Disable header bytes; set variable packet length (the length of the payload is defined by the
//received packet length field of the packet); set the synch word to two bytes long
WriteReg(EZRADIOPRO_HEADER_CONTROL_2, 0x02);
//Set the sync word pattern to 0x2DD4
WriteReg(EZRADIOPRO_SYNC_WORD_3, 0x2D);
WriteReg(EZRADIOPRO_SYNC_WORD_2, 0xD4);
//enable the TX & RX packet handler and CRC-16 (IBM) check
WriteReg(EZRADIOPRO_DATA_ACCESS_CONTROL, 0x8D); //
//Disable the receive header filters
WriteReg(EZRADIOPRO_HEADER_CONTROL_1, 0x00 ); //
//WriteReg(EZRADIOPRO_HEADER_CONTROL_2, 0x04 ); //
//enable FIFO mode and FSK modulation
WriteReg(EZRADIOPRO_MODULATION_MODE_CONTROL_2, 0xE2); // FSK Mode,
//WriteReg(EZRADIOPRO_GPIO1_CONFIGURATION, 0x12); //(set the TX state)//不采用GPIO控制,所以不设置
//WriteReg(EZRADIOPRO_GPIO2_CONFIGURATION, 0x15); //(set the RX state)
//set the non-default Si4432 registers
//set the VCO and PLL
WriteReg(EZRADIOPRO_VCO_CURRENT_TRIMMING, 0x7F);
//WriteReg(EZRADIOPRO_CHARGEPUMP_CURRENT_TRIMMING_OVERRIDE, 0x80);
WriteReg(EZRADIOPRO_DIVIDER_CURRENT_TRIMMING, 0x40);
//set Crystal Oscillator Load Capacitance register
WriteReg(EZRADIOPRO_CRYSTAL_OSCILLATOR_LOAD_CAPACITANCE, 0xD7);
//Enable two interrupts:
// a) one which shows that a valid packet received: 'ipkval'
// b) second shows if the packet transmit with incorrect CRC: 'icrcerror'
WriteReg(EZRADIOPRO_INTERRUPT_ENABLE_1, 0x04);
WriteReg(EZRADIOPRO_INTERRUPT_ENABLE_2, 0x00);
//read interrupt status registers to release all pending interrupts
Status1 = ReadReg(EZRADIOPRO_INTERRUPT_STATUS_1);
Status2 = ReadReg(EZRADIOPRO_INTERRUPT_STATUS_2);
}
//发送数据
void Radiosend()
{
U8 Status1,Status2;
//set the length of the payload to 8 bytes
WriteReg(EZRADIOPRO_TRANSMIT_PACKET_LENGTH,0x08);
//fill the payload into the transmit FIFO
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x41); //"A"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x42); //"B"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x43); //"C"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x44); //"D"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x45); //"E"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x46); //"F"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x47); //"G"
WriteReg(EZRADIOPRO_FIFO_ACCESS,0x0D); //(CR)
//read interrupt status and reset NIRQ
Status1=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_1);
Status2=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_2);
//enable transmitter
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1, 0x09);
while(NIRQ==1);
Status1=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_1);
Status2=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_2);
LED2=0;
LED3=0;
delay(1000);
LED2=1;
LED3=1;
delay(1000);
}
接收程序:
//初始化部分
void RadioPro()
{
//reset
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1,0x81);//复位
//设置中心频率434MHz
WriteReg(EZRADIOPRO_FREQUENCY_BAND_SELECT,0x53); //0x53,从240-479.9MHz中选择
WriteReg(EZRADIOPRO_NOMINAL_CARRIER_FREQUENCY_1,0x64);
WriteReg(EZRADIOPRO_NOMINAL_CARRIER_FREQUENCY_0,0x00);
//频偏(+ -4.8kHz)
WriteReg(EZRADIOPRO_IF_FILTER_BANDWIDTH, 0x2E); //
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_OVERSAMPLING_RATIO, 0x68);
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_OFFSET_2, 0x01);
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_OFFSET_1, 0x3A);
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_OFFSET_0, 0x93);
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_TIMING_LOOP_GAIN_1, 0x02);
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_TIMING_LOOP_GAIN_0, 0x78);
WriteReg(EZRADIOPRO_AFC_LOOP_GEARSHIFT_OVERRIDE, 0x01);
WriteReg(EZRADIOPRO_FREQUENCY_DEVIATION, 0x18);
/*set the packet structure and the modulation type*/
//set preamble detection threshold to 20bits
WriteReg(EZRADIOPRO_PREAMBLE_DETECTION_CONTROL, 0x2A);//前导码侦测控制
//Disable header bytes; set variable packet length (the length of the payload is defined by the
//received packet length field of the packet); set the synch word to two bytes long
WriteReg(EZRADIOPRO_HEADER_CONTROL_2, 0x02);
//Set the sync word pattern to 0x2DD4
WriteReg(EZRADIOPRO_SYNC_WORD_3, 0x2D);
WriteReg(EZRADIOPRO_SYNC_WORD_2, 0xD4);
//enable the TX & RX packet handler and CRC-16 (IBM) check
WriteReg(EZRADIOPRO_DATA_ACCESS_CONTROL, 0x8D); //
//Disable the receive header filters
WriteReg(EZRADIOPRO_HEADER_CONTROL_1, 0x00 ); //
//enable FIFO mode and FSK modulation
WriteReg(EZRADIOPRO_MODULATION_MODE_CONTROL_2, 0x22); // FSK Mode
//WriteReg(EZRADIOPRO_GPIO1_CONFIGURATION, 0x12); //(set the TX state)//不采用GPIO控制,所以不设置
//WriteReg(EZRADIOPRO_GPIO2_CONFIGURATION, 0x15); //(set the RX state)
//set the non-default Si4432 registers
//set the VCO and PLL
WriteReg(EZRADIOPRO_VCO_CURRENT_TRIMMING, 0x7F);
WriteReg(EZRADIOPRO_CHARGEPUMP_CURRENT_TRIMMING_OVERRIDE, 0x80);
WriteReg(EZRADIOPRO_DIVIDER_CURRENT_TRIMMING, 0x40);
//set the AGC
WriteReg(EZRADIOPRO_AGC_OVERRIDE_2, 0x0B);
//set ADC reference voltage to 0.9V
WriteReg(EZRADIOPRO_DELTASIGMA_ADC_TUNING_2, 0x04);
WriteReg(EZRADIOPRO_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE, 0x03);
//set Crystal Oscillator Load Capacitance register
WriteReg(EZRADIOPRO_CRYSTAL_OSCILLATOR_LOAD_CAPACITANCE, 0xD7);
}
void RadioReceive()
{
BYTE length;
BYTE temp;
BYTE payload[]={0,0,0,0,0,0,0,0};
U8 status1,status2;
//clear RX FIFO
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2,0x02);
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2,0x00);
//Enable two interrupts
WriteReg(EZRADIOPRO_INTERRUPT_ENABLE_1,0x03); //ipkval
WriteReg(EZRADIOPRO_INTERRUPT_ENABLE_2,0x00); //icrerror
//enable receive chain
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1, 0x05);
//read interrupt status reg
status1=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_1);
status2=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_2);
//wait for Receive interrupt
while(1)
{
//read interrupt status reg
if(NIRQ==0)
{
status1=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_1);
status2=ReadReg(EZRADIOPRO_INTERRUPT_STATUS_2);
if((status1&0x01)==0x01)
{
//disable the receive chain
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1,0x01);
//reset RX FIFO
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2,0x02);
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2,0x00);
//blink LED to show error
LED2=0;
LED3=0;
LED4=0;
LED5=0;
delay(1000);
LED2=1;
LED3=1;
LED4=1;
LED5=1;
//enable the reecive chain again
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1,0x05);
}
if((status1&0x02)==0x02)
{
//disable the receive chain
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1,0x01);
//read the length of the received payload
length=ReadReg(EZRADIOPRO_RECEIVED_PACKET_LENGTH);
if(length<11)
{
//get the payload from the RX FIFO
for(temp=0;temp<length;temp++)
{
payload[temp]=ReadReg(EZRADIOPRO_FIFO_ACCESS);
}
if(length==8)
{
if(memcmp(&payload[0],"ABCDEFG1",7)==0)
{
LED2=0;
delay(100);
LED2=1;
}
}
}
//reset RX FIFO
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2,0x02);
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_2,0x00);
//enable RX FIFO
WriteReg(EZRADIOPRO_OPERATING_AND_FUNCTION_CONTROL_1,0x05);
}
}
}
}
有发射数据包中断,但是没有接收中断,问题在哪? |
|