⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a7102.c

📁 无线模块A7102的C语言测试程序源码,
💻 C
📖 第 1 页 / 共 2 页
字号:
        
        addr           &= 0x0f;
        
        /* 写A7102-参数配置命令 */
        Byte_Write(addr);
        
        /* 写A7102-参数配置数据 */
        Word_Write(parameter);
        
        iSPI_Scs        = positive;
}
/***********************************************
函 数:	A7102_Register_Read()
功 能:	读控制数据从A7102内部寄存器 
输 入:	addr
输 出:	parameter
描 述:	/
***********************************************/
unsigned int    A7102_Register_Read(unsigned char addr)
{
        unsigned int    parameter;
	
        iSPI_Sck        = negative;
        delay_A7102_us();
        iSPI_Scs        = negative;
        
        addr           &= 0x0f;
        addr           |= 0x80;
        
        /* 读A7102-参数配置命令 */
        Byte_Write(addr);
        
        declare_sdo_input();
        
        /* 读A7102-参数配置数据 */
        parameter       = Word_Read();
        
        declare_sdo_output();
        
        iSPI_Scs        = positive;
        
        /* 返回读取数值 */
        return    (parameter);
}
/***********************************************
函 数:	A7102_Status_Transmit()
功 能:	A7102设置为发射状态 
输 入:	/
输 出:	/
描 述:	A7102使用12.8M晶体为基准源 
***********************************************/
void    A7102_Status_Transmit(void)
{
#if  mode_switch
        iSPI_Tre        = negative;
        iSPI_Trs        = positive;
        iSPI_Tre        = positive;
#else
        #if mode_fifo
            /* standby mode */
            A7102_Register_Write(Reg_ModeControl,0x00d0);
            /* TX frequency */
            A7102_Register_Write(Reg_PLL_II,C_Tx_Frequency);
            /* 校准值 */
            A7102_Register_Write(Reg_Calibration,TX_Freq_Calibration);
            /* transimit mode */
            A7102_Register_Write(Reg_ModeControl,0x00d8); 
        #else
            /* standby mode */
            A7102_Register_Write(Reg_ModeControl,0x0050);
            /* TX frequency */
            A7102_Register_Write(Reg_PLL_II,C_Tx_Frequency);
            /* 校准值 */
            A7102_Register_Write(Reg_Calibration,TX_Freq_Calibration);
            /* transimit mode */
            A7102_Register_Write(Reg_ModeControl,0x0058);
        #endif
#endif
}
/***********************************************
函 数:	A7102_Receiver_Enable()
功 能:	A7102接收使能 
输 入:	/
输 出:	/
描 述:	A7102使用12.8M晶体为基准源 
***********************************************/
void    A7102_Receiver_Enable(void)
{
#if mode_fifo
        A7102_Register_Write(Reg_ModeControl,0x00c8);
#else
        A7102_Register_Write(Reg_ModeControl,0x0048);
#endif
}
/***********************************************
函 数:	A7102_Status_Receiver()
功 能:	A7102设置为接收状态 
输 入:	/
输 出:	/
描 述:	A7102使用12.8M晶体为基准源 
***********************************************/
void    A7102_Status_Receiver(void)
{
#if  mode_switch
        iSPI_Tre        = negative;
        iSPI_Trs        = negative;
        iSPI_Tre        = positive;
#else
        #if mode_fifo
            /* standby mode */
            A7102_Register_Write(Reg_ModeControl,0x00c0); 
            /* RX frequency */
            A7102_Register_Write(Reg_PLL_II,C_Rx_Frequency);
            /* 校准值 */
            A7102_Register_Write(Reg_Calibration,RX_Freq_Calibration);
            /* enable receive mode */
            A7102_Receiver_Enable();
        #else
            /* standby mode */
            A7102_Register_Write(Reg_ModeControl,0x0040);
            /* RX frequency */
            A7102_Register_Write(Reg_PLL_II,C_Rx_Frequency);
            /* 校准值 */
            A7102_Register_Write(Reg_Calibration,RX_Freq_Calibration);
            /* enable receive mode */
            A7102_Receiver_Enable();
        #endif
#endif
}
/***********************************************
函 数:	A7102_Calibration_Frequency()
功 能:	频率校准IF和VCO
输 入:	frequency(PLL II寄存器)
输 出:	/
描 述:	A7102使用12.8M晶体为基准源 
***********************************************/
unsigned int    A7102_Calibration_Frequency(unsigned int frequency)
{
        unsigned int temp;
        
        /* 设置频率 */
        A7102_Register_Write(Reg_PLL_II,frequency);

        /* 读出校准寄存器内值 */
        temp    = A7102_Register_Read(Reg_ModeControl);
        
        /* 打开校准功能 */
        temp   |= 0x0006;
        A7102_Register_Write(Reg_ModeControl,temp);
        
        /* 等待校准完成 */
        do
        {
            temp    = A7102_Register_Read(Reg_ModeControl);
        }while(temp&0x0006);
        
        /* 获取校准的IF和VCO的补偿值 */
        temp    = A7102_Register_Read(Reg_Calibration);
        /* MVBS =1,MIFS = 1,在状态切换时使用手动校准 */
        temp   &= 0x00ef;
        temp   |= 0x4910;

        /* 返回校准的IF和VCO的补偿值 */
        return    temp;
}
/***********************************************
函 数:	A7102_Config_Chip()
功 能:	配置A7102参数寄存器 
输 入:	/
输 出:	/
描 述:	A7102使用12.8M晶体为基准源 
***********************************************/
void    A7102_Config_Chip(void)
{
        uint    temp = 0x0000;

        iSPI_Tre        = negative;
        iSPI_Trs        = negative;

        /* rate = 50kbps,IF = 100k,CSC[2:0] = 001,System clock = 64*IF = 6.4M */
        A7102_Register_Write(Reg_SystemClock,0x0079);
        
        /* TX = 434MHZ * 2 = (12.8mhz/(RRC[3:0]+1)) * (IP[7:0]+(FP[15:0]/65535)),RRC[3:0] = 0000,IP[7:0] = 0100 0011 */
        /* MDIV = 0,IP选择范围32 - 127 */
        A7102_Register_Write(Reg_PLL_I,0x0043);
        /* FP[15:0],默认434Mhz */
        A7102_Register_Write(Reg_PLL_II,0xcfff);
        /* default 0x0000,无调校 */
        A7102_Register_Write(Reg_PLL_III,0x0000);
        /* PDL[2:0] =011,HFB =0(<500mhz),VCS[1:0] =00,CPS =0(normal),CPC[1:0] =01(charge pump 1mA) */
        /* VCS[1:0] = 01,VCO电流控制为1,SDPW = 1 */
        A7102_Register_Write(Reg_PLL_IV,0x066c);        
        
        
#if     mode_modulation  
        /* TME =1,发射带调制,GS =0,高斯滤波器关闭,FX = 12.8M,FDP = 101,FD = 0010 0000,
           频偏 fdev = FX/(RRC[3:0]+1)*(FD[7:0]*(2^(FDP[2:0]))/8/65536),
                     = 12800khz * 32 * (2^5) /(2^19) 
                     = 25khz */
        A7102_Register_Write(Reg_TXI,0x1520);
           
#else         
        /* TME =0,发射未带调制,GS =0,高斯滤波器关闭,FX = 12.8M,
           频偏 fdev = FX/(RRC[3:0]+1)*(FD[7:0]*(2^(FDP[2:0]))/8/65536),
                     = 12800khz * 128 * (2^5) /(2^19)
                     = 100khz */
        A7102_Register_Write(Reg_TXI,0x0580);    
#endif

        /* 发射功率设置为最大功率 */
        A7102_Register_Write(Reg_TXII,0x0337);

        /* MPL[1:0] = 01,SLF[2:0] = 100,ETH[1:0] = 00,无位错误选择,DMOS = 0,DMG[1:0] = 01,增益X3 */
        /* BW[1:0] = 00,50Khz,ULS= 1,下旁波带,HGM =1,高增益 */
        A7102_Register_Write(Reg_RXI,0x1813);

        /* Amic推荐值 */
        A7102_Register_Write(Reg_RXII,0x500b);

        /* CDM =1,carrier 打开 */
        A7102_Register_Write(Reg_ADC,0x0000);
        
        /* TX fifo <8字节,RX fifo > 56字节时报警, */
        A7102_Register_Write(Reg_FIFO,0x4000|(C_FIFO_Byte-1));
        
        /* MCS = 0,Manchester打开,FECS = 0,FEC打开,CRCS =0,CRC打开,IDL =1,id code =4字节,PML[1:0] = 11,前导4字节 */
        A7102_Register_Write(Reg_Code,0x150f);

#if     mode_switch
        /* 打开位时钟,管脚控制收发,无载波侦测 */
        A7102_Register_Write(Reg_PinControl,0x0222);
#else
        // 打开位时钟,寄存器控制收发,无载波侦测 */
        A7102_Register_Write(Reg_PinControl,0x0022);
#endif

        /* VTL[2:0] = 100,VTH = VDD-0.5V, VTH[2:0] = 100,VTL =0.5V */
        A7102_Register_Write(Reg_Calibration,0x4886);
        
   	A7102_Register_Write(Reg_ModeControl,0x00e0); //STB2==>syn mode
	//delay 80us	
        for(temp = 0;temp < 0xffff;temp++)
        {
            _nop_();
            _nop_();
        }
}
/***********************************************
函 数:	Initialisation_RF()
功 能:	上电初始化A7102
输 入:	/
输 出:	/
描 述:	/
***********************************************/
void    Initialisation_RF(void)
{
        uint i;

        iSPI_PowerOn           = negative;
        /* A7102稳定时间延迟配置 */
        for(i = 0;i < 0xffff;i++)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
        iSPI_PowerOn        = positive;
        /* A7102稳定时间延迟配置 */
        for(i = 0;i < 0xffff;i++)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }	
        
        A7102_Reset_Chip();
        
        for(i = 0;i < 0xffff;i++)
        {
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
        
        /* XCC =1(crystal high current),XS =1(crystal on) */
        /* CGS = 0,因为使用标准12.8mhz晶体 */
        A7102_Register_Write(Reg_Crystal,0x0015);
        for(i = 0;i < 0xffff;i++)
        {
            _nop_();
            _nop_();
        }
        /* FMT =0,normal mode,FMS =1,FIFO mode,CER = 1,RF chip 使能,PLLE = 0,使用12.8Mhz标准晶体,PLL关闭 */
        A7102_Register_Write(Reg_ModeControl,0x00c0); //STB1==>standby mode
	//delay 0.5ms
	for(i = 0;i < 0xffff;i++)
        {
            _nop_();
            _nop_();
        }
        A7102_Id_Write(&id_buff);
        A7102_Id_Read(&rece_buff);
        
        A7102_Config_Chip();        
        
        TX_Freq_Calibration    = A7102_Calibration_Frequency(C_Tx_Frequency); 
        RX_Freq_Calibration    = A7102_Calibration_Frequency(C_Rx_Frequency);
     
        /* reset fifo */
        A7102_Reset_FifoRX();
        A7102_Reset_FifoTX();

        /* 默认接收状态 */
        A7102_Status_Receiver();     
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -