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

📄 8019.c.svn-base

📁 数字广播系统的开发源码
💻 SVN-BASE
字号:
#include "reg51.h"
#include "config.h"
//#include "GloblDef.h"
//#include "TCPIPmem.h"
#include "8019.h"
#include <stdio.h>
#include <absacc.h>

#define RTLBaseAddr 0x8000

/* to prevent call RTLSendPacket() when RTLSendPackt() is already is called, InSending
is used. example when process run in RTLSendPacket() and a interrupt ocurr then call
RTLSendPacket again, then the Register would have changed when interrupt return. */
static unsigned char xdata InSending;

static unsigned char xdata StartPageOfPacket;
/* receive head information */
/*struct RTLReceiveHeader
{
	unsigned char ReceiveStatus;
	unsigned char NextPacketStartPage;
	unsigned char PacketSizeLow;
	unsigned char PacketSizeHigh;
}Head;for some unknown resean Head must be a gloal value. */
static unsigned char xdata Head[4];

/* last trasmit start page */
static unsigned char xdata LastSendStartPage;

/****************************************************************************
* 名称:WriteReg()
* 功能:把数据写入RTL8019AS
* 入口参数:	chPort		写入地址
                chValue         写入数据
* 出口参数:无
****************************************************************************/
void  WriteReg(unsigned char chPort,unsigned char chValue)
{
        unsigned char xdata chWriteRegTmp = 0xff;
        unsigned int xdata RTLAddr = 0x00;


        //方法一:*((volatile unsigned short *) RTLBaseAddr + chPort) ,看不出地址
        RTLAddr = ((volatile unsigned short *) RTLBaseAddr + chPort);
        (*((volatile unsigned short *) RTLBaseAddr + chPort)) = chValue;
        //to debug
        chWriteRegTmp = (*((volatile unsigned short *) RTLBaseAddr + chPort));

        /*
        //方法二:用XBYTE直接读写
        XBYTE[RTLBaseAddr + chPort] = chValue;
        //to debug
        chWriteRegTmp = XBYTE[RTLBaseAddr + chPort]; */
        /*
        //方法三:*((volatile unsigned int *)RTLAddr)
        RTLAddr = RTLBaseAddr + chPort;
        (*((volatile unsigned int *)RTLAddr)) = chValue;
        //to debug
        chWriteRegTmp = (*((volatile unsigned int *)RTLAddr));*/
        /*
        //方法四:*((volatile unsigned char*)RTLAddr)
        RTLAddr = RTLBaseAddr + chPort;
        (*((volatile unsigned char*)RTLAddr)) = chValue;
        //to debug
        chWriteRegTmp = (*((volatile unsigned char*)RTLAddr));*/
        /*
        //方法五
        RTLAddr = ((volatile unsigned int*)RTLBaseAddr + chPort);
        *((volatile unsigned char xdata *)((volatile unsigned int*)RTLBaseAddr + chPort)) = chValue;
        chWriteRegTmp = *((volatile unsigned char xdata*)((volatile unsigned int*)RTLBaseAddr + chPort));
        */

//      RTLAddr = (unsigned int xdata *)(RTLBaseAddr + chPort);
//      XBYTE[RTLBaseAddr + chPort] = chValue;
//	*((volatile unsigned char xdata *)RTLAddr) = chValue;
	//*RTLAddr = chValue;

        //to debug
//        chWriteRegTmp = *((volatile unsigned char xdata *)RTLAddr);
       // chWriteRegTmp = *RTLAddr;

//       RTLAddr = RTLBaseAddr + chPort;
//       chWriteRegTmp  = XBYTE[RTLBaseAddr + chPort];

}

/****************************************************************************
* 名称:ReadReg()
* 功能:从RTL8019AS把数据读出
* 入口参数:	chPort          读出地址
* 出口参数:	Read读出数据
****************************************************************************/
unsigned char ReadReg(unsigned char chPort) reentrant
{
        unsigned char xdata chReadRegTmp = 0;
        unsigned int xdata RTLAddr = 0;

        //方法一
        RTLAddr = ((volatile unsigned short *) RTLBaseAddr + chPort);
	chReadRegTmp = (*((volatile unsigned short *)RTLBaseAddr + chPort));
	return chReadRegTmp;
        /*
        //方法二:用XBYTE直接读写
        RTLAddr =RTLBaseAddr + chPort;
	chReadRegTmp = XBYTE[RTLBaseAddr + chPort];
	return chReadRegTmp; */
        /*
        //方法三
        RTLAddr =RTLBaseAddr + chPort;
        chReadRegTmp  = (*((volatile unsigned int *)RTLAddr));
        return chReadRegTmp; */
        /*
        //方法四
        RTLAddr =RTLBaseAddr + chPort;
        chReadRegTmp  = (*((volatile unsigned char*)RTLAddr));
        return chReadRegTmp; */
        /*
        //方法五
        RTLAddr = ((volatile unsigned int*)RTLBaseAddr + chPort);
        chReadRegTmp  = *((volatile unsigned char xdata *)((volatile unsigned int*)RTLBaseAddr + chPort));
        return chReadRegTmp; */

}
/**********************************************************************
**函数原型:    void  RTLPage(unsigned char chPageNum)
**入口参数:?    unsigned char chPageNum: 要切换的页
**出口参数:	无
**返 回 值:	无
**说    明:	选择页,可选择0,1,2三页,第四页ne000兼容芯片保留,
set bit 7-6 in CR, CR_TXP must be 0(if 1 the packet is retrasmit)
************************************************************************/
void RTLPage(unsigned char chPageNum) reentrant
{
	unsigned char chTmp;
	chTmp= ReadReg(0x00);//command register
	chTmp = chTmp & 0x3B ;//注意txp位不能要
	chPageNum = chPageNum << 6;
	chTmp = chTmp | chPageNum;
	WriteReg(0x00,chTmp);
}

/**********************************************************************
**函数原型:    void 	SetMACAddr()
**入口参数:
**返 回 值:	无
**说    明:	设置芯片物理地址
************************************************************************/
void SetMACAddr(unsigned char xdata *MACAddr)
{
	//把MAC地址写入MY——MAC——ID中
	RTLPage(1);
	WriteReg(0x01 , MACAddr[0]);
        WriteReg(0x02 , MACAddr[1]);
        WriteReg(0x03 , MACAddr[2]);
        WriteReg(0x04 , MACAddr[3]);
        WriteReg(0x05 , MACAddr[4]);
        WriteReg(0x06 , MACAddr[5]);

	RTLPage(0);
}

/* reset rtl8019 and init registers, MacAddr is MAC address */
void RTL8019Init(unsigned char xdata *MACAddr) reentrant
{
	unsigned char xdata chRTLInitTmp = 0;
	unsigned int i;

	/* after hardware reset a longdelay is necessary for rtl to self-initial */
	//在RSTDRV从高电平回到低电平之后的100MS时,在对RTL8019做读写操作,以确保完全复位
        P35 = 1;
	for(i = 0;i < 40000;i++);
	P35 = 0;
	for(i = 0;i < 40000;i++);

	/* reset: write to reset prot */
        /*
        chRTLInitTmp = ReadReg(0x18);
        delay(100);
        WriteReg(0x18,0x00);
        delay(100);
        chRTLInitTmp = ReadReg(0x18);
        delay(100);

        chRTLInitTmp = ReadReg(0x1a);
        delay(100);
        WriteReg(0x1a,0x00);
        delay(100);
        chRTLInitTmp = ReadReg(0x1a);
        delay(100); */

        chRTLInitTmp = ReadReg(0x1c);
        WriteReg(0x1c,0x00);
        chRTLInitTmp = ReadReg(0x1c);
        delay(100);

        chRTLInitTmp = ReadReg(0x1f);
        WriteReg(0x1f,0x00);
        chRTLInitTmp = ReadReg(0x1f);
        delay(100);

        chRTLInitTmp = ReadReg(0x07);
        if((ReadReg(0x07) & 0x80) == 0)
        {
         chRTLInitTmp = 0xaa;
        }
        else
        {
         chRTLInitTmp = 0xbb;
        }

        //To debug

	/* init RTL registers*/
	WriteReg(0x00,0x21);
        chRTLInitTmp = ReadReg(0x00);
        //for(i = 0;i < 20000;i++);
        chRTLInitTmp = ReadReg(0x07);

        RTLPage(0);
        chRTLInitTmp = ReadReg(0x00);
        //for(i = 0;i < 20000;i++);
        WriteReg(0x0a,0x00);    //清RBCR0
        WriteReg(0x0b,0x00);    //清RBCR1
        WriteReg(0x0c,0xe0);    //RCR,监视模式,不接收数据报
        WriteReg(0x0d,0xe2);    //TCR,loopback模式

	WriteReg(0x01,0x4c);	/* Pstart	*/
	WriteReg(0x02,0x80);	/* Pstop	*/
	WriteReg(0x03,0x4c);	/* BNRY		*/
	WriteReg(0x04,0x40);	/* TPSR		*/

        WriteReg(0x07,0xFF);	/* ISR: Interrupt Status Register,write FF to clear up all interrupt status */
        WriteReg(0x0f,0x00);	/* IMR: Interrupt Mask Register,屏蔽掉所有中断 */
        //WriteReg(0x0e,0xC8);	/* DCR: Data Configuration Register*/

	//WriteReg(0x0c,0xCE);	/* RCR:  */
	//WriteReg(0x0d,0xE0);	/* TCR:  */

        //To debug
        chRTLInitTmp = ReadReg(0x07);
        chRTLInitTmp = ReadReg(0x0f);

        RTLPage(1);
        chRTLInitTmp = ReadReg(0x00);
	WriteReg(0x07,0x4d); //CURR,设置为指向当前正在写的页的下一页

	/* MAR0 */
	WriteReg(0x08,0x00);
	WriteReg(0x09,0x41);
	WriteReg(0x0a,0x00);
	WriteReg(0x0b,0x80);
	WriteReg(0x0c,0x00);
	WriteReg(0x0d,0x00);
	WriteReg(0x0e,0x00);
	WriteReg(0x0f,0x00);

	/* set phisical address */
        WriteReg(0x01,0x52);
        WriteReg(0x02,0x54);
        WriteReg(0x03,0x4c);
        WriteReg(0x04,0x19);
        WriteReg(0x05,0x57);
        WriteReg(0x06,0x42);

        //To debug
        RTLPage(0);
        chRTLInitTmp = ReadReg(0x00); //CR

        chRTLInitTmp = ReadReg(0x01); //CLDA0
        chRTLInitTmp = ReadReg(0x02); //CLDA1
        chRTLInitTmp = ReadReg(0x03); //BNRY
        chRTLInitTmp = ReadReg(0x04); //TSR
        chRTLInitTmp = ReadReg(0x05); //NCR
        chRTLInitTmp = ReadReg(0x06); //FIFO

        chRTLInitTmp = ReadReg(0x07); //ISR

        chRTLInitTmp = ReadReg(0x08); //CRDA0
        chRTLInitTmp = ReadReg(0x09); //CRDA1
        chRTLInitTmp = ReadReg(0x0a); //8019ID0
        chRTLInitTmp = ReadReg(0x0b); //8019ID1
        chRTLInitTmp = ReadReg(0x0c); //RSR
        chRTLInitTmp = ReadReg(0x0d); //CNTR0
        chRTLInitTmp = ReadReg(0x0e); //CNTR1
        chRTLInitTmp = ReadReg(0x0f); //CNTR2

        RTLPage(1);
        chRTLInitTmp = ReadReg(0x00);
        //PAR0~5
        chRTLInitTmp = ReadReg(0x01);
        chRTLInitTmp = ReadReg(0x02);
        chRTLInitTmp = ReadReg(0x03);
        chRTLInitTmp = ReadReg(0x04);
        chRTLInitTmp = ReadReg(0x05);
        chRTLInitTmp = ReadReg(0x06);
        //CURR
        chRTLInitTmp = ReadReg(0x07);
        //MAR0~7
        chRTLInitTmp = ReadReg(0x08);
        chRTLInitTmp = ReadReg(0x09);
        chRTLInitTmp = ReadReg(0x0a);
        chRTLInitTmp = ReadReg(0x0b);
        chRTLInitTmp = ReadReg(0x0c);
        chRTLInitTmp = ReadReg(0x0d);
        chRTLInitTmp = ReadReg(0x0e);
        chRTLInitTmp = ReadReg(0x0f);


	/* transimit start page */
	LastSendStartPage = SEND_START_PAGE0;          //SEND_START_PAGE0 = 0x40
	StartPageOfPacket = RECEIVE_START_PAGE + 1;    //RECEIVE_START_PAGE = 0x4c

	/* in the beginning, no packet is in sending */
	InSending = FALSE;
        //for(i = 0;i < 20000;i++);
	RTLPage(0);
        chRTLInitTmp = ReadReg(0x00);
        //for(i = 0;i < 20000;i++);
	/* initial over, start command and receive */
        WriteReg(0x0c,0xcc);                //将芯片置于正常模式,跟外部网络连接
        WriteReg(0x0d,0xe0);
        WriteReg(0x07,0xFF);
        chRTLInitTmp = ReadReg(0x07);       //清除所有中断标志位
	WriteReg(0x00,0x22);
        //for(i = 0;i < 20000;i++);                //(CR_PAGE0 | CR_ABORT_COMPLETE_DMA | CR_START_COMMAND));
        //chRTLInitTmp = ReadReg(0x00);
 }

⌨️ 快捷键说明

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