📄 rtl8019as(backup).c
字号:
#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 + -