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

📄 accept.c

📁 A7125无线模块
💻 C
字号:
/*********************************************************************
**  Device: A7125                                                   **
**  File:   main.c                                                  **
**                                                                  **
**  Description:                                                    **
**  This file is a sample code for your reference.                  **
**                                                                  **
**  Copyright (C) 2008 AMICCOM Corp.                                **
**                                                                  **
*********************************************************************/

#include <reg52.h>
#include "define.h"
#include "a7125reg.h"

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//                      I/O Declaration                             //
//           TODO: USER NEED CHANGE THIS SET TO FIT SYSTEM.         //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
sbit SCS    = P1^7;
sbit SCK    = P1^4;
sbit SDIO   = P1^5;
sbit GIO1   = P1^3;
sbit GIO2   = P1^2;
sbit LED1   = P3^7;
#define RF_WTR  GIO1
 

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//                    Global Variable Declaration                   //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Uint8		idata	RfBuf[64];
Uint8		idata	TmpUint8;

//-----------------------------------------------------------------------------
// 64 bytes PN9 pseudo random code
//-----------------------------------------------------------------------------
const Uint8 code PN9_Tab[]=
{   0xFF,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
    0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
    0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
    0x8A,0x15,0xA7,0xEC,0x92,0xDF,0x93,0x53,
    0x30,0x18,0xCA,0x34,0xBF,0xA2,0xC7,0x59,
    0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
    0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
    0xEA,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0
};

//-----------------------------------------------------------------------------
// RF ID code
//-----------------------------------------------------------------------------
const Uint8 code ID_Tab[4] =
{
    0x54, 0x75, 0xC5, 0x2A
};

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//                                   NOTE                                    !!
// !!         THIS CONFIG TABLE ONLY USE ON RF CRYSTAL = 16MHz               !!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
const Uint16 code A7125Config[] =
{
    //      address   name              Descript
    //      -------   ----              ---------
    0x00,   //0x00    MODE register,    only reset, not use on config
    0x62,   //0x01    MODE CTRL register,   FIFO mode, Enable ARSSI, Enable AIF
    0x00,   //0x02    CALIBRATION register,
    0x3F,   //0x03    FIFO1 register,
    0x00,   //0x04    FIFO2 register,
    0x00,   //0x05    FIFO register,    for fifo read/write
    0x00,   //0x06    IDDATA register,  for idcode
    0x00,   //0x07    RCOSC1 register,
    0x00,   //0x08    RCOSC2 register,
    0x00,   //0x09    RCOSC3 register,
    0x00,   //0x0A    CKO register,
    0x01,   //0x0B    GIO1 register,    WTR
    0x01,   //0x0C    GIO2 register,    WTR       
    0x1F,   //0x0D    DATARATE register,
    0x50,   //0x0E    PLL1 register,
    0x0E,   //0x0F    PLL2 register,    RFbase 2400.001MHz
    0x96,   //0x10    PLL3 register,
    0x00,   //0x11    PLL4 register,
    0x04,   //0x12    PLL5 register,
    0x3C,   //0x13    chanel group I,
    0x78,   //0x14    chanel group II,
    0xD7,   //0x15    TX1 register,
    0x40,   //0x16    TX2 register,
    0x10,   //0x17    DELAY1 register,
    0x61,   //0x18    DELAY2 register,
    0x62,   //0x19    RX register,
    0xA0,   //0x1A    RXGAIN1 register,
    0x00,   //0x1B    RXGAIN2 register,
    0x00,   //0x1C    RXGAIN3 register,
    0xD2,   //0x1D    RXGAIN4 register,
    0x00,   //0x1E    RSSI register,
    0xE2,   //0x1F    ADC register,
    0x07,   //0x20    CODE1 register,
    0x56,   //0x21    CODE2 register,
    0x2A,   //0x22    CODE3 register,
    0x06,   //0x23    IFCAL1 register,
    0x00,   //0x24    IFCAL2 register,  only read
    0x05,   //0x25    VCOCCAL register,
    0x44,   //0x26    VCOCAL1 register,
    0x80,   //0x27    VCOCAL2 register,
    0x30,   //0x28    VCO DEV Cal. I register,
    0x20,   //0x29    VCO DEV Cal. II register,
    0x80,   //0x2A    VCO DEV Cal. III register,
    0x00,   //0x2B    VCO Mod. delay register
    0x7A,   //0x2C    BATTERY register,
    0x2F,   //0x2D    TXTEST register,
    0x47,   //0x2E    RXDEM1 register,
    0x80,   //0x2F    RXDEM2 register,
    0xF1,   //0x30    CPC1 register,
    0x11,   //0x31    CPC2 register,
    0x04,   //0x32    CRYSTAL register,
    0x45,   //0x33    PLLTEST register,
    0x18,   //0x34    VCOTEST register,
    0x10,   //0x35    RF Analog Test
    0xFF,   //0x36    IFAT register,
    0x37,   //0x37    Channel select register,
    0xFF    //0x38    VRB register
};


/*********************************************************************
**  function Declaration
*********************************************************************/
void A7125_WriteReg(Uint8, Uint8);
Uint8 A7125_ReadReg(Uint8);
void StrobeCmd(Uint8 src);
void ByteSend(Uint8 src);
void A7125_Reset(void);
void A7125_WriteID(void);
void initRF(void);
void A7125_Config(void);
void A7125_Cal(void);
Uint8 ByteRead(void);
void ReadFIFO(Uint8 length);
void WriteFIFO(Uint8 length);
void Delay1ms(Uint8 n); 



/*********************************************************************
* main loop
*********************************************************************/
void main(void)
{	 //unsigned int aa;
     unsigned char flag=0;
     LED1=0;
     Delay1ms(50);          // 等待晶体稳定
     initRF();
     StrobeCmd(CMD_STBY);
     A7125_WriteReg(TXTEST_REG,0x17);         // 	 发送功率0DB
     //A7125_WriteReg(DATARATE_REG,0x1F);     //  速率2M
	 A7125_WriteReg( DATARATE_REG, 0x5F );    //1M
     A7125_WriteReg(MODECTRL_REG,0x62);      //  FIFO模式
     A7125_WriteReg(PLL1_REG,160);           //   频道100
     A7125_WriteReg(CODE1_REG,0x0F);         //  使能CRC检测

     A7125_WriteReg(FIFO1_REG,8-1);         // set FIFO length 
    StrobeCmd(CMD_RX);			        //设置成接收模式
    while(1)						 
    {
	   	  //A7125_WriteReg(FIFO1_REG,8-1);         // set FIFO length	
		  // StrobeCmd(CMD_RX);			        //设置成接收模式
	     while(GIO1);
		   GIO1=1;	        LED1=0;            TmpUint8 = A7125_ReadReg(MODE_REG);            if((TmpUint8&0x20)==0)           {                ReadFIFO(8);	//读数据
		//	Delay1ms(1);  
		      WriteFIFO( 8 );    // 写数据
		    //Delay1ms(1); 
			  //A7125_WriteReg(PLL1_REG,160);           //   频道100 
		      StrobeCmd( CMD_TX );	 //发送数据
           //while( RF_WTR );        
		     while(GIO1);        // 等待发送完成
			      GIO1=1;	              LED1=1;
	       }
		  initRF();
		 A7125_WriteReg(FIFO1_REG,8-1);
		     
		 StrobeCmd(CMD_RX);


    }
}

/*********************************************************************
** Err_State
*********************************************************************/
void Err_State(void)
{
    //ERR display
    //Error Proc...
    while(1)
    {
        ;
    }
}

/************************************************************************
**  A7125_WriteReg
************************************************************************/
void A7125_WriteReg(Uint8 addr, Uint8 dataByte)
{
    Uint8 i;

    SCS = 0;
    addr |= 0x00; //bit cmd=0,r/w=0
    for(i = 0; i < 8; i++)
    {
        if(addr & 0x80)
            SDIO = 1;
        else
            SDIO = 0;

        SCK = 1;
        _nop_();
        SCK = 0;
        addr = addr << 1;
    }
    _nop_();

    //send data byte
    for(i = 0; i < 8; i++)
    {
        if(dataByte & 0x80)
            SDIO = 1;
        else
            SDIO = 0;

        SCK = 1;
        _nop_();
        SCK = 0;
        dataByte = dataByte << 1;
    }
    SCS = 1;
}

/************************************************************************
**  A7125_ReadReg
************************************************************************/
Uint8 A7125_ReadReg(Uint8 addr)
{
    Uint8 i;
    Uint8 tmp;

    SCS = 0;
    addr |= 0x40; //bit cmd=0,r/w=1
    for(i = 0; i < 8; i++)
    {

        if(addr & 0x80)
            SDIO = 1;
        else
            SDIO = 0;

        _nop_();
        SCK = 1;
        _nop_();
        SCK = 0;

        addr = addr << 1;
    }

    _nop_();
    SDIO = 1;

    //read data
    for(i = 0; i < 8; i++)
    {
        if(SDIO)
            tmp = (tmp << 1) | 0x01;
        else
            tmp = tmp << 1;

        SCK = 1;
        _nop_();
        SCK = 0;
    }
    SCS = 1;
    return tmp;
}


/*********************************************************************
** Strobe Command
*********************************************************************/
void StrobeCmd(Uint8 src)
{
    Uint8 i;

    SCS = 0;
    for(i = 0; i < 8; i++)
    {
        if(src & 0x80)
            SDIO = 1;
        else
            SDIO = 0;

        _nop_();
        SCK = 1;
        _nop_();
        SCK = 0;
        src = src << 1;
    }
    SCS = 1;
}

/************************************************************************
**  ByteSend
************************************************************************/
void ByteSend(Uint8 src)
{
    Uint8 i;

    for(i = 0; i < 8; i++)
    {
        if(src & 0x80)
            SDIO = 1;
        else
            SDIO = 0;

        _nop_();
        SCK = 1;
        _nop_();
        SCK = 0;
        src = src << 1;
    }
}

/************************************************************************
**  WriteID
************************************************************************/
void A7125_WriteID(void)
{
    Uint8 i;
    Uint8 addr;

    addr = IDCODE_REG; //send address 0x06, bit cmd=0, r/w=0
    SCS = 0;
    ByteSend(addr);
    for (i=0; i < 4; i++)
        ByteSend(ID_Tab[i]);
    SCS = 1;
}

/************************************************************************
**  Reset_RF
************************************************************************/
void A7125_Reset(void)
{
    A7125_WriteReg(MODE_REG, 0x00); //reset RF chip
}
/*********************************************************************
** CHGroupCal
*********************************************************************/
void CHGroupCal(Uint8 ch)
{
    Uint8 tmp;
    Uint8 vb,vbcf;
    Uint8 vcb,vccf;

    A7125_WriteReg(PLL1_REG, ch);
    A7125_WriteReg(CALIBRATION_REG, 0x1C);
    do
    {
        tmp = A7125_ReadReg(CALIBRATION_REG);
        tmp &= 0x1C;
    }
    while (tmp);

    //for check
    tmp = A7125_ReadReg(VCOCAL1_REG);
    vb = tmp & 0x07;
    vbcf = (tmp >>3) & 0x01;

    tmp = A7125_ReadReg(VCOCCAL_REG);
    vcb = tmp & 0x0F;
    vccf= (tmp >> 4) & 0x01;

    if (vbcf || vccf)
       Err_State();//error
}

/*********************************************************************
** calibration
*********************************************************************/
void A7125_Cal(void)
{
    Uint8 tmp;
    Uint8 fb,fbcf,fcd;
    Uint8 dvt;

    //calibration RSSI,IF procedure
    StrobeCmd(CMD_PLL);
    A7125_WriteReg(CALIBRATION_REG, 0x03);
    do
    {
        tmp = A7125_ReadReg(CALIBRATION_REG);
        tmp &= 0x03;
    }
    while (tmp);

    //calibration VCO dev,VBC,VCC procedure

    CHGroupCal(30);     //calibrate channel group Bank I
    CHGroupCal(90);     //calibrate channel group Bank II
    CHGroupCal(150);    //calibrate channel group Bank III
    StrobeCmd(CMD_STBY); //return to STBY state

    //for check
    tmp = A7125_ReadReg(IFCAL1_REG);
    fb = tmp & 0x0F;
    fbcf = (tmp >>4) & 0x01;

    tmp = A7125_ReadReg(IFCAL2_REG);
    fcd = tmp & 0x1F;

    tmp = A7125_ReadReg(VCOCAL2_REG);
    dvt = tmp;

    if (fbcf)
        Err_State(); //error
}

/*********************************************************************
** A7125_Config
*********************************************************************/
void A7125_Config(void)
{
    Uint8 i;

    //0x00 mode register, for reset
    //0x05 fifo data register
    //0x06 id code register
    //0x24 IF calibration II, only read

    for ( i=0x01; i<=0x38; i++ )
    {
        if ( (i==0x05) || (i==0x06) || (i==0x24) )
            continue;

        A7125_WriteReg( i, A7125Config[i] );
    }
}

/*********************************************************************
** initRF
*********************************************************************/
void initRF(void)
{
    //init io pin
    SCS = 1;
    SCK = 0;
    SDIO = 1;
    GIO1 = 1;
    GIO2 = 1;

    A7125_Reset();      //reset A7125 RF chip
    A7125_WriteID();    //write ID code
    A7125_Config();     //config A7125 chip
    A7125_Cal();        //calibration IF,vco, vcoc
}

//**********************************************************************
//  ByteRead
//**********************************************************************
Uint8 ByteRead(void)
{
    Uint8 i,tmp;

    SDIO = 1; //sdio pull high
    for(i = 0; i < 8; i++)
    {
        if(SDIO)
            tmp = (tmp << 1) | 0x01;
        else
            tmp = tmp << 1;
        SCK = 1;
        _nop_();
        SCK = 0;
    }
    return tmp;
}

//**********************************************************************
//  ReadFIFO
//**********************************************************************
void ReadFIFO(Uint8 length)
{
    Uint8 i;

    SCS = 0;
    ByteSend(FIFO_REG | 0x40);
    for(i = 0; i <length; i++)
        RfBuf[i] = ByteRead();
    SCS=1;
}
//**********************************************************************
//  WriteFIFO
//**********************************************************************
void WriteFIFO(Uint8 length)
{
    Uint8 i;
    A7125_WriteReg( FIFO1_REG, length-1);   // set FIFO length
    StrobeCmd(CMD_TFR);                     // Reset TX FIFO point
    
    SCS=0;
    ByteSend(FIFO_REG);
    for(i=0; i <length; i++)
        ByteSend(PN9_Tab[i]);
    SCS=1;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//                      DELAY 1MS FUNCTION                          //
//           USER NEED CHANGE THIS FUNCTION TO FIT SYSTEM.          //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void Delay1ms(Uint8 n)
{
    Uint8 i, j;
    while(n--)
    {
        for(j = 0; j < 6; j ++)
        {
            for(i = 0; i < 235; i ++)
            {
                _nop_();
                _nop_();
                _nop_();
                _nop_();
            }
        }
    }
}


⌨️ 快捷键说明

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