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

📄 main.c

📁 A7125无线模块
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************                                                                   **
**  Device:     A7125
**  File:		main.c
**  Author:		JPH
**  Target:		Winbond W77LE58
**  Tools:		ICE
**  Created:	2009-04-22
**  Description:
**  This file is a sample code for your reference.
**
**  Copyright (C) 2008 AMICCOM Corp.
**
*********************************************************************/
#include "define.h"
#include "w77le58.h"
#include "a7125reg.h"
#include "Uti.h"

/*********************************************************************
**  I/O Declaration
*********************************************************************/
#define SCS       	P1_0		//spi SCS
#define SCK      	P1_1		//spi SCK
#define SDIO      	P1_2		//spi SDIO
#define CKO       	P1_3		//CKO
#define GIO1      	P1_4		//GIO1
#define GIO2    	P1_5		//GIO2

/*********************************************************************
**  Constant Declaration
*********************************************************************/
#define TIMEOUT     	50
#define t0hrel      	1000

/*********************************************************************
**  Global Variable Declaration
*********************************************************************/
Uint8		data 	timer;
Uint8		data 	TimeoutFlag;
Uint16		idata 	RxCnt;
Uint32		idata	Err_ByteCnt;
Uint32		idata	Err_BitCnt;
Uint16		idata	TimerCnt0;
Uint8      	data    *Uartptr;
Uint8		data	UartSendCnt;
Uint8		data	CmdBuf[12];
Uint8		xdata	tmpbuf[64];
Uint8       idata   Err_Frame;

const Uint8 code BitCount_Tab[16] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
const Uint8 code ID_Tab[4]={0x34,0x75,0xC5,0x2A}; //ID 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
};	// This table are 64bytes PN9 pseudo random code.

const Uint16 code A7125Config[]=
{
	0x00, //MODE register,		only reset, not use on config
	0x42, //MODE CTRL register,
	0x00, //CALIBRATION register,
	0x3F, //FIFO1 register,
	0x00, //FIFO2 register,
	0x00, //FIFO register,		for fifo read/write
	0x00, //IDDATA register,	for idcode
	0x00, //RCOSC1 register,
	0x00, //RCOSC2 register,
	0x00, //RCOSC3 register,
	0x00, //CKO register,
	0x01, //GPIO1 register
	0x00, //GPIO2 register,
	0x1F, //DATARATE register,
	0x50, //PLL1 register,
	0x0E, //PLL2 register, 		RFbase 2400.001MHz
	0x96, //PLL3 register,
	0x00, //PLL4 register,
	0x04, //PLL5 register,
	0x3C, //chanel group I,
	0x78, //chanel group II,
	0xD7, //TX1 register,
	0x40, //TX2 register,
	0x10, //DELAY1 register,
	0x61, //DELAY2 register,
	0x62, //RX register,
	0xA0, //RXGAIN1 register,
	0x00, //RXGAIN2 register,
	0x00, //RXGAIN3 register,
	0xD2, //RXGAIN4 register,
	0x00, //RSSI register,
	0xE2, //ADC register,
	0x07, //CODE1 register,
	0x56, //CODE2 register,
	0x2A, //CODE3 register,
	0x06, //IFCAL1 register,
	0x00, //IFCAL2 register,    only read
	0x05, //VCOCCAL register,
	0x44, //VCOCAL1 register,
	0x80, //VCOCAL2 register,
	0x30, //VCO DEV Cal. I register,
	0x20, //VCO DEV Cal. II register,
	0x80, //VCO DEV Cal. III register,
	0x00, //VCO Mod. delay register
	0x7A, //BATTERY register,
	0x2F, //TXTEST register,
	0x47, //RXDEM1 register,
	0x80, //RXDEM2 register,
	0xF1, //CPC1 register,
	0x11, //CPC2 register,
	0x04, //CRYSTAL register,
	0x45, //PLLTEST register,
	0x18, //VCOTEST register,
    0x10, //RF Analog Test
	0xFF, //IFAT register,
	0x37, //Channel select register,
	0xFF  //VRB register
};

/*********************************************************************
**  function Declaration
*********************************************************************/
void InitTimer0(void);
void initUart0(void);
void Timer0ISR (void);
void Uart0Isr(void);
void A7125_Reset(void);
void A7125_WriteReg(Uint8, Uint8);
Uint8 A7125_ReadReg(Uint8);
void ByteSend(Uint8 src);
Uint8 ByteRead(void);
void A7125_WriteID(void);
void A7125_WriteFIFO(void);
void initRF(void);
void A7125_Config(void);
void A7125_Cal(void);
void RxPacket(void);
void StrobeCmd(Uint8);
void SetCH(Uint8);
void CHGroupCal(Uint8);

/*********************************************************************
* main loop
*********************************************************************/
void main(void)
{
    //initsw
    PMR |= 0x01; //set DME0

    //initHW
    P0 = 0xFF;
    P1 = 0xFF;
    P2 = 0xFF;
    P3 = 0xFF;
    P4 = 0x0F;

    InitTimer0();
    initUart0();
    TR0=1;
    EA=1;

	if ((P4 & 0x04)==0x04) //if P4.2=1, master
	{
		initRF();
        StrobeCmd(CMD_STBY);

		while(1)
		{
		    A7125_WriteFIFO(); //write data to tx fifo
		    SetCH(100); //freq 2450.001MHz
   		    StrobeCmd(CMD_TX); //entry tx
    		while(GIO1); //wait transmit completed

    		SetCH(96); //freq 2448.001MHz
    		StrobeCmd(CMD_RX); //entry rx

    		timer=0;
			TimeoutFlag=0;
			while(GIO1==1 && TimeoutFlag==0); //wait receive completed
			if (TimeoutFlag)
			{
			    StrobeCmd(CMD_STBY); //exit rx mode
				continue;
			}

		    RxPacket();
            Delay10ms(1);
    	}
	}
	else //if P4.2=0, slave
	{
		initRF();
		StrobeCmd(CMD_STBY);

		RxCnt = 0;
		Err_ByteCnt = 0;
		Err_BitCnt = 0;
    	TR0 = 1;

		while(1)
        {
            SetCH(96); //freq 2448.001MHz
            StrobeCmd(CMD_RX); //entry rx
    	    while(GIO1); //wait receive completed
   			RxPacket();

		    A7125_WriteFIFO(); //write data to tx fifo
		    SetCH(100); //freq 2450.001MHz
   		    StrobeCmd(CMD_TX); //entry tx
    		while(GIO1); //wait transmit completed
        }
	}
}

/************************************************************************
**  init Timer0
************************************************************************/
void InitTimer0(void)
{
    TR0 = 0;
    TMOD =(TMOD & 0xF0)|0x01; //timer0 mode=1
    TH0 = (65536-t0hrel)>>8; // Reload Timer0 high byte,low byte
    TL0 = 65536-t0hrel;
    TF0 = 0; // Clear any pending Timer0 interrupts
    ET0 = 1; // Enable Timer0 interrupt
}

/************************************************************************
**  Timer0ISR
************************************************************************/
void Timer0ISR (void) interrupt 1
{
    TF0 = 0; // Clear Timer0 interrupt
    TH0 = (65536-t0hrel)>>8; // Reload Timer0 high byte,low byte
    TL0 = 65536-t0hrel;

    timer++;
    if (timer == TIMEOUT)
    {
        TimeoutFlag=1;
    }

    TimerCnt0++;
    if (TimerCnt0 == 500)
    {
        TimerCnt0 = 0;
        CmdBuf[0] = 0xF1;

        memcpy(&CmdBuf[1], &RxCnt, 2);
        memcpy(&CmdBuf[3], &Err_ByteCnt, 4);
        memcpy(&CmdBuf[7], &Err_BitCnt, 4);
        memcpy(&CmdBuf[11], &Err_Frame, 1);

        UartSendCnt = 12;
		Uartptr =& CmdBuf[0];
        SBUF = CmdBuf[0];
    }
}

/************************************************************************
**  Init Uart0
************************************************************************/
void initUart0(void)
{
    TH1 = 0xFD; //BaudRate 9600;
    TL1 = 0xFD;
    SCON = 0x40;
    TMOD = (TMOD & 0x0F) | 0x20;
    REN = 1;
    TR1 = 1;
    ES = 1;
}

/************************************************************************
**  Uart0 ISR
************************************************************************/
void Uart0Isr(void) interrupt 4 using 3
{
    if (TI==1)
    {
        TI=0;
        UartSendCnt--;
        if(UartSendCnt !=0)
        {
            Uartptr++;
            SBUF = *Uartptr;
        }
    }
}

/************************************************************************
**  Reset_RF
************************************************************************/
void A7125_Reset(void)
{
	A7125_WriteReg(MODE_REG, 0x00); //reset RF chip
}

/************************************************************************
**  WriteID
************************************************************************/
void A7125_WriteID(void)
{
	Uint8 i;
	Uint8 d1,d2,d3,d4;
	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;

    //for check
	addr = IDCODE_REG | 0x40; //send address 0x06, bit cmd=0, r/w=1
	SCS=0;
	ByteSend(addr);
	d1=ByteRead();
	d2=ByteRead();
	d3=ByteRead();
	d4=ByteRead();
	SCS=1;
}

/************************************************************************
**  A7125_WriteReg
************************************************************************/
void A7125_WriteReg(Uint8 addr, Uint8 dataByte)

⌨️ 快捷键说明

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