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

📄 rtl8019as(backup).c

📁 S3C44B0X接8019的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 #include <string.h>
#include <stdio.h>
#include "rtl8019as.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\def.h"


unsigned short MAC_Buf[3] = {0x0020, 0x4a86, 0x0000};
unsigned char	MAR_Buf[8] = {0xAC, 0xAC, 0x10, 0x10, 0x03, 0x03, 0x08, 0x08};
void DelayMs(unsigned short MSecond);
void RTL8019AS_Rreset();
void Page(unsigned char PageNo);
void LookPointer(unsigned char PageNo);
void RegTest();
void PrintProtocalS(union Frame8019 *Packet);
void __irq rtl8019INT(void)
{
	unsigned char HSYNC;
	HSYNC = rEXTINTPND;			//read the interrup condition
	rEXTINTPND=0xf;					//clear ExINTPEND reg
	rI_ISPC |= BIT_EINT4567;		//clear pending bit
	OUT_B(P0_ISR, 0xFF);
}

void InitRTL8019AS()
{
	unsigned char val;

	RTL8019AS_Rreset();		// 网卡复位	
	Uart_Printf("\nTest InitRTL8019AS() _  P_CR =  %x\n", IN_B(P_CR));
	OUT_B(P_CR, 0x21);			// 置CR:选择页0的寄存器,网卡停止运行,因为还没有初始化;	
	DelayMs(10);				// 延时10毫秒,确保芯片进入停止模式;

	// 监控、内回馈模式,与外部网络断开。
	OUT_B(P0_RBCR0, 0x00);		// 给远程DMA字节计数器低字节清0;
	OUT_B(P0_RBCR1, 0x00);		// 给远程DMA字节计数器高字节清0;
	OUT_B(P0_RCR, 0xE0);			// 监控模式(不收包),MAC匹配,错误、少字、广播、组播被拒;
	OUT_B(P0_TCR, 0xE2);			// 内部回馈模式,产生但不监测CRC。
	// 使用0x40-0x4B为网卡的发送缓冲区,共12页刚好可以存储2个最大的以太网包;
	// 使用0x4c-0x7f为网卡的接收缓冲区,共52页。
	OUT_B(P0_PSTART, 0x4C);		// 设接收缓冲区起始地址为0x4c;
	OUT_B(P0_PSTOP, 0x80);		// 设接收缓冲区结束地址为0x80(第0x7f页有效);
	OUT_B(P0_BNRY, 0x4C);		// 设接收缓冲区读页指针为0x4c;
	OUT_B(P0_TPSR, 0x40);		// 设发送缓冲区起始地址为0x40。
	OUT_B(P0_ISR, 0xFF);		// 清除中断状态寄存器所有中断标志位;
	OUT_B(P0_IMR, 0x00);		// 设中断屏蔽寄存器,屏蔽所有中断。
//	OUT_B(P0_DCR, 0xC9);		// 置数据配置寄存器:FIFO开始;高字节MD15-8,低字节MD7-0;16位DMA方式。
	OUT_B(P0_DCR, 0xC8);		// 置数据配置寄存器:FIFO开始;高字节MD15-8,低字节MD7-0;8位DMA方式。

//LookPointer(0);
	OUT_B(P_CR, 0x61);				// 设命令寄存器:选择页1的寄存器,网卡停止运行。
	OUT_B(P1_CURR, 0x4D);		// 置当前页寄存器:指向当前正在写的页的下一页,
	// 初始化时指向0x4c+1=0x4d。
//LookPointer(1);
	OUT_B(P1_MAR0, MAR_Buf[0]);		// 设组播地址寄存器0值
	OUT_B(P1_MAR1, MAR_Buf[1]);		// 设组播地址寄存器1值
	OUT_B(P1_MAR2, MAR_Buf[2]);		// 设组播地址寄存器2值
	OUT_B(P1_MAR3, MAR_Buf[3]);		// 设组播地址寄存器3值
	OUT_B(P1_MAR4, MAR_Buf[4]);		// 设组播地址寄存器4值
	OUT_B(P1_MAR5, MAR_Buf[5]);		// 设组播地址寄存器5值
	OUT_B(P1_MAR6, MAR_Buf[6]);		// 设组播地址寄存器6值
	OUT_B(P1_MAR7, MAR_Buf[7]);		// 设组播地址寄存器7值
	OUT_B(P1_PAR0, MAC_Buf[0]&0xff);		// 设物理地址寄存器0值
	OUT_B(P1_PAR1, MAC_Buf[0]>>8);		// 设物理地址寄存器1值
//LookPointer(1);
	OUT_B(P1_PAR2, MAC_Buf[1]&0xff);		// 设物理地址寄存器2值
//LookPointer(1);

	OUT_B(P1_PAR3, MAC_Buf[1]>>8);		// 设物理地址寄存器3值
	OUT_B(P1_PAR4, MAC_Buf[2]&0xff);		// 设物理地址寄存器4值
	OUT_B(P1_PAR5, MAC_Buf[2]>>8);		// 设物理地址寄存器5值


	// 将网卡设置成正常的模式,跟外部网络连接
	OUT_B(P_CR, 0x21);			// 设命令寄存器:选择页0的寄存器,网卡停止运行;

	OUT_B(P0_RCR, 0xCC);		// 设接收配置寄存器:使用接收缓冲区,
								// 仅接收自己地址的数据包(以及广播地址数据包)和
								// 多点播送地址包,小于64字节的包丢弃,
								// 校验错的数据包不接收;

//OUT_B(P0_RCR, 0xDF);   //全要

	OUT_B(P0_TCR, 0xE0);		// 设发送配置寄存器:启用CRC自动生成和自动校验,
	// 工作在正常模式;


	OUT_B(P_CR, 0x22);		// 设命令寄存器:选择页0的寄存器,让8019芯片开始工作;

	OUT_B(P0_ISR, 0xFF);		// 设中断状态寄存器:清除中断状态寄存器所有中断标志位。

}

