📄 8019.c.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 + -