s3c2440的网卡接口扩展
时间:11-19
来源:互联网
点击:
uart0 port
rGPHCON = 0x00faaa;
rGPHUP= 0x7ff;
rULCON0 = 0x3;
rUCON0 = 0x5;
rUFCON0 = 0;
rUMCON0 = 0;
rUBRdiv0 = 26;
rSRCPND = (0x1<27)|(0x1<28);
rSUBSRCPND = 0x1;
rINTPND = (0x1<27)|(0x1<28);
rINTSUBMSK = ~(0x1);
rINTMSK = ~((0x1<27)|(0x1<28));
pISR_UART0 = (U32)uartISR;
//EINT7
rGPFCON = 2<14;
rEXTINT0 = (rEXTINT0 & (~(0x07<28))) | (0x01<28);
rEINTMASK &= ~(1<7);
rSRCPND = rSRCPND | (0x1<4);
rINTPND = rINTPND | (0x1<4);
rINTMSK &= ~(1<4);
pISR_EINT4_7 = (U32)DM9000ISR;
下面就利用DM9000来进行简单的网卡传输数据的测验。由于以太网传输数据都是基于某种协议的,因此要传输数据,必须遵循一定的协议格式。这里我们实现较为简单的ARP协议。用于以太网的ARP请求/应答分组格式为:14个字节的以太网首部+28个字节ARP请求/应答。以太网首部的格式为:6个字节的以太网目标地址+6个字节以太网源地址+2个字节帧类型,对于ARP来说,帧类型为0x0806。ARP请求/应答的格式为:2个字节的硬件类型+2个字节的协议类型+1个字节的硬件地址长度+1个字节的协议地址长度+2个字节的操作码+6个字节的发送端以太网地址+4个字节的发送端IP地址+6个字节的目标以太网地址+4个字节的目标IP地址。硬件类型为1表示的是以太网,协议类型为0x0800表示的是IP地址,硬件地址长度和协议地址长度分别为6和4,它们都是以字节为单位的,操作码为1表示的是ARP请求,为2表示的是ARP应答。
在下面的测试程序中,我们用交叉网线把开发板与PC机(操作系统为Windows XP,网卡的IP地址为192.168.1.120)相连接,我们通过UART发出一个命令,让开发板发出一个ARP请求数据包,然后接收来自PC机的应答,并把该应答信息通过UART显示出来。其中UART的中断复位程序为:
void __irq uartISR(void)
{
char ch;
rSUBSRCPND |= 0x1;
rSRCPND |= 0x1<28;
rINTPND |= 0x1<28;
ch=rURXH0;
if(ch == 0x33)
comm=3;//表示发送一个ARP数据请求包
rUTXH0=ch;
}
另外我们还要事先定义一个遵循ARP协议格式的数组:
unsigned char arpsendbuf[42]={
0xff,0xff,0xff,0xff,0xff,0xff,//以太网目标地址,全1表示为广播地址
0x00,0x01,0x02,0x03,0x04,0x05,//以太网源地址
0x08,0x06,//帧类型:ARP帧
0x00,0x01,//硬件类型:以太网
0x08,0x00,//协议类型:IP协议
0x06,//硬件地址长度:6字节
0x04,//协议地址长度:4字节
0x00,0x01,//操作码:ARP请求
0x00,0x01,0x02,0x03,0x04,0x05,//发送端以太网硬件地址
192, 168, 1, 50,//发送端IP协议地址
0x00,0x00,0x00,0x00,0x00,0x00,//接收端以太网硬件地址
192, 168, 1, 120//接收端IP协议地址
};
其中发送端硬件地址,即以太网源地址(00-01-02-03-04-05)是我们初始化DM9000时定义的。而发送端IP协议地址是我们任意定义的。
该测试程序的主程序为:
void Main(void)
{
…………
//一些必要的初始化
comm=0;//命令
flag=0;//发送ARP请求包标识
dm_init();//DM9000初始化
while(1)
{
if(comm.==3)
{
comm=0;
dm_tran_packet(arpsendbuf, 42 );//发送ARP请求包
flag=1;//置标识
}
}
}
接收网络上的数据是通过外部中断方式的,在这个中断处理程序中,主要完成的是接收网卡数据,并把接收到的数据发送到UART,让其显示到PC机上。这里我们还需解决一个问题,那就是当我们发送一个ARP请求包的时候,XP系统并不会应答一个ARP数据包,而是应答一个IP协议数据包,当再多次发出ARP请求包后,才会得到ARP应答包。因此当s3c2440发送ARP请求包后,它首先要检查所接收到的数据包,如果不是ARP应答包,它就要再次发送ARP请求包,直到得到ARP应答包为止。因此中断处理程序为:
void __irq DM9000ISR(void)
{
int i;
rSRCPND = rSRCPND | (0x1<4);
rINTPND = rINTPND | (0x1<4);
if(rEINTPEND&(1<7))
{
rEINTPEND = rEINTPEND | (0x1<7);
packet_len = dm_rec_packet(buffer);//接收网卡数据
if((buffer[12]==0x08)&&(buffer[13]==0x06))//是ARP协议
{
//通过UART显示出来
for(i=0;i {
while(!(rUTRSTAT0 & 0x2)) ;
rUTXH0 = buffer[i];
}
flag=0;//清标志
}
else if(flag==1)//如果在发出ARP请求包后,接收到的数据不是ARP协议
{
comm=3;//继续发送ARP请求包
}
}
}
这样,整个网卡程序就编写完毕。为了使大家对程序的因果关系认识得更加清晰,我们再叙述一遍程序的流程:首先初始化UART0,使其用中断方式接收数据,查询方式发送数据;初始化EINT7,这是因为DM9000的数据中断引脚INT是连接到s3c2440的外部中断7引脚上的;然后初始化DM9000,主要是配置一些它的寄存器,并使其用中断方式接收网卡数据,查询方式发送数据,这与UART0相似,最后是死循环等待UART0接收中断服务程序中得到的发送ARP请求包命令。当得到发送ARP请求包命令后,调用DM9000发送数据命令,发送事先准备好的一组数据。在发送完ARP数据后,PC机会应答该请求,从而引发s3c2440外部中断7中断,在该中断服务程序中,主要是完成接收ARP应答包的任务,并把它通过UART0显示出来。
当程序被执行完,并在PC机上通过
rGPHCON = 0x00faaa;
rGPHUP= 0x7ff;
rULCON0 = 0x3;
rUCON0 = 0x5;
rUFCON0 = 0;
rUMCON0 = 0;
rUBRdiv0 = 26;
rSRCPND = (0x1<27)|(0x1<28);
rSUBSRCPND = 0x1;
rINTPND = (0x1<27)|(0x1<28);
rINTSUBMSK = ~(0x1);
rINTMSK = ~((0x1<27)|(0x1<28));
pISR_UART0 = (U32)uartISR;
//EINT7
rGPFCON = 2<14;
rEXTINT0 = (rEXTINT0 & (~(0x07<28))) | (0x01<28);
rEINTMASK &= ~(1<7);
rSRCPND = rSRCPND | (0x1<4);
rINTPND = rINTPND | (0x1<4);
rINTMSK &= ~(1<4);
pISR_EINT4_7 = (U32)DM9000ISR;
下面就利用DM9000来进行简单的网卡传输数据的测验。由于以太网传输数据都是基于某种协议的,因此要传输数据,必须遵循一定的协议格式。这里我们实现较为简单的ARP协议。用于以太网的ARP请求/应答分组格式为:14个字节的以太网首部+28个字节ARP请求/应答。以太网首部的格式为:6个字节的以太网目标地址+6个字节以太网源地址+2个字节帧类型,对于ARP来说,帧类型为0x0806。ARP请求/应答的格式为:2个字节的硬件类型+2个字节的协议类型+1个字节的硬件地址长度+1个字节的协议地址长度+2个字节的操作码+6个字节的发送端以太网地址+4个字节的发送端IP地址+6个字节的目标以太网地址+4个字节的目标IP地址。硬件类型为1表示的是以太网,协议类型为0x0800表示的是IP地址,硬件地址长度和协议地址长度分别为6和4,它们都是以字节为单位的,操作码为1表示的是ARP请求,为2表示的是ARP应答。
在下面的测试程序中,我们用交叉网线把开发板与PC机(操作系统为Windows XP,网卡的IP地址为192.168.1.120)相连接,我们通过UART发出一个命令,让开发板发出一个ARP请求数据包,然后接收来自PC机的应答,并把该应答信息通过UART显示出来。其中UART的中断复位程序为:
void __irq uartISR(void)
{
char ch;
rSUBSRCPND |= 0x1;
rSRCPND |= 0x1<28;
rINTPND |= 0x1<28;
ch=rURXH0;
if(ch == 0x33)
comm=3;//表示发送一个ARP数据请求包
rUTXH0=ch;
}
另外我们还要事先定义一个遵循ARP协议格式的数组:
unsigned char arpsendbuf[42]={
0xff,0xff,0xff,0xff,0xff,0xff,//以太网目标地址,全1表示为广播地址
0x00,0x01,0x02,0x03,0x04,0x05,//以太网源地址
0x08,0x06,//帧类型:ARP帧
0x00,0x01,//硬件类型:以太网
0x08,0x00,//协议类型:IP协议
0x06,//硬件地址长度:6字节
0x04,//协议地址长度:4字节
0x00,0x01,//操作码:ARP请求
0x00,0x01,0x02,0x03,0x04,0x05,//发送端以太网硬件地址
192, 168, 1, 50,//发送端IP协议地址
0x00,0x00,0x00,0x00,0x00,0x00,//接收端以太网硬件地址
192, 168, 1, 120//接收端IP协议地址
};
其中发送端硬件地址,即以太网源地址(00-01-02-03-04-05)是我们初始化DM9000时定义的。而发送端IP协议地址是我们任意定义的。
该测试程序的主程序为:
void Main(void)
{
…………
//一些必要的初始化
comm=0;//命令
flag=0;//发送ARP请求包标识
dm_init();//DM9000初始化
while(1)
{
if(comm.==3)
{
comm=0;
dm_tran_packet(arpsendbuf, 42 );//发送ARP请求包
flag=1;//置标识
}
}
}
接收网络上的数据是通过外部中断方式的,在这个中断处理程序中,主要完成的是接收网卡数据,并把接收到的数据发送到UART,让其显示到PC机上。这里我们还需解决一个问题,那就是当我们发送一个ARP请求包的时候,XP系统并不会应答一个ARP数据包,而是应答一个IP协议数据包,当再多次发出ARP请求包后,才会得到ARP应答包。因此当s3c2440发送ARP请求包后,它首先要检查所接收到的数据包,如果不是ARP应答包,它就要再次发送ARP请求包,直到得到ARP应答包为止。因此中断处理程序为:
void __irq DM9000ISR(void)
{
int i;
rSRCPND = rSRCPND | (0x1<4);
rINTPND = rINTPND | (0x1<4);
if(rEINTPEND&(1<7))
{
rEINTPEND = rEINTPEND | (0x1<7);
packet_len = dm_rec_packet(buffer);//接收网卡数据
if((buffer[12]==0x08)&&(buffer[13]==0x06))//是ARP协议
{
//通过UART显示出来
for(i=0;i
while(!(rUTRSTAT0 & 0x2)) ;
rUTXH0 = buffer[i];
}
flag=0;//清标志
}
else if(flag==1)//如果在发出ARP请求包后,接收到的数据不是ARP协议
{
comm=3;//继续发送ARP请求包
}
}
}
这样,整个网卡程序就编写完毕。为了使大家对程序的因果关系认识得更加清晰,我们再叙述一遍程序的流程:首先初始化UART0,使其用中断方式接收数据,查询方式发送数据;初始化EINT7,这是因为DM9000的数据中断引脚INT是连接到s3c2440的外部中断7引脚上的;然后初始化DM9000,主要是配置一些它的寄存器,并使其用中断方式接收网卡数据,查询方式发送数据,这与UART0相似,最后是死循环等待UART0接收中断服务程序中得到的发送ARP请求包命令。当得到发送ARP请求包命令后,调用DM9000发送数据命令,发送事先准备好的一组数据。在发送完ARP数据后,PC机会应答该请求,从而引发s3c2440外部中断7中断,在该中断服务程序中,主要是完成接收ARP应答包的任务,并把它通过UART0显示出来。
当程序被执行完,并在PC机上通过
s3c2440网卡接口扩 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)