void InitRTL8019AS4()
{
	unsigned char val;

	RTL8019AS_Rreset();		// 网卡复位	
	OUT_B(P_CR, 0x21);			// 置CR:选择页0的寄存器,网卡停止运行,因为还没有初始化;	
	DelayMs(10);				// 延时10毫秒,确保芯片进入停止模式;
	Uart_Printf("\nTest InitRTL8019AS() _   LoopBack");

	OUT_B(P0_PSTART, 0x4C);	// 设接收缓冲区起始地址为0x4c;
	OUT_B(P0_PSTOP, 0x80);		// 设接收缓冲区结束地址为0x80(第0x7f页有效);
	OUT_B(P0_BNRY, 0x4C);		// 设接收缓冲区读页指针为0x4c;
	OUT_B(P0_TPSR, 0x40);		// 设发送缓冲区起始地址为0x40。
LookPointer(0);

	// 监控、内回馈模式,与外部网络断开。
	OUT_B(P0_RCR, 0x00); 
	Page(1);
	OUT_B(P1_CURR, 0x4D);	

	OUT_B(P1_PAR0, MAC_Buf[0]&0xff);		// 设物理地址寄存器0值
LookPointer(1);		
	OUT_B(P1_PAR1, MAC_Buf[0]>>8);		// 设物理地址寄存器1值
LookPointer(1);	
	OUT_B(P1_PAR2, MAC_Buf[1]&0xff);		// 设物理地址寄存器2值
LookPointer(1);	
	OUT_B(P1_PAR3, MAC_Buf[1]>>8);		// 设物理地址寄存器3值
	OUT_B(P1_PAR4, MAC_Buf[2]&0xff);		// 设物理地址寄存器4值
	OUT_B(P1_PAR5, MAC_Buf[2]>>8);		// 设物理地址寄存器5值
LookPointer(1);
	Page(0);
	OUT_B(P0_DCR, 0x40);
	OUT_B(P0_TCR, 0x02);	
	OUT_B(P0_ISR, 0xFF);		// 清除中断状态寄存器所有中断标志位;
LookPointer(0);
}

void InitRTL8019AS1()
{
	unsigned char val;

	RTL8019AS_Rreset();		// 网卡复位	

	OUT_B(P_CR, 0x21);			// 置CR:选择页0的寄存器,网卡停止运行,因为还没有初始化;	
	DelayMs(10);				// 延时10毫秒,确保芯片进入停止模式;
	Uart_Printf("\nTest InitRTL8019AS() _   DelayMs(10)");

	OUT_B(P0_PSTART, 0x4C);		// 设接收缓冲区起始地址为0x4c;
	OUT_B(P0_PSTOP, 0x80);		// 设接收缓冲区结束地址为0x80(第0x7f页有效);
	OUT_B(P0_BNRY, 0x4C);		// 设接收缓冲区读页指针为0x4c;
	OUT_B(P0_TPSR, 0x40);		// 设发送缓冲区起始地址为0x40。
	OUT_B(P0_TCR, 0xE0);
	OUT_B(P0_ISR, 0xFF);		// 清除中断状态寄存器所有中断标志位;
	OUT_B(P0_IMR, 0x00);		// 设中断屏蔽寄存器,屏蔽所有中断。
	OUT_B(P0_DCR, 0xC8);		// 置数据配置寄存器:FIFO开始;高字节MD15-8,低字节MD7-0;8位DMA方式。
	OUT_B(P0_RCR, 0xDF); 
	OUT_B(P0_RBCR0, 0x00);		// 给远程DMA字节计数器低字节清0;
	OUT_B(P0_RBCR1, 0x00);		// 给远程DMA字节计数器高字节清0;

	OUT_B(P_CR, 0x61);

	DelayMs(10);
	OUT_B(P1_CURR, 0x4D);		// 置当前页寄存器:指向当前正在写的页的下一页,
/*	OUT_B(P1_MAR0, MAR_Buf[0]);		// 设组播地址寄存器0值
	OUT_B(P1_MAR1, MAR_Buf[1]);		// 设组播地址寄存器1值
	OUT_B(P1_MAR2, MAR_Buf[2]);		// 设组播地址寄存器2值
	OUT_B(P1_MAR3, MAR_Buf[3]);		// 设组播地址寄存器3值
	OUT_B(P1_MAR4, MAR_Buf[4]);		// 设组播地址寄存器4值
	OUT_B(P1_MAR5, MAR_Buf[5]);		// 设组播地址寄存器5值
	OUT_B(P1_MAR6, MAR_Buf[6]);		// 设组播地址寄存器6值
	OUT_B(P1_MAR7, MAR_Buf[7]);		// 设组播地址寄存器7值
	OUT_B(P1_PAR0, MAC_Buf[0]);		// 设物理地址寄存器0值
	OUT_B(P1_PAR1, MAC_Buf[1]);		// 设物理地址寄存器1值
	OUT_B(P1_PAR2, MAC_Buf[2]);		// 设物理地址寄存器2值
	OUT_B(P1_PAR3, MAC_Buf[3]);		// 设物理地址寄存器3值
	OUT_B(P1_PAR4, MAC_Buf[4]);		// 设物理地址寄存器4值
	OUT_B(P1_PAR5, MAC_Buf[5]);		// 设物理地址寄存器5值
*/
	OUT_B(P_CR, 0x22);			// 置CR:选择页0的寄存器,让8019芯片开始工作;
	
	
}

void DelayMs(unsigned short MSecond)
{	
	int i,j;

	for(i=0; i<MSecond;i++)
	{
		for(j=0; j< 5000;j++)
			;
	}
}


void Page(unsigned char PageNo)		// 设置寄存器页数
{
	unsigned char ByteVal;

//Uart_Printf("PageNo=[%d].\n",PageNo);
	ByteVal=IN_B(P_CR);
//Uart_Printf("ByteVal.in=[%x].\n",ByteVal);
	ByteVal=(ByteVal&0x3f)|(PageNo<<6)|0x20;
//Uart_Printf("ByteVal.out=[%x].\n",ByteVal);
	OUT_B(P_CR, ByteVal);
}

void RTL8019AS_Rreset()	// 网卡复位
{
	unsigned char val;

	val = IN_B(P_RESET);
	OUT_B(P_RESET, val);
	DelayMs(100);
}

void InitRTL8019AS3()
{
	unsigned char val;

	RTL8019AS_Rreset();		// 网卡复位	
	OUT_B(P_CR, 0x21);		//选择页0寄存器,网卡停止运行
	OUT_B(P0_PSTART, 0x4C);	// 设接收缓冲区起始地址为0x4c;
	OUT_B(P0_PSTOP, 0x80);		// 设接收缓冲区结束地址为0x80(第0x7f页有效);
	OUT_B(P0_BNRY, 0x4C);		// 设接收缓冲区读页指针为0x4c;
	OUT_B(P0_TPSR, 0x40);		// 设发送缓冲区起始地址为0x40。
	OUT_B(P0_TCR, 0xE0);		
	OUT_B(P0_DCR, 0xC8);		// 置数据配置寄存器:FIFO开始;高字节MD15-8,低字节MD7-0;8位DMA方式。
	OUT_B(P0_ISR, 0xFF);		// 清除中断状态寄存器所有中断标志位;
	OUT_B(P0_IMR, 0x00);		// 设中断屏蔽寄存器,屏蔽所有中断。

////////////////////////////////////////////////////
//	pISR_EINT4567 = (unsigned)rtl8019INT;	
///////////////////////////////////////////////////
	OUT_B(P_CR, 0x61);
	OUT_B(P1_CURR, 0x4D);		// 置当前页寄存器:指向当前正在写的页的下一页,
	OUT_B(P1_MAR0, 0x00);		// 设组播地址寄存器0值
	OUT_B(P1_MAR1, 0x00);		// 设组播地址寄存器1值
	OUT_B(P1_MAR2, 0x00);		// 设组播地址寄存器2值
	OUT_B(P1_MAR3, 0x00);		// 设组播地址寄存器3值
	OUT_B(P1_MAR4, 0x00);		// 设组播地址寄存器4值
	OUT_B(P1_MAR5, 0x00);		// 设组播地址寄存器5值
	OUT_B(P1_MAR6, 0x00);		// 设组播地址寄存器6值
	OUT_B(P1_MAR7, 0x00);		// 设组播地址寄存器7值
/*	OUT_B(P1_PAR0, MAC_Buf[0]);		// 设物理地址寄存器0值
	OUT_B(P1_PAR1, MAC_Buf[1]);		// 设物理地址寄存器1值
	OUT_B(P1_PAR2, MAC_Buf[2]);		// 设物理地址寄存器2值
	OUT_B(P1_PAR3, MAC_Buf[3]);		// 设物理地址寄存器3值
	OUT_B(P1_PAR4, MAC_Buf[4]);		// 设物理地址寄存器4值
	OUT_B(P1_PAR5, MAC_Buf[5]);		// 设物理地址寄存器5值
*/
//////////////////////////////////////////////////////////////////////////////////
//	rINTMSK =~(BIT_GLOBAL|BIT_EINT4567);					//ENABLE EXINT
//////////////////////////////////////////////////////////////////////////////////
	OUT_B(P_CR, 0x22);		//选择页0寄存器,网卡执行命令

}


/*
RTL8019AS接收帧格式:
接收状态(1),下一页指针(1),以太网帧长度(2),目的IP地址DA(6),源IP地址SA(6),类型TYPE/长度LEN(2),数据域DATA(<=1500),
填充PAD(可选),校验FCS(4)
*/
char RTL8019AS_RcvPacket(union Frame8019 *Packet)
{
	static  int   currCount = 0;
	unsigned char i;
	short j;
	unsigned char Bnry,Curr;
		
	Page(0);							// 选择页0的寄存器
	Bnry=IN_B(P0_BNRY);			// 读接收缓冲区读页指针

⌨️ 快捷键说明

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