📄 rtl8019.c
字号:
#include "main.h"
#include "arp.h"
#include "rtl8019.h"
#include "ip.h"
#include "rtl8019.h"
code UWORK8 TestLed_buf[5]={0xaa,0xaa,0x55,0x55,0x55};
/*********************************************************************
函数名: UWORK8 If8019SendReady(void)
功能: 检测以太网是否发送准备好
输入: 串口有数据需要发送
输出:
返回: OK, ERROR
日期: 2007/03/13
*********************************************************************/
UWORK8 If8019SendReady(void)
{
// if(ARPFinishFlag && (FALSE == EthernetBuf0DataFlag)) //缓冲0有数据标志
if(FALSE == EthernetBuf0DataFlag) //缓冲0有数据标志
{
return OK;
}
else
{
return ERROR;
}
}
/*********************************************************************
函数名: void ConfigParameter(void)
功能: 配置参数
输入: 配置软件发送来的请求包
输出: 根据命令输出数据
返回: None
日期: 2007/01/20
*********************************************************************/
void ConfigParameter(void)
{
if(0 == memcmp(&gstaRevEthernet.ucaPacket[UDP_DATA_START],&NetParameter.SeupHead_buf[0],32)) //判断前导信号和标志信号
{
memcpy(&NetSend_buf[UDP_DATA_START],&NetParameter.SeupHead_buf[0],32); //前导和标志信号
NetSend_buf[SAVE_OK] = 0; // 初始化保存成功
switch(gstaRevEthernet.ucaPacket[COMMAND_START_ADDR]) //命令字节
{
case BROADCAST_SEARCH: // 广播搜索
NetSend_buf[COMMAND_START_ADDR] = REPLY_BROADCAST; // 回应广播信号
memcpy(&NetSend_buf[EQUNAME_LEN],&NetParameter.Name_len, 27); // 名字,MAC,IP
DelayMs((TL0 & 0x07)); // 随机延时,防止同时回应
UDPConfigSend(END_PARA);
break;
case CONFIG_REQUEST:
//******************** 网口参数 **********************
NetSend_buf[COMMAND_START_ADDR] = REPLY_CONFIG; // 配置请求回应
memcpy(&NetSend_buf[EQUNAME_LEN],&NetParameter.Name_len,108);
//********************* 统计数据 *************************
ShowStatistic();
UDPConfigSend(END_PARA);
break;
case SAVE_NET_CONFIG: // 保存配置
NetSend_buf[COMMAND_START_ADDR] = REPLY_SAVE_NETCONFIG;
if(0 != memcmp(&NetParameter.Name_len,&gstaRevEthernet.ucaPacket[EQUNAME_LEN],(sizeof(Setup_Parameter) - 42))) //比较接收的数据与本机的参数是否相等。
{
// 将参数保存进FLASH
memcpy(&NetParameter.Name_len, &gstaRevEthernet.ucaPacket[EQUNAME_LEN], (sizeof(Setup_Parameter) - 42));
FlashWriteData(NetParameter_Addr, &NetParameter.startFlag, sizeof(Setup_Parameter)); //保存参数
FlashWriteData(NetParameter_BakAddr, &NetParameter.startFlag, sizeof(Setup_Parameter)); //保存到备份参数
if(0 != memcmp(&NetParameter.MAC_Local_buf[0],&gstaRevEthernet.ucaPacket[MAC_ADDR],MAC_LEN)) //比较MAC
{
UDPConfigSend(END_PARA); // 改变了MAC,需要重新初始化以太网芯片
DelayMs(10); // 等待网络发送完
InitPara();
InitSerial();
if(OK == RTL8019asInit()) //初始化以太网芯片
{
ResetSystem();
}
}
else
{
UDPConfigSend(END_PARA);
InitPara();
InitSerial();
}
IPConflitTestFlag = TRUE;
}
else
{
UDPConfigSend(END_PARA);
}
break;
case REFLESH_STATISTIC: // 刷新统计信息
ShowStatistic();
NetSend_buf[COMMAND_START_ADDR] = REPLY_FLESH;
UDPConfigSend(END_PARA);
break;
case CLEAR_STATISTIC: // 清零统计信息请求
memset(&gstUDPStatistics,0,sizeof(gstUDPStatistics));
memset(&gstUARTStatistics,0,sizeof(gstUARTStatistics));
NetSend_buf[COMMAND_START_ADDR] = REPLY_CLEAR_STATISTIC;
UDPConfigSend(END_PARA);
break;
case RESET_SYSTEM: //复位系统
ResetSystem();
break;
default:
break;
}
}
else if(0 == memcmp(&gstaRevEthernet.ucaPacket[UDP_DATA_START],&TestLed_buf[0],5)) //判断前导信号和标志信号
{
// SerialSendbuf(&gstaRevEthernet.ucaPacket[UDP_DATA_START],6);
if(gstaRevEthernet.ucaPacket[UDP_DATA_START + 5] == 0x11) //表示闪灯
{
Test_Flag = 0x11;
}
else
{
Test_Flag = 0x00;
TEST_LED = 1; //关闭LED灯
}
}
}
/*********************************************************************
函数名: void InitPara(void)
功能: 初始化网络参数
输入: 系统启动或者参数改变时
输出: 将IP,端口号等参数从flash中读出进行配置
返回: none
日期: 2006/05/30
*********************************************************************/
void InitPara(void)
{
memcpy(&MAC_Remote_buf[6],&NetParameter.MAC_Local_buf[0],MAC_LEN); //把源本地MAC地址复制到发送MAC缓存中
memcpy(&IPLocalAddress_buf[0],&NetParameter.IP_Local_buf[0],IP_LEN); // 本地IP
memcpy(&SubNetMask_buf[0],&NetParameter.SubMask_buf[0],IP_LEN); // 掩码
memcpy(&GateWay_buf[0],&NetParameter.Gateway[0],IP_LEN); // 默认网关
memcpy(&ArpCache_Buf[0].ucaIP[0],&NetParameter.IP_Remote_buf[0],IP_LEN); // 远程IP1
ArpCache_Buf[0].usRemotePort = NetParameter.Port_Remote; //远程端口号1
ARPFinishFlag = FALSE;
EthernetLinkFlag = FALSE;
}
/*********************************************************************
函数名: UWORK8 RTL8019asCheck(void)
功能: 诊断RTL8019AS
输入: None
输出: None
返回: OK, ERROR
日期: 2004/02/04
*********************************************************************/
UWORK8 RTL8019asCheck(void)
{
UWORK8 ucValue,ucLoop;
xdata UWORK8 ucaFIFO[8];
Page0(); // 1. 诊断数据线路
EX0 = FALSE; // 禁止外部中断0
RTL8019asWrite(W0_RCR,0xe1); // 不接收广播和组播数据,接收错误包
RTL8019asWrite(W0_TCR,0xe7); // cable环回模式,CRC产生禁止
RTL8019asWrite(W0_DCR,0xc0); // 8位DMA方式
SendDiagnoseData(); // 发送诊断数据
DelayMs(50);
RTL8019asRead(RW0_ISR,ucValue);
RTL8019asRead(RW0_CR,ucLoop);
if((RW0_ISR_PTX | RW0_ISR_RXE) == ucValue) // 发送完成,CRC错误
{
for(ucLoop = 0; ucLoop < 8; ucLoop++) // 读取FIFO中的8个数据
{
RTL8019asRead(R0_FIFO,ucaFIFO[ucLoop]);
}
}
else
{
return ERROR;
}
if((0xaa == ucaFIFO[0]) && (0xaa == ucaFIFO[1]) && (0x02 == ucaFIFO[2]) &&
(0x02 == ucaFIFO[3]) && (0x02 == ucaFIFO[4]) && (0xaa == ucaFIFO[5]) &&
(0xaa == ucaFIFO[6]) && (0xaa == ucaFIFO[7]))
{
Page0();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -