📄 rtl8019.c
字号:
ET0 = FALSE; // 禁止timer0中断
Ms10FlagCount = 0;
ET0 = TRUE; // 使能timer0中断
return OK;
}
else
{
return ERROR;
}
}
/*********************************************************************
函数名: UWORK8 RTL8019asInit(void)
功能: 初始化RTL8019AS
输入: None
输出: None
返回: OK, ERROR
日期: 2004/02/04
*********************************************************************/
UWORK8 RTL8019asInit(void)
{
xdata UWORK8 ucBNRY,ucLoop,ucLoop1;
xdata UWORK8 ucMAR0,ucMAR1,ucMAR2,ucMAR3,ucMAR4,ucMAR5,ucMAR6,ucMAR7;
EX0 = FALSE; // 禁止外部中断0
RTL8019asReset();
RTL8019asWrite(RW0_CR,0x21); // 网卡停止运行
DelayMs(10); // 延时100ms,确保芯片进入停止模式
RTL8019asRead(R0_ID0,ucLoop); // 读入芯片ID号
RTL8019asRead(R0_ID1,ucLoop1);
if((RTL8019AS_ID0 != ucLoop) || (RTL8019AS_ID1 != ucLoop1))
{
return ERROR;
}
RTL8019asWrite(W0_DCR,0xd8); // 8位DMA方式
RTL8019asWrite(W0_RBCR0,0x00); // 清零远程DMA读/写的字节数
RTL8019asWrite(W0_RBCR1,0x00);
// 芯片处于监视和环回模式,跟外部网络断开 */
RTL8019asWrite(W0_RCR,0xe0); // 监视模式
RTL8019asWrite(W0_TCR,0xe2); // 环回模式
// 使用0x40-0x4B为网卡的发送缓冲区,共12页,刚好可以存储2个最大的以太网包
// 使用0x4c~0x7f 为网卡的接收缓冲区共52 页 */
RTL8019asWrite(W0_PSTART,0x4c);
RTL8019asWrite(W0_PSTOP,0x80);
RTL8019asWrite(RW0_BNRY,0x4c); // 读页指针
// 清除所用中断标志
RTL8019asWrite(RW0_ISR,0xff); // 写1清零,上电必须清零
RTL8019asWrite(W0_IMR,RW0_ISR_TXE |RW0_ISR_RXE |
RW0_ISR_PTX | RW0_ISR_PRX); // 使能发送完成,发送出现错误,接收完成,接收出现错误中断
Page1();
RTL8019asWrite(RW1_CURR,0x4d); // 当前网卡正在写的页
RTL8019asWrite(RW1_MAR0,0x00); // 禁止组播
RTL8019asWrite(RW1_MAR1,0x00);
RTL8019asWrite(RW1_MAR2,0x00);
RTL8019asWrite(RW1_MAR3,0x00);
RTL8019asWrite(RW1_MAR4,0x00);
RTL8019asWrite(RW1_MAR5,0x00);
RTL8019asWrite(RW1_MAR6,0x00);
RTL8019asWrite(RW1_MAR7,0x00);
RTL8019asWrite(RW1_PAR0,NetParameter.MAC_Local_buf[0]); // 初始化MAC
RTL8019asWrite(RW1_PAR1,NetParameter.MAC_Local_buf[1]);
RTL8019asWrite(RW1_PAR2,NetParameter.MAC_Local_buf[2]);
RTL8019asWrite(RW1_PAR3,NetParameter.MAC_Local_buf[3]);
RTL8019asWrite(RW1_PAR4,NetParameter.MAC_Local_buf[4]);
RTL8019asWrite(RW1_PAR5,NetParameter.MAC_Local_buf[5]);
Page3();
Rtl3ConfigEnable(); // page3配置使能
Rtl3IntEnable(); // 中断引脚使能
Auto3DetectNMT(); // 自动选择网络媒介类型
RTL8019asWrite(RW3_CONFIG2,0);
RTL8019asWrite(RW3_CONFIG3,R3_CONFIG3_LEDS1|R3_CONFIG3_LEDS0);
Rtl3ConfigDisable(); // page3配置禁止
Page0();
RTL8019asRead(RW0_BNRY,ucBNRY); // 读出部分值,比较写入的值来判断是否初始化成功
Page1();
RTL8019asRead(RW1_MAR0,ucMAR0);
RTL8019asRead(RW1_MAR1,ucMAR1);
RTL8019asRead(RW1_MAR2,ucMAR2);
RTL8019asRead(RW1_MAR3,ucMAR3);
RTL8019asRead(RW1_MAR4,ucMAR4);
RTL8019asRead(RW1_MAR5,ucMAR5);
RTL8019asRead(RW1_MAR6,ucMAR6);
RTL8019asRead(RW1_MAR7,ucMAR7);
StartTimer(0,100); // 运行灯定时器,1秒钟闪烁
StartTimer(8,105); // 检测以太网link与否
StartTimer(9,1000); // 以太网芯片保护校验
if((0x4c == ucBNRY) && (0x00 == ucMAR0) && (0x00 == ucMAR1)
&& (0x00 == ucMAR2) && (0x00 == ucMAR3) && (0x00 == ucMAR4)
&& (0x00 == ucMAR5) && (0x00 == ucMAR6) && (0x00 == ucMAR7))
{
ArpRequestFormat.usHTYPE = HTYPE; //初始化ARP请求包
ArpRequestFormat.usPTYPE = PTYPE;
ArpRequestFormat.ucHLEN = HLEN;
ArpRequestFormat.ucPLEN = PLEN;
memcpy(&ArpRequestFormat.ucaSHA[0],&NetParameter.MAC_Local_buf[0],MAC_LEN); // 源MAC地址
memset(&ArpRequestFormat.ucaTHA,0,MAC_LEN); // 目的MAC
ArpAnswerFormat.usHTYPE = HTYPE; //初始化ARP应答包
ArpAnswerFormat.usPTYPE = PTYPE;
ArpAnswerFormat.ucHLEN = HLEN;
ArpAnswerFormat.ucPLEN = PLEN;
ArpAnswerFormat.usOPER = OPER_APLY; // ARP应答
memcpy(&ArpAnswerFormat.ucaSHA[0],&NetParameter.MAC_Local_buf[0],MAC_LEN); // 源MAC地址
gstIphead.ucVerAndLen = 0x45; //初始化IP包
gstIphead.ucDs = 0x00;
gstIphead.usSegOffset = 0x00;
gstIphead.ucTTL = 0x20;
LocalIpID = rand(); // IP发送的16位标志,上电初始化为一个随机值
Page0(); // 将网片配置成正常工作模式
RTL8019asWrite(W0_RCR,0xcc); // 接收广播和组播数据
RTL8019asWrite(W0_TCR,0xe0);
RTL8019asWrite(W0_RBCR0,0x00);
RTL8019asWrite(W0_RBCR1,0x00);
RTL8019asWrite(RW0_CR,0x22); // 网片开始工作
RTL8019asWrite(RW0_ISR,0xff); // 清除所有中断
EX0 = TRUE; // 外部中断0使能 // 使能外部中断0
IPOrMacConfiltFlag = FALSE;
EthernetLinkFlag = FALSE;
IPConflitTestFlag = FALSE;
return OK;
}
else
{
return ERROR;
}
}
/*********************************************************************
函数名: UWORK8 RTL8019asReset(void)
功能: 初始化RTL8019AS
输入: None
输出: None
返回: OK, ERROR
日期: 2004/02/04
*********************************************************************/
UWORK8 RTL8019asReset(void)
{
RTL8019asResetFoot = 1;
DelayMs(5);
RTL8019asResetFoot = 0;
return OK;
}
/*********************************************************************
函数名: void ShowStatistic(void)
功能: 显示统计信息
输入: 配置软件发送统计请求
输出: 将统计信息发送出去
返回: None
日期: 2005/07/05
*********************************************************************/
void ShowStatistic(void)
{
memcpy(&NetSend_buf[RUN_DAYS],(UWORK8 *)&gusDate,2); //运行天数
NetSend_buf[RUN_HOURS] = gucHour; //运行小时数
NetSend_buf[RUN_MINUTES] = gucMinute; //运行分钟数
NetSend_buf[RUN_SECONDS] = gucSecond; //运行秒数
memcpy(&NetSend_buf[UDP_RCV_BYTES],(UWORK8 *)&gstUDPStatistics.ulUDPReceiveDataNum,4); //UDP接收字节数
memcpy(&NetSend_buf[UDP_SEND_BYTES],(UWORK8 *)&gstUDPStatistics.ulUDPSendDataNum,4); //UDP发送字节数
memcpy(&NetSend_buf[UART_RCV_BYTES],(UWORK8 *)&gstUARTStatistics.ulUARTReceiveDataNum,4); //串口接收字节数
memcpy(&NetSend_buf[UART_SEND_BYTES],(UWORK8 *)&gstUARTStatistics.ulUARTSendDataNum,4); //串口发送字节数
memcpy(&NetSend_buf[UART_RCV_SOFT_OVERFLOW],(UWORK8 *)&gstUARTStatistics.ulUARTRcvLackQueNum,4); //串口接收软件溢出
memcpy(&NetSend_buf[UART_SEND_SOFT_OVERFLOW],(UWORK8 *)&gstUARTStatistics.ulUARTSendLackQueNum,4); //串口发送软件溢出
memcpy(&NetSend_buf[HARD_SOFT_EIDTION],&NetParameter.VerCode_buf[0],VER_NUM); //软硬件版本号
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -