×
单片机 > 单片机程序设计 > 详情

A7105(2.4G)与STC89C52单片机无线收发程序(接收程序)

发布时间:2020-05-28 发布时间:
|
A7105与STC89C52无线模块接收程序,如下所示:

#include
#include
typedef  unsigned int uint;
typedef unsigned char uchar;
//A7105寄存器地址定义
#define MODE_REG           0x00//寄存器设置
#define MODE_CONTROL_REG   0x01//
#define CALIBRATION_REG    0x02
#define FIFO_REGISTER1_REG 0x03
#define FIFO_REGISTER2_REG 0x04
#define FIFO_DATA_REG      0x05
#define ID_DATA_REG        0x06
#define RC_OSC1_REG        0x07
#define RC_OSC2_REG        0x08
#define RC_OSC3_REG        0x09
#define CKO_CONTROL_REG    0x0a
#define GIPO1_CONTROL_REG  0x0b
#define GIPO2_CONTROL_REG  0x0c
#define CLOCK_REG          0x0d
#define DATA_RATE_REG    0x0e
#define PLL1_REG     0x0f
#define PLL2_REG           0x10
#define PLL3_REG           0x11
#define PLL4_REG     0x12
#define PLL5_REG           0x13
#define TX1_REG            0x14
#define TX2_REG            0x15
#define DELAY1_REG         0x16
#define DELAY2_REG         0x17
#define RX_REG      0x18
#define RX_GAIN1_REG       0x19
#define RX_GAIN2_REG       0x1a
#define RX_GAIN3_REG       0x1b
#define RX_GAIN4_REG       0x1c
#define RSSI_THRESHOLD_REG 0x1d
#define ADC_CONTROL_REG    0x1e
#define CODE1_REG          0x1f
#define CODE2_REG          0x20
#define CODE3_REG          0x21
#define IF_CALIBRATION1_REG     0x22
#define IF_CALIBRATION2_REG        0x23
#define VCO_CURRENT_CAL_REG        0x24
#define VCO_SINGLE_BAND_CAL1_REG   0x25
#define VCO_SINGLE_BAND_CAL2_REG   0x26
#define BATTERY_DETECT_REG     0x27
#define TX_TEST_REG                0x28
#define RX_DEM_TEST1_ERG     0x29
#define RX_DEM_TEST2_REG     0x2a
#define CPC_REG        0x2b
#define CRYSTAL_TEST_REG           0x2c
#define PLL_TEST_REG      0x2d
#define VCO_TEST1_REG      0x2e
#define VCO_TEST2_REG      0x2f
#define IFAT_REG       0x30
#define RSSI_CALE_REG      0x31
#define FILTER_TEST_REG            0x32
//A7105命令定义
#define CMD_SLEEP                  0x80
#define CMD_IDLE       0x90
#define CMD_STBY       0xa0
#define CMD_PLL        0xb0
#define CMD_RX        0xc0
#define CMD_TX        0xd0
#define CMD_TX_FIFO_RESET     0xe0
#define CMD_RX_FIFO_RESET     0xf0
//ID CODE define
#define ID_CODE0       0x54
#define ID_CODE1       0x75
#define ID_CODE2       0xc5
#define ID_CODE3       0x2a

#define RF_DATA_PACKET_SIZE        64

sbit SCK=P3^5;
sbit SCS=P3^4;
sbit SDIO=P3^6;
sbit GPIO1=P3^7;
sbit LED=P2^0;
sbit Key=P2^4;

const uchar code A7105_Default_Par[]=
{
 0x00,// reset register
 0x42,//mode register:FIFO mode
 0x00,//calibration register
 0x3f,//FIFO1 register:packet length,,最后一位为结束位
 0x00,//FIFO2 register,,4/60byte(TX/RX)FIFO
 0x00,//FIFO register,,R/W data register
 0x00,//ID DATA register,not use on config
 0x00,//RCOSC1 register
 0x00,//RCOSC2 register
 0x00,//RCOSC3 register
 0x00,//CKO register
 0x01,//GPIO1 register,,GPIO1 PIN Enable Output
 0x21,//GPIO2 register
 0x05,//CLOCK register:Crystal oscillator enable bit
 0x00,//DATA RATE register,,,500k
 0x50,//PLL1 register
 0x9e,//PLL2 register
 0x4b,//PLL3 register
 0x00,//PLL4 register
 0x02,//PLL5 register
 0x16,//TX1 register
 0x2b,//TX2 register
 0x12,//DELAY1 register
 0x00,//DELAY2 register
 0x62,//RX register,Demodulator filter bandwidth = 1M,Demodulator gain select * 1,BPF:bandwidth 500khz
 0x80,//RX GAIN1 register,手动校验VGA,PGA gain select 12db,mixer gain select 24db,LNA gain select 24db.
 0x80,//RX GAIN2 register,VGA calibrate upper limit target
 0x00,//RX GAIN3 register,VGA calibrate lower limit target
 0x0a,//RX GAIN4 register,在设定的目标内持续调整,直到收到ID CODE为止,Mixer high current 1.2ma,LNA current select 1.0ma
 0x32,//RSSI register
 0xc3,//ADC register
 0x07,//CODE1 register;ID length 4 bytes, preamble length 4 bytes
 0x16,//CODE2 register
 0x00,//CODE3 register
 0x00,//IF CALI1 register
 0x00,//IF CALI2 register
 0x00,//VCO_C_CALI register
 0x00,//VCO CALI1 register
 0x3b,//VCO CALI2 register
 0x00,//BATTERY register
 0x17,//TX TEST register
 0x47,//RX DEM1 register
 0x80,//RX DEM2 register
 0x03,//CPC register
 0x01,//CRYSTAL register
 0x45,//PLL TEST register
 0x18,//VCO TEST1 register
 0x00,//VCO TSET2 register
 0x01,//IFAT register
 0x0f,//RSCALE register
 0x00//FILTERTEST register
};

uchar const Hop_Tab[]={20,40,80,120,160};
uchar RX_DATA_Buffer[RF_DATA_PACKET_SIZE];
const uchar code LED_BIT[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
18,19,20,21,22,23,24,25,26,27,28,29,30,31,31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
bit RX_Flag;
uchar timer,seq,Err_Hop_Ctn,timer_ctn;
uchar Read_ID[4];

void Init_A7105(void);
void A7105_Config_Chip(void);
void A7105_Calibration(void);
void A7105_Entry_Stdy(void);
void A7105_Setup_Wpll(void);
void A7105_Setup_Channel(uchar ch);
void A7105_Entry_TX(void);
void A7105_Entry_RX(void);
void A7105_Reset_Chip(void);
void A7105_Reset_RX_FIFO(void);
void A7105_Reset_TX_FIFO(void);
void Write_Register(uchar bits,uchar value);
uchar Read_Register(void);
void A7105_Write_Command(uchar cmd);
void A7105_Write_Register(uchar addr,uchar value);
uchar A7105_Read_Register(uchar addr);
void A7105_Write_ID(void);
void A7105_Read_ID(uchar *Read_Ptr);
void A7105_Write_DATA_To_FIFO(void);
void A7105_Read_DATA_From_FIFO(void);
void Send_DATA_By_RF(uchar Send_Byte);
void Rec_RF_DATA(void);

void delay_us(uint x)
{
 while(x--);
}
delay_ms(uint x)
{
 uint i;
 while(x--)for(i=0;i<120;i++);
}
//初始化A7105
void Init_A7105(void)
{
 SCK=0;
 SDIO=1;
 SCS=1;
 GPIO1=1;
 A7105_Reset_Chip();
// delay_us(50000);
 A7105_Write_ID();
 A7105_Config_Chip();
 A7105_Calibration();
}
//进入待机模式
void A7105_Entry_Stdy(void)
{
 A7105_Write_Command(CMD_STBY);
}

void A7105_Setup_Wpll(void)
{
 A7105_Write_Command(CMD_PLL);
}
//设置频率
void A7105_Setup_Channel(uchar ch)
{
 A7105_Write_Register(PLL1_REG,ch);
}[page]

//设置为接收模式
void A7105_Entry_RX(void)
{
 A7105_Write_Command(CMD_RX);
}
//设置为发射模式
void A7105_Entry_TX(void)
{
 A7105_Write_Command(CMD_TX);
}
//复位A7105
void A7105_Reset_Chip(void)
{
 A7105_Write_Register(MODE_REG,0x00);
}

void A7105_Reset_RX_FIFO(void)
{
 A7105_Write_Command(CMD_RX_FIFO_RESET);
}

void A7105_Reset_TX_FIFO(void)
{
 A7105_Write_Command(CMD_TX_FIFO_RESET);
}
//写寄存器
void Write_Register(uchar bits,uchar value)
{
 uchar i;
 for(i=0;i  {
  if(value&0x80)
   SDIO=1;
  else
   SDIO=0;
  SCK=1;
  
  SCK=0;
  value<<=0x01;
 }
}
//读寄存器
uchar Read_Register(void)
{
 uchar i,temp=0;
 SDIO=1;
 for(i=0;i<8;i++)
 {
  if(SDIO)
   temp=(temp<<1)|0x01;
  else
   temp<<=0x01;
  SCK=1;
  SCK=0;
 }
 return temp;
}
//A7105写指令
void A7105_Write_Command(uchar cmd)
{
 SCS=0;
 Write_Register(0x04,cmd);
 SCS=1;
}
//A7105写数据
void A7105_Write_Register(uchar addr,uchar value)
{
 SCS=0;
 addr|=0x00;
 Write_Register(0x08,addr);
 Write_Register(0x08,value);
 SCS=1;
}
//A7105读数据
uchar A7105_Read_Register(uchar addr)
{
 uchar temp=0;
 SCS=0;
 addr|=0x40;
 Write_Register(0x08,addr);
 temp=Read_Register();
 SCS=1;
 return temp;
}
//A7105写ID
void A7105_Write_ID(void)
{
 SCS=0;
 Write_Register(0x08,ID_DATA_REG);
 
 Write_Register(0x08,ID_CODE0);
 Write_Register(0x08,ID_CODE1);
 Write_Register(0x08,ID_CODE2);
 Write_Register(0x08,ID_CODE3);
 SCS=1;

 A7105_Read_ID(Read_ID);
}
//A7105读ID
void A7105_Read_ID(uchar *read_prt)
{
 SCS=0;
 Write_Register(0x08,(ID_DATA_REG|0x40));
 SDIO=1;
 *read_prt++=Read_Register();
 *read_prt++=Read_Register();
 *read_prt++=Read_Register();
 *read_prt++=Read_Register();
 SCS=1;
}

//A7105从FIFO读取数据
void A7105_Read_DATA_From_FIFO(void)
{
 uchar i,temp=0;
 SCS=0;
 Write_Register(0x08,FIFO_DATA_REG|0x40);
 for(i=0;i   RX_DATA_Buffer[i]=Read_Register();
 SCS=1;
}

//A7105校准
void A7105_Calibration(void)
{
 uchar temp;
 uchar fb,fbcf;
 A7105_Entry_Stdy();//校准必须在待机模式下进行
 A7105_Write_Register(CALIBRATION_REG,0x01);
 do
 {
  temp=A7105_Read_Register(CALIBRATION_REG);
  temp&=0x01;
 }while(temp);
 temp=A7105_Read_Register(IF_CALIBRATION1_REG);
 fb=temp&0x0f;
 fbcf=(temp>>4)&0x01;
 if(fbcf==1)
 {
  LED=0;
 }
 A7105_Write_Register(VCO_CURRENT_CAL_REG,0x13);
 A7105_Write_Register(VCO_SINGLE_BAND_CAL1_REG,0x09);
 
}
//配置A7105
void A7105_Config_Chip(void)
{
 uchar i;
 
    //0x00 mode register, for reset   
    //0x05 fifo data register   
    //0x06 id code register   
    //0x23 IF calibration II, only read   
    //0x32 filter test register   
  
 for(i=0x01;i<=0x04;i++)
  A7105_Write_Register(i,A7105_Default_Par[i]);
 for(i=0x07;i<=0x22;i++)
  A7105_Write_Register(i,A7105_Default_Par[i]);
 for(i=0x24;i<=0x31;i++)
  A7105_Write_Register(i,A7105_Default_Par[i]);
}
//主函数
void main(void)
{
 uchar i;
 P0=0xff;
 P1=0xff;
 P2=0xff;
 P3=0xff;

 Init_A7105();
 delay_ms(500);
 A7105_Entry_Stdy();
 while(1)
 {
  
  A7105_Setup_Channel(100-1);//接收频率必须减1否则对不上码
 
  A7105_Setup_Wpll();
  A7105_Entry_RX();
  delay_us(150);
  while(GPIO1);
   //P0=A7105_Read_Register(0x03);
  A7105_Read_DATA_From_FIFO();
  for(i=0;i<64;i++)
  {
   P0=RX_DATA_Buffer[i];
   delay_ms(300);
  }
  A7105_Entry_Stdy();
 }
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法