基于S3C2410X以太网接口的应用开发.doc_第1页
基于S3C2410X以太网接口的应用开发.doc_第2页
基于S3C2410X以太网接口的应用开发.doc_第3页
基于S3C2410X以太网接口的应用开发.doc_第4页
基于S3C2410X以太网接口的应用开发.doc_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统课程设计说明书 基于S3C2410X 以太网接口的应用开发 系 部: 计算机与信息科学系 组 成 员: 邱冬 谭陈清 贺宏辉 萧栩旭 指导教师: 秦 辉 职称 讲师 专 业: 计算机科学与技术 班 级: 计本0803 完成时间: 2011年12月12日 摘 要 ARM 微处理器因其卓越的低功耗、高性能在 32 位嵌入式应用中已位居世界第一,是高性能、低功耗嵌入式处理器的代名词,为了顺应当今世界技术革新的潮流,了解、学习和掌握嵌入式技术,就必然要学习和掌握以ARM 微处理器为核心的嵌入式开发环境和开发平台,这对于研究和开发高性能微处理器、DSP 以及开发基于微处理器的SOC 芯片设计及应用系统开发是非常必要的。前一段时间我们学习了ARM原理和汇编语言程序设计的 ,初步的掌握了S3C2410X处理器和PC机结合,这里我简单介绍S3C2410X 处理器 UART 相关控制寄存器的使用熟悉ARM 处理器系统硬件电路中 UART 接口的设计方法。掌握ARM处理器基于内部以太局域网上TFTP/IP协议工作环境的软件编程方法。关键词 Embest EduKit-III 实验平台;Embest ARM标准/增强型仿真器套件;PC;以太网集线器;Embest IDE for ARM集成开发环境;windows XPABSTRACTThe ARM microprocessor for its outstanding low power consumption, high performance in 32 bit embedded applications in the world has been the first, high performance, low power consumption is embedded processor pronoun, in order to conform to the trend of the technological innovation in the world today, to understand and study and control embedded technology, are sure to learn and master to ARM micro processor as the core of the embedded development environment and development platform, and the research and development for high performance DSP microprocessor, and based on the development of the microprocessor chip SOC design and application of the system development is very necessary. Some time ago we studied the ARM principle and assembly language design, preliminary S3C2410X processor and master the PC combination, here I S3C2410X processor UART briefly introduced the related control register use familiar with the ARM processor system hardware circuit of the design method of the UART interface. Master the ARM processor based on internal etheric LAN TFTP/IP work environment the software programming method.Key words embest eduKit-III experimental platform; embest arm standard/enhanced simulators suite; pc; ethernet hub; embest ide for arm integrated development environment; windows xp目录目录i1 设计要求和目的11.1 设计要求11.2 设计目的12 设计原理22.1 设计原理22.1.1 以太网通信原理22.1.2 IP网络协议原理52.1.3网络应用程序开发方法102.1.4 关于CS8900A113. 硬件环境323.1硬件环境323.2软件环境324. 程序代码设计335. 总结与体会506. 参考文献511 设计要求和目的1.1 设计要求 设计简单的程序使以太网控制器CS8900A,在内部以太局域网上基于TFTP/IP协议工作,并完成相关寄存器的复位与初始化。1.2 设计目的 嵌入式系统开发是计算机科学与技术专业学生的专业课程,本次课程设计主要是检验我们是否掌握相关专业课程知识,充分调动自己的积极性和创造性,重视自己实际动手能力的培养。 通过本课程设计是使我们加深理解巩固课堂教学和平时实验内容,是我们了解以太网控制器CS8900A,以及相关控制器的使用,熟悉ARM处理器系统硬件电路中接口的设计方法,掌握ARM处理器基于内部以太局域网上TFTP/IP协议工作环境的软件编程方法。强化我们的知识时间意识、提高动手能力。 2 设计原理 2.1 设计原理2.1.1 以太网通信原理以太网是由Xeros开发的一种CSMA/CD机制 ,使用同轴电缆座位传输介质,数据传输速率达到10MB/s,使用双绞线座位传输介质,数据传输达到100M/1000MB/s,现在普遍遵从IEEE802.3规范。1)结构以太网结构如图2.1.1所示。 图2.1.1 以太网结构示意图 2)类型以太网IEEE802.3采用同轴电缆作为传输介质,传输速率达到10M/100MB/s,其中100MB/s以太网又称为快速以太网,采用双绞线作为传输介质,传输速率达100MB/s,而1000MB/s以太网又称为千兆以太网,采用光缆或者双绞线作为传输介质。3) 工作原理以太网的传输方式,也就是以太网的介质访问控制(MAC)技术称为载波监听多路存取和冲突检测(CSMA/CD),下面来详细叙述其工作原理。所谓载波侦听(Carrier Sense),意思是网络上各个工作站在发送数据前都要确认总线上有没有数据传输。若有数据传输(称总线为忙),则不发送数据;若无数据传输(称总线为空),立即发送准备好的数据。所谓多路访问(Multiple Access),意思是网络上所有工作站收发数据共同使用同一条总线,且发送数据是广播式的。所谓冲突(Collision),意思是若网上有两个或两个以上工作站同时发送数据,在总线上就会产生信号的混合,这样哪个工作站都辨别不出真正的数据是什么。这种情况称为数据冲突,又称为碰撞。为了减少冲突发生后的影响,工作站在发送数据过程中还要不停地检测自己发送的数据,看有没有在传输过程中与其他工作站的数据发生冲突,这就是冲突检测(Collision Detected)。具体的检测原理描述如下:(1) 当一个站点想要发送数据的时候,它检测网络查看是否有其他站点正在传输,即侦听信道是否空闲。(2) 如果信道忙,则等待,直到信道空闲;如果信道空闲,站点就准备好要发送的数据。(3) 在发送数据的同时,站点继续侦听网络,确信没有其他站点在同时传输数据才继续传输数据。因为有可能两个或多个站点都同时检测到网络空闲然后几乎在同一时刻开始传输数据。如果两个或多个站点同时发送数据,就会产生冲突。若无冲突则继续发送,直到发完全部数据。(4) 若有冲突,则立即停止发送数据,但是要发送一个加强冲突的JAM(阻塞)信号,以便使网络上所有工作站都知道网上发生了冲突,然后,等待一个预定的随机时间,且在总线为空闲时,再重新发送未发完的数据。 4)以太网/IEEE802.3帧的结构以太网/IEEE802.3帧的结构如图2.1.2所示。 图2.1.2 以太网/IEEE802.3帧的结构前序字段 前序字段由8个(Ethernet II)或7个(IEEE802.3)字节的交替出现的1和0组成,设置该字段的目的是指示帧的开始并便于网络中的所有接收器均能与到达帧同步,另外,该字 段本身(在Ethernet II中)或与帧起始定界符一起(在IEEE802.3中)能保证各帧之间用于错误检测和恢复操作的时间间隔不小于9.6毫秒。帧起始定界符字段 该字段仅在IEEE802.3标准中有效,它可以被看作前序字段的延续。实际上,该字段的组成方式继续使用前序字段中的格式,这个一个字节的字段的前6个 比特位置由交替出现的1和0构成。该字段的最后两个比特位置是11,这两位中断了同步模式并提醒接收后面跟随的是帧数据。当控制器将接收帧送入其缓冲器时,前序字段和帧起始定界符字段均被去除。类似地当控制器发送帧时,它将这两个字段(如果传输的是IEEE802.3帧)或一个前序字段(如果传输的是真正的以太网帧)作为前缀加入帧中。 目的地址字段 目的地址字段确定帧的接收者。两个字节的源地址和目的地址可用于IEEE802.3网络,而6个字节的源地址和目的地址字段既可用于Ethernet II网络又可用于IEEE802.3网络。用户可以选择两字节或六字节的目的地址字段,但对IEEE802.3设备来说,局域网中的所有工作站必须使用同 样的地址结构。目前,几乎所有的802.3网络使用6字节寻址,帧结构中包含两字节字段选项主要是用于使用16比特地址字段的早期的局域网。 源地址字段 源地址字段标识发送帧的工作站。和目前地址字段类似,源地址字段的长度可以是两个或六个字节。只有IEEE802.3标准支持两字节源地址并要求使用的目 的地址。Ethernet II和IEEE802.3标准均支持六个字节的源地址字段。当使用六个字节的源地址字段时,前三个字节表示由IEEE分配给厂商的地址,将烧录在每一块网 络接口卡的ROM中。而制造商通常为其每一网络接口卡分配后字节。 类型字段 两字节的类型字段仅用于Ethernet II帧。该字段用于标识数据字段中包含的高层协议,也就是说,该字段告诉接收设备如何解释数据字段。在以太网中,多种协议可以在局域网中同时共存,例如: 类型字段取值为十六进制0800的帧将被识别为IP协议帧,而类型字段取值为十六进制8137的帧将被识别为IPX和SPX传输协议帧。因此,在 Ethernet II的类型字段中设置相应的十六进制值提供了在局域网中支持多协议传输的机制。在IEEE802.3标准中类型字段被替换为长度字段,因而Ethernet II帧和IEEE802.3帧之间不能兼容。 长度字段 用于IEEE802.3的两字节长度字段定义了数据字段包含的字节数。不论是在Ethernet II还是IEEE802.3标准中,从前序到FCS字段的帧长度最小必须是64字节。最小帧长度保证有足够的传输时间用于以太网网络接口卡精确地检测冲 突,这一最小时间是根据网络的最大电缆长度和帧沿电缆长度传播所要求的时间确定的。基于最小帧长为64字节和使用六字节地址字段的要求,意味着每个数据字 段的最小长度为46字节。唯一的例外是吉比特以太网。在1000Mbit/s的工作速率下,原来的802.3标准不可能提供足够的帧持续时间使电缆长度达 到100米。这是因为在1000Mbit/s的数据率下,一个工作站在发现网段另一端出现的任何冲突之前已经处在帧传输过程中的可能性很高。为解决这一问 题,设计了将以太网最小帧长扩展为512字节的负载扩展方法。对除了吉比特以太网之外的所有以太网版本,如果传输数据少于46个字节,应将数据字段填充至46字节。不过,填充字符的个数不包括在长度字段值中。同时支 持以太网和IEEE802.3帧格式的网络接口卡通过这一字段的值区分这两种帧。也就是说,因为数据字段的最大长度为1500字节,所以超过十六进制数 05DC的值说明它不是长度字段(IEEE802.3).而是类型字段(Ethernet II)。 数据字段 如前所述,数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。 校验序列字段 既可用于Ethernet II又可用于IEE802.3标准的帧校验序列字段提供了一种错误检测机制,每一个发送器均计算一个包括了地址字段、类型/长度字段和数据字段的循环冗余校验(CRC)码。发送器于是将计算出的CRC填入四字节的FCS字段。 虽然IEEE802.3标准必然要取代Ethernet II,但由于二者的相似以及Ethernet II作为IEEE802.3的基础这一事实,我们将这两者均看作以太网。2.1.2 IP网络协议原理TCP/IP协议是一组包括TCP协议和IP协议,UDP协议,ICMP协议和其他一些协议的协议组。1) 结构如图2.1.3所示 图2.1.3 TCP/IP协议层次 链路层:负责接收和发送物理帧,它定义了将数据组成正确帧的规程和在网络中传输帧的规程,帧是指一串数据。它是数据在网络中传输的单位。网络接口层将帧放在网上,或者从网上把帧取下来。网络层:负责相邻节点的通信,本层定义了互联网中传输的“信息包”格式,以及从一个节点通过一个或多个路由器运行必要的路由算法到最终目标的“信息包”转发机制。主要协议有IP、ARP、ICMP、IGMP。运输层:负责起点到终点的通信,为两个用户进程之间建立、管理和拆除有效的端到端连接。主要协议有TCP、UDP等。应用层:它定义了应用程序使用互联网的规程。应用程序通过这一层访问网络,主要遵从BSD网络应用接口规范。主要协议有SMTP、FTP、Telnet、HTTP等。2) 主要协议介绍IP IP是英文Internet Protocol(网络之间互连的协议) 的缩写,中文简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规 则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守 IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。 IP数据包格式如图2.1.4所示 图2.1.4 IP数据包格式IP协议头的结构定义如下:Struct ip_header UINT ip_v:4; /协议版本 UINT ip_hl:4; /协议头长度 UINT ip_tos; /服务类型 UINT16 ip_len; /数据包长度 UINT16 ip_ld; /协议标志 UINT16 ip_off; /分段偏移域 UINT16 ip_ttl; /生存时间 UINT8 ip_p; /IP数据包的高层协议 UINT16 ip_sum; /校验和 Struct in_addr ip_src,ip_dst; /源和目的IP地址 TCPTransmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,TCP层是位于IP层之上,应用层之下的运输层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当 长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端 实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节 发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函 数来检验数据是否有错误;在发送和接收时都要计算和校验。 首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,他是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。 在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。 在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法),该算法主要包括三个主要部分:1,加性增、乘性减;2,慢启动;3,对超时事件做出反应。 TCP协议数据包头格式如图2.1.5所示 图2.1.5 TCP协议数据包头格式 TCP对话通过三次握手来初始化。三次握手的目的是使数据断的发送和接受同步;告诉其他主机其一次可接收的数据量,并建立虚连接。三次握手的简单过程如图2.1.6所示 图2.1.6 TCP三次握手的简单过程 UDP UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是IETF RFC 768是UDP的正式规范。UDP是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。 UDP协议数据包如图2.1.7所示 图2.1.7 UDP协议数据包格式2.1.3网络应用程序开发方法 进行网络应用程序开发有两种方法:一是采用BSD Socket标准借口,程序移植能力强;二是采用专用借口直接调用对应的传输层接口,效率最高。 BSD Socket接口编程方法 BSD是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制。两个通信进程都用一个套接口来描述通信链路的两端。套接口可以认为是一种特殊的管道,但和管道不同的是,套接口对于可以容纳的数据的大小没有限制。套接口进行通信的进程使用的是客户机/服务器模式。服务器用来提供服务,而客户机可以使用服务器提供的服务,就像一个提供w e b页服务的We b服务器和一个读取并浏览web页的浏览器。服务器首先创建一个套接口,然后给它指定一个名字。名字的形式取决于套接口的地址族,事实上也就是服务器的当 地地址。系统使用数据结构sockaddr来指定套接口的名字和地址。一个INET 套接口可以包括一个I P端口地址。你可以在/etc/services中查看已经注册的端口号。传输层专有接口编程方法网络协议都可以直接提供专有函数接口给上层或跨层调用,用户可以调用每个协议代码中特有的借口实现快速数据传输。实验板的网络协议包提供的就是TFTP协议的专用接口,应用程序可以通过它接收用户从主机上使用TFTP传递过来的数据。主要接口函数如下。Extern char * TftpRecv(int * len)接收用户数据,网络协议包自动完成连接过程,并从网络获取用户传递过来的数据包,每次接受最大长度由len制定,返回前改写成实际接收到的数据长度,函数返回数据首地址指针,若返回值为NULL,表示接收故障。MakeAnswer()返回应答信号,每当用户处理完一个数据包后,需要调用此函数给对方一个确认信号,使得数据传输得以继续。 2.1.4 关于CS8900ACS8900A是由美国CIRRUS LOGIC公司生产的以太网控制器,由于其优良性能、低功耗以及低廉的价格,使其在市场上的10MB/s嵌入式网络应用中占有相当大的比例。CS8900A的主要性能如下。A 符合IEEE802.3以太网标准,并带有ISA接口;B 片内4K字节RAM; C 适用于I/O操作模式,存储器操作模式和DMA操作模式; D 带有传送、接收低通滤波的10Base-T连接站口; E 支持10Base2,10Base5和10Base-F的AUI自动重发; F 最大电流消耗为55mA(5V电源); G 全双工操作; H 接网络变压器YL18-1080S到RJ45 J 支持外部EEPROM。 CS8900A引脚分布 CS8900A引脚分布图如2.1.8所示 图2.1.8 CS8900A引脚分布图关于CS8900A程序设计/* File:cs8900a.c* Author:Embest* Desc:cs8900a ethernet chip driver* History:*/#include cs8900a.h#define MEM_BASE0x06000000#define IO_BASE0x07000300#define MAX_COUNT0x00100000#define io_write(addr, val)(*(volatile unsigned short *)(addr) = val)#define io_read(addr)(unsigned short)*(volatile unsigned short *)(addr)#ifdef MEM_MODEinline void reg_write(unsigned short reg, unsigned short val)io_write(MEM_BASE+reg), val);inline unsigned short reg_read(unsigned short reg)return io_read(MEM_BASE+reg);#else /* IO_MODE */inline void reg_write(unsigned short reg, unsigned short val)io_write(IO_BASE+IO_PACKETPAGE_POINTER, reg);io_write(IO_BASE+IO_PACKETPAGE_DATA0, val);inline unsigned short reg_read(unsigned short reg)io_write(IO_BASE+IO_PACKETPAGE_POINTER, reg);return io_read(IO_BASE+IO_PACKETPAGE_DATA0);#endif /* MEM_MODE */unsigned char mac_addr6 = 0x00,0x06,0x98,0x01,0x7E,0x8F ;unsigned char net_out_data1536;unsigned char net_in_data1536;int iReceiveData;int iSendData;int CS_Probe(void)unsigned short id, sign;sign = io_read(IO_BASE+IO_PACKETPAGE_POINTER);io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_Identification);id = io_read(IO_BASE+IO_PACKETPAGE_DATA0);if(sign != ID_SIGNATURE | id != ID_CODE)return 0;return 1;void CS_SetupMemoryBase(unsigned int base)unsigned short temp;/* set memory map base address */io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_MemoryBaseAddress);io_write(IO_BASE+IO_PACKETPAGE_DATA0, base & 0xffff);io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_MemoryBaseAddress+2);io_write(IO_BASE+IO_PACKETPAGE_DATA0, base 16);/* read bus control register */io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_BusCTL);temp = io_read(IO_BASE+IO_PACKETPAGE_DATA0);/* enable memory map */temp |= MemoryE;io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_BusCTL);io_write(IO_BASE+IO_PACKETPAGE_DATA0, temp);int CS_Reset(void)int i;unsigned short result;/* software reset */io_write(IO_BASE+IO_PACKETPAGE_POINTER, REG_SelfCTL);io_write(IO_BASE+IO_PACKETPAGE_DATA0, RESET|SelfCTL_LOW);/* while INITD bit set */for(i=0; i= MAX_COUNT)return 0;/* while SIBUSY bit clean */for(i=0; i= MAX_COUNT)return 0;return 1;unsigned short CS_Identification(unsigned short *rev)unsigned int id;id = reg_read(REG_Identification);*rev = reg_read(REG_Identification+2);return id;void CS_SetupMacAddr(unsigned char *mac)int i;unsigned short unTmp3;memcpy(void *)unTmp,mac,6);mac = (unsigned char *)unTmp;reg_write(REG_IA, *(unsigned short *)(mac);reg_write(REG_IA+2, *(unsigned short *)(mac+2);reg_write(REG_IA+4, *(unsigned short *)(mac+4);void CS_EnableIrq(int enable)unsigned short temp;temp = reg_read(REG_BusCTL);if(enable)temp |= EnableIRQ;reg_write(REG_InterruptNumber, INTRQ0);elsetemp &= EnableIRQ;reg_write(REG_InterruptNumber, ALL_INTRQ_HI);temp = reg_read(REG_ISQ);temp &= LOW_BITS_MASK;switch(temp)case 0x04: reg_read(REG_RxEvent); break;case 0x08: reg_read(REG_TxEvent); break;case 0x0C: reg_read(REG_BufEvent); break;case 0x10: reg_read(REG_RxMISS); break;case 0x12: reg_read(REG_TxCOL); break;void CS_Configuration(void)unsigned short temp;/* configure LineCTL */temp = reg_read(REG_LineCTL);temp &= (AUIonly | AutoAUI_10BT);temp |= (SerRxON | SerTxON | ModBackOffE);reg_write(REG_LineCTL, temp);/* configure RxCTL */reg_write(REG_RxCTL, RxOKA | IdividualA | BroadcastA | RxCTL_LOW);/* configure RxCFG */reg_write(REG_RxCFG, RxCFG_LOW);/* configure TxCFG */reg_write(REG_TxCFG, TxCFG_LOW);int CS_Init(void)unsigned short id, rev;CS_Probe();if(!CS_Reset()uart_printf( Reset CS8900A failed.n);return 0;uart_printf( Reset CS8900A successful, );#ifdef MEM_MODECS_SetupMemoryBase(MEM_BASE);#endifid = CS_Identification(&rev);switch(rev)case REV_B: uart_printf( Rev B.n); break;case REV_C: uart_printf( Rev C.n); break;case REV_D: uart_printf( Rev D.n); break;case REV_F: uart_printf( Rev F.n); break;CS_SetupMacAddr(mac_addr);CS_EnableIrq(0);CS_Configuration();return 1;void CS_Close(void)CS_EnableIrq(0);reg_read(REG_RxEvent);reg_read(REG_TxEvent);/* cleanup LineCTL */reg_write(REG_LineCTL, LineCTL_LOW);/* cleanup RxCTL */reg_write(REG_RxCTL, RxCTL_LOW);/* cleanup RxCFG */reg_write(REG_RxCFG, RxCFG_LOW);/* cleanup TxCFG */reg_write(REG_TxCFG, TxCFG_LOW);int CS_ReceivePacket(unsigned int tms)int i, length;unsigned short *buf;tms *= 50;while(tms)unsigned short temp = reg_read(REG_ISQ);temp = reg_read(REG_RxEvent);if(temp & RxOK) break;tms -;if(tms = 0)return 0;/* Discard RxStatus */reg_read(REG_RxStatus);/* Read the frames length.*/length = reg_read(REG_RxLength);#ifdef MEM_MODE#else#ifdef EDUKITII/ only for the EDUKIT-II board*(volatile unsigned char *)(IO_BASE+IO_RX_TX_DATA0);#endif#endif/* Read frame */buf = (unsigned short *)net_in_data;for(i=0; ilength; i+=2)*buf+ = io_read(IO_BASE+IO_RX_TX_DATA0);return length;int CS_TransmitPacket(unsigned char *data, int length)int i;unsigned short *buf;/* Send Command */#ifdef MEM_MODEreg_write(REG_TxCommand, TxStart | TxCMD_LOW);reg_write(REG_TxLength, (unsigned short)length);#elseio_write(IO_BASE+IO_TX_COMMAND, TxStart | TxCMD_LOW);io_write(IO_BASE+IO_TX_LENGTH, (unsigned short)length);#endif/* Wait */for(i = 0; i = MAX_COUNT)return 0;buf = (unsigned short *)data;for(i=0; ilength; i+=2)io_write(IO_BASE+IO_RX_TX_DATA0, *buf+);iSendData = 0;return 1;/* extern functions*/* name:NicInit* func:initialize CS8900A chip* para:none* ret:none* modify:* comment:*/void NicInit(void)CS_Init();/* delay some times */ delay(100);/* name:NicClose* func:close CS8900A chip* para:none* ret:none* modify:* comment:*/void NicClose(void)/* close ethernet */CS_Close();/* name:NicReset* func:Reset CS8900A chip* para:none* ret:0 - success -1 - fail* modify:* comment:*/int NicReset(void)if(CS_Reset()return 0;return -1;/* name:EtherOutput* func:output data through ethernet CS8900A chip* para:data - data pointer*len - data length* ret:0 - success -1 - fail* modify:* comment:*/int EtherOutput(unsigned char *dmac, char* data, unsigned short len)int i; for(i=0; i6; i+) datai = dmaci;for(i=0; i6; i+) data6+i = mac_addri;len += 14

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论