📄 main.c
字号:
/****************************************************************************
Copyright (c) 深圳市民德电子科技有限公司 http://www.szminde.cn
文件名称:MAIN.c
版本号: 1.0
日期: 2005-05-25
说明: 此文件包含主函数。
调用列表:Port_init.c
sys_UART.c
修改历史:--
****************************************************************************/
#include "def.h"
#include "option.h"
#include "44b.h"
#include "Port_init.h"
#include "sys_UART.h"
#include "armnet.h"
#include <string.h>
/****************************************************************************
函数名称:Delay()
说明: 延时函数
调用函数:无
输入参数:time 要延时的时间,为1时约延时0.1ms,为0时为校正延时时间
输出参数:无
****************************************************************************/
static int delayLoopCount=0x190;
void Delay(int time)
{
int i,adjust=0;
if(time==0)
{
time=200;
adjust=1;
delayLoopCount=400;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
rWTDAT=0xffff;
rWTCNT=0xffff;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
}
for(;time>0;time--)
for(i=0;i<delayLoopCount;i++);
if(adjust==1)
{
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
i=0xffff-rWTCNT;
delayLoopCount=8000000/(i*64);
}
}
/*定义MAC地址*/
unsigned char default_mac[MACLEN] = {0x12,0x34,0x56,0x78,0x90,0xab};
NODE locnode;
ETHERFRAME __align(4) etherframe;
/*定义IP地址,网关地址,掩码*/
unsigned int IP_ADDRESS = IP4_ADDR(192,168,0,250);
unsigned int GATE_ADDRESS = IP4_ADDR(255,255,255,0);
unsigned int MASK_ADDRESS = IP4_ADDR(192,168,0,1);
unsigned int download_addr;
unsigned int download_begin;
unsigned int download_end;
unsigned int download_len;
/****************************************************************************
函数名称:NodeInit()
说明: 节点初始化,用定义好的数据初始化ES-TAD7100开发板的网络参数
调用函数:ResetNic()
memcpy()
输入参数:无
输出参数:无
****************************************************************************/
void NodeInit(void)
{
ResetNic();
locnode.ip = IP_ADDRESS;
locnode.mask = MASK_ADDRESS;
locnode.gate = GATE_ADDRESS;
memcpy(locnode.mac,default_mac,6);
locnode.port = 9000;
}
/****************************************************************************
函数名称:NetIntPreInit()
说明: 网络芯片产生中断位的设置
调用函数:无
输入参数:无
输出参数:无
****************************************************************************/
void NetIntPreInit(void)
{
rPCONG = rPCONG | 0x000c;
rPUPG = rPUPG & 0xf7;
rEXTINT |= 0x0040;
}
/****************************************************************************
函数名称:Main()
说明: 主函数,调用各初始化函数,然后实现可以响应另一个网络节点(比如PC)
的ping请求
调用函数:Port_Init()
UART_Init()
UART_Printf()
NodeInit()
NetIntPreInit()
ArpInit()
ResetNic()
memset()
GetEthernet()
SwapEther()
IsArp()
READ_PACKED()
ArpRcvPacket()
IsIp()
IsIcmp()
IcmpRcvPacket()
输入参数:无
输出参数:返回整型值,但一般到不了返回值的地方
****************************************************************************/
int Main(void)
{
unsigned short rxlen,ip_len;
volatile unsigned char net_isr;
ARPKT *arp;
ETHERFRAME *efp;
IPKT *ip;
efp = ðerframe;
rSYSCFG=SYSCFG_8KB;
rNCACHBE0 = ((unsigned int)(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);
Port_Init();
Delay(0);
UART_Init(0,115200);
UART_SendByte('\n');
UART_Printf("********************************************\n");
UART_Printf("* Shenzhen MinDe Elec. Tech. Co., Ltd. *\n");
UART_Printf("* ES-TAD7100 Development Board *\n");
UART_Printf("* Ethernetnet Testing Module *\n");
UART_Printf("********************************************\n");
NodeInit();
NetIntPreInit();
ArpInit();
ResetNic();
while(1)
{
net_isr = EN_ISR;
if(net_isr & ENISR_RX)
{
EN_ISR |= ENISR_RX;
memset((unsigned char *)efp, 0, sizeof(ETHERFRAME));
rxlen = GetEthernet(efp);
SwapEther(efp); // 把ETHERHDR的ptype高低位互换
if(IsArp(efp, rxlen))
{
arp = (ARPKT *)(efp->edata);
if(READ_PACKED(arp->dip)==locnode.ip &&(arp->op==ARPREQ || arp->op==ARPRESP))
{
ArpRcvPacket(efp);
}
}
else
{
ip_len = IsIp(efp, rxlen);
if(ip_len)
{
ip = (IPKT *)(efp->edata);
if(IsIcmp(ip, ip_len))
{
IcmpRcvPacket(efp);
}
}
}
}
if(net_isr & ENISR_RX_ERR)
{
EN_ISR |= ENISR_RX_ERR;
}
if(net_isr & ENISR_TX)
{
EN_ISR |= ENISR_TX;
}
if(net_isr & ENISR_TX_ERR)
{
EN_ISR |= ENISR_TX_ERR;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -