基于ARM9的CMOS图像采集系统的设计
用户数据应用程序Appl首部用户数据UDPUDP首部UDP段IP首部UDP首部应用数据IP应用数据以太网驱动程序IP数据报以太网首部14IP首部20UDP首部20以太网帧46-1500字节应用数据以太网尾部以太网4
图5.3数据传输层次图
5.2.1 网络接口层程序设计
以太网接口的主要目的是向LAN发送和从LAN接受以太网帧。但是,在能发送和接受以太网帧之前,以太网的接口必须被初始化(复位和正确配置)。这种配置和正确的发送及接受操作是通过使用DM9000内部控制和配置寄存器来实现的。为了能够完全控制以太网接口,微处理器必须能够读和写这些寄存器[18]。
以太网控制芯片DM9000的程序设计分为以下几个部分: 1)通用端口是设置,具体程序如下:
dm9000_reg_write(DM9000_NCR,dm9000_reg_read(DM9000_NCR)&(~(1<<7)));
dm9000_reg_write(DM9000_GPCR, 0x01);
//设置 GPCR(1FH) bit[0]=1,使DM9000的GPIO0为输出。 dm9000_reg_write(DM9000_GPR, 0x00);
//GPR bit[0]=0 使DM9000的GPIO3输出为低以激活内部PHY。
2)软件复位,具体程序如下:
while(!(dm9000_reg_read(DM9000_NSR)&0x40));//延时2ms以上 dm9000_reg_write(DM9000_NCR, 0x03);//软件复位 do {
–31–
基于ARM9的CMOS图像采集系统的设计
delay(1000); //延时20us以上等待软件复位完成 } while (dm9000_reg_read(DM9000_NCR) & 1);
dm9000_reg_write(DM9000_NCR, 0x00); //复位完成,设置正常工作模式。
3)设置介质无关接口 MII 寄存器:
static void set_PHY_mode(void) {
u8 media_mode;
unsigned short phy_reg4 = 0x01e1; //自动协商广告寄存器:ANAR(04H),
}
unsigned short phy_reg0 = 0x1000; //基本模式控制寄存器 BMCR(00H) phy_write(4, phy_reg4); /* Set PHY media mode */ phy_write(0, phy_reg0);
4)设置功能寄存器
dm9000_reg_write(DM9000_IMR, IMR_PAR); 存器, 使能数据传输中断
dm9000_reg_write(DM9000_BPTR, 0x3f);
// 寄存器地址:0x08,背压门限
寄存器, Less 3Kb, 200us
dm9000_reg_write(DM9000_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8)); // 寄存器地址 0x09 ,接收溢出计数寄存器 : High/Low Water
5)写物理地址
物理地址(MAC)寄存器PAR(10H--15H):7-0 :PAD0--PAD5:物理地址字节0 -- 字节 5(10H -- 15H) 。用来保存6个字节的MAC地址。具体实现函数如下。
for (i = 0, oft = 0x10; i < 6; i++, oft++) dm9000_reg_write(oft, SourceMAC[i]); for (i = 0, oft = 0x16; i < 8; i++, oft++) dm9000_reg_write(oft, 0xff);
for (i = 0, oft = 0x10; i < 6; i++, oft++) { dm9000_reg_read(oft);}
dm9000_reg_write(DM9000_FCR, 0x29); // 寄存器地址0x0a 接收/发送溢出控制寄存器
// 寄存器地址: 0xff,终端屏蔽寄
–32–
基于ARM9的CMOS图像采集系统的设计
6)开启网络传输
dm9000_reg_write(DM9000_NCR, 0x0); // 寄存器地址: 0x00网
络控制寄存器
only intern phy supported by now dm9000_reg_write(DM9000_NSR,
5.2.2 网络层程序设计 1) ARP协议
ARP协议允许以太网驱动程序获悉每台设备的MAC地址。也就是说,当IP层需要向一台设备发送报文时,它提供目的IP地址和报文本身,使用数据链路层的服务。数据链路层,在这种情况下为以太网驱动程序,需要MAC地址才能将帧发送到本地网络中。所以,数据链路层要调用ARP协议来解析该关联。
ARP实现需要一个将每台设备的IP地址与其MAC地址关联起来的映射表。每个解析过关联将缓存到该映射表中并保持一个给定的时间。该事件结束后,该检查这个关联的有效性。
ARP表的条目可能有两个来源:
1)电脑设备接收来自其他的ARP请求,这些请求含有发送设备的MAC地址和IP地址,这个关联被保存到高速缓存中,这样电脑设备稍后就会用到它。ARP请求是广播报文,所以这些ARP报文会被局域网的所有设备接收到。
2)电脑设备发送ARP请求到其他设备,当ARP协议需要解析一个不能在ARP表中找到的关联时,它需要发送一个ARP请求,以使目的设备回复自己的硬件地址。一旦这种情况发生,该关联就缓存到ARP表中以供设备将来使用[19]。
为了实现ARP报文,编写了以下的函数
(1)void Arp_Request(unsigned char * ip_address,unsigned char num); 这个函数的功能是实现ARP报文的请求功能。
NSR_WAKEST
|
NSR_TX2END
|
NSR_TX1END); //寄存器地址:0x01,网络状态寄存器 清除发送标志
dm9000_reg_write(DM9000_ISR, 0x3f); //寄存器地址: 0xfe,dm9000_reg_write(DM9000_IMR, 0x83); //寄存器地址: 0xff, 终端屏蔽寄存dm9000_reg_write(DM9000_RCR,
RCR_DIS_LONG
|
RCR_DIS_CRC
|
终端状态寄存器 清楚中断标志 器, 使能数据传输中断
RCR_RXEN); //寄存器地址:0x05 接受控制寄存器 接受使能
–33–
基于ARM9的CMOS图像采集系统的设计
(2)unsigned char Arp_Answer(unsigned char * ARP_REC_PTR,unsigned char num); 这个函数的功能是实现ARP报文的应答功能。
2) IP协议
网际协议(IP-RFC791)是TCP/IP最重要的组成部分,是真个协议栈的基础,它位于网际层,为运输层(UDP和TCP)提供服务,并从网络接口层(LAN驱动程序、SLIP和PPP)请求服务。IP层是第一个独立于硬件的层,不管下层使用的网络技术是什么,该层的实现都完全相同。该层虽然比较固定,但是却是上层的基础。我们常用的IP数据包的格式IP数据报两部份: (1)数据区:高层传输的数据。
(2)报头区:为了正确传输高层数据而增加的控制信息。 其具体的形式如表5.2所示:
表5.2 IP数据包格式
版本 报头长度 标识 生存空间 服务类型 标志 协议 源地址 目的地址 选项+填充 数据 、、、 总长度 片偏移 首部检验和 包头中的各个主要的字段的功能是:
? 生存周期:IP数据报在互联网中的存活时间(避免死循环)。 ? 头部校验和:保证IP数据报报头的完整性。
? 地址:源IP地址:数据报的发送者。目的IP地址:数据报的接收者。 在实现IP协议时我们进行了软件的编写,主要使用了以下的函数进行处理: (1)unsigned char IP_PROCESS(unsigned char * RecData,unsigned char num)
这个函数实现的功能是对接收到的数据进行了处理分类,按照每个数据报不同的类型来区分,如果接收到的数据时ICMP报文则调用icmp_process()函数进行处理,如果
–34–
基于ARM9的CMOS图像采集系统的设计
是TCP协议的报文则调用tcp_process(),如果是UDP协议的报文则调用udp_process()函数进行处理。
(2)unsigned char Send_Ip_Frame(struct _pkst *TxdData,unsigned char * de_ip,unsigned char * so_ip,unsigned char PROTOCOL)
这个函数实现的功能实现的功能是将已经分好类的各个报文按、按照各个报文的数据结构进行处理然后再将其进行IP数据包的封装,加上相应的信息最后形成IP数据包向下层网路接口层进行传输用于网络接口层数据的发送。
(3)unsigned char Send_ethernet_Frame( struct _pkst *TxdData,unsigned char * de_mac,unsigned char PROTOCOL,unsigned char num)
这个函数的功能是实现对IP数据包在网络接口层进行封装,同样也是根据不同的数据包协议的形式加上相应的数据,形成符合网路接口相关协议的数据包的形式用于向网络中进行传输。
(4)unsigned char Send_Ip_To_LLC(struct _pkst *TxdData,unsigned char * de_ip,unsigned char num);
这个函数实现的功能就是为IP、ARP数据包产生ETHERNET包头,并发送。
3)ICMP协议
运行在网际层的IP协议负责位于远程网络中的设备之间的数据交付,这种数据交付需要穿越一个“虚网”。IP为其上层协议提供接受其数据以数据报的形式穿越互联网传送给接收者,然后接受IP层的数据报并从该数据报中取出数据传递给上层协议。
为了使IP能够提供这一数据传输的服务,需要进行一些管理和维护工作,即IP层需要检测某些错误的条件,还要从虚网的其他的结点获取信息。这一功能由Internet控制报文协议即ICMP协议来完成[20]。
其中ICMP通用的报文格式如表5.3所示。
图5.3 ICMP通用报文格式
类型(1字节)
代码(1字节) 校验和(2字节) ICMP类型相关数据(可变长度) 其中主要的各个字段的主要功能是: ? 类型:标识报文类型。 ? 代码:指示不同的“子类型”。
–35–