基于MC9328MXl的Socket通讯设计与实现

介绍了基于新一代龙珠 i.MX系列芯片MC9328MXl(ARM920T)最小系统的嵌入式系统开发平台,对其以太网卡部分围绕网卡芯片CS8900A进行了嵌入式网络通讯 系统的电路设计。在此基础上,经过对应用层的Socket编程的研究和分析,在嵌入式Linux环境下实现了开发板与PC机之间的C/S模式通讯。1引言 目前,嵌入式系统已经普遍应用到人们的工做、生活中,2003年我国嵌入式系统应用产品经济总量达l000亿元。随着技术的发展,8位MCU市场已逐步趋 向稳定html

        介绍了基于新一代龙珠i.MX系列芯片MC9328MXl(ARM920T)最小系统的嵌入式系统开发平台,对其以太网卡部分围绕网卡芯片CS8900A进行了嵌入式网络通讯系统的电路设计。linux

      在此基础上,经过对应用层的Socket编程的研究和分析,在嵌入式Linux环境下实现了开发板与PC机之间的C/S模式通讯。

       1 引言
   编程

       目前,嵌入式系统已经普遍应用到人们的工做、生活中,2003年我国嵌入式系统应用产品经济总量达l 000亿元。随着技术的发展,8位MCU市场已逐步趋向稳定,32位MPU表明着嵌入式技术的发展方向,正在加速发长。在32位嵌入式微处理器市场上,基于ARM内核的微处理器处于绝对的领导地位。
   服务器

       嵌入式系统是以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统除 了具备高效、稳定、性能专注等优势外,还具备实时性较高的操做系统。嵌入式系统与通讯、网络技术的结合能够极大加强网络的智能化与灵话性,拓展通讯功能, 从而实现各类通讯系统之间的互联互通。本文给出了一种适合于中/低端应用的通讯平台设计方案,它可支持以太网之间的数据传输,而且具备RS232RS485USB等接口。文中围绕嵌入式Linux环境设计了基于MC9328MXl(ARM920T)最小系统的硬件通讯平台,从而实现了嵌入式Socket通讯。网络

       2 最小系统分析
   socket

       Motorola公司的MC9328MXl是以ARM920T为内核的高性价比16/32位RISC微控制器,内含一个ARM公司设计的16/32位 ARM920T RISC处理器核,ARM920T为低功耗,高性能16/32位核,最适合于对价格及功耗敏感的应用场合。除了ARM920T核之外,MC9328MXl 还包含了许多外围功能模块。处理器和这些模块都集成在核心板上,其具体结构如图1所示。函数

       由图1可见,除了ARM920TDMI内核外,MC9328MXl还集成了多个外围功能模块:一个LCD控制器、一个脉冲调制控制器、一个USB控制器及多个扩展通道,可是没有集成用于网络通讯的以太网控制器。因此,须要设计包含合适的以太网控制器的外围电路。性能

       3 外围电路设计
   操作系统

       本系统选用与MC9328MXl相匹配的CS8900A做为以太网控制器。CS8900A是Cirrus Logic公司生产的低功耗16位以太网控制器,功能强大。该器件的突出特色是使用灵活,其物理层接口、数据传输模式和工做模式等都能根据须要动态调整, 经过内部寄存器的设置来适应不一样的应用环境。
   设计

       CS8900A内部结构框图如图2所示,内部功能模块主要是802.3介质访问控制块(MAC)。802.3介质访问控制块支持全双工工做模式,彻底依照IEEE802.3以太网标准,采用100引 脚TQFP封装,负责处理有关以太网数据帧的发送和接收,包括:冲突检测、帧头的产生和检测、CRC校验码的生成和验证。经过对发送控制寄存器 (TxCMD)的初始化配置,MAC能自动完成帧的冲突后重传。若是帧的数据部分少于46个字节,它能生成填充字段使数据帧达到802.3所要求的最短长 度。

    CS8900A的主要特色以下:
   

    ·符合IEEE802.3以太网标准,并带有ISA接口;
    ·片内4KB RAM;
    ·适用于I/O工做模式、存储器工做模式和DMA工做模式;
    ·带有传送、接收低通滤波的lOBase2T链接端口;
    ·支持lOBase2,lOBase5和lOBase2F的AUI接口;
    ·自动生成报头,自动进行CRC检验,冲突后自动重发;
    ·最大电流消耗为55mA(5 V电源);
    ·全双工工做模式; 
    ·支持外部EEPROM
   

       另外,要实现CS8900A与主机之间的数据通信,在电路设计时可根据具体状况灵活选择合适的数据传输模式。CS8900A支持的传输模式有:I/O模式 和Memory模式,另外还有DMA模式。其中,I/O模式是访问CS8900A存储区的缺省模式,简单易用。
   

       由MC9328MXl的引脚描述能够看出,MCU的数据是经过D[3l:0]传输的,而以太网控制器CS8900A最多使用16位传输模式,因此MC9328MXl的数据总线前16位(D[15:0])应与CS8900A的SD[O:15]相连,为解决速度不匹配的问题,需使用具备缓冲功能的总线收发器。从成本考虑,该系统采用两个8位的74LS245。地址信息经过MC9328MXI地址总线接口的A[DO:03]与CS8900A的SA[00:03]经过缓冲器74HC244相连,A[04:19]与SA[04:19]直接相连用于设置网卡的初始基址。另外,CS8900A经过一个带扼流线圈的隔离变压器20F001N将CPU发 送的数据(变比为l:1.414)发送到网络上;接收数据时,网络传送的数据通过隔离变压器(变比为1:1)。隔离变压器的做用主要是将外部线路与 CS8900A隔开,防止干扰和烧坏元件,实现带电的插拔功能。XTALl与XTAL2之间的晶振为CS8900A提供稳定的时钟脉冲。其电路图如图3所 示。

       4 基于嵌入式Linux的Socket通讯
   

       基于嵌入式Linux的开发环境通常由装有交叉编译器的PC机和硬件开发板组成。本设计以PC宿主机做为客户端,以MC9328MXl的开发板做为服务器 实现通讯。先由PC机将客户机程序(server)编译好后,经过串口写入开发板,而后将开发板与PC机经过以太网口创建链接。
   

       Socket(套接字)是经过标准UNIX文件描述符和其余程序通信的一个方法,其实质是提供了进程通讯的端点,能够看做是一种特殊的管道。经过 Sock-et编程能够实现网络通讯。一个完整的套接字有一个相关的描述:协议、本地地址、本地端口、远程地址、远程端口。
   

      通用套接口地址结构struct sockaddr的定义以下:


    套接字操做函数主要有:
   

   (1)建立一个Sockets
    sockfd=socket (family,type,protocol)
    其中由地址类(family)参数指定该Socket使用的地址类。由类型(type)参数规定所请求的通讯类型。协议(protocol)参数通常为零,使得默认的协议将自动被选取。
    (2)链接本地地址
    本函数的主要功能是将一个规定的地址与一个Sockets结合,一个服务进程要使用以下函数:bind(sockfd,address,addrlen)其中,sockfd参数是由socket()调用返回的sockets描述符。address指向一个地址结构,addrlen参数规定了地址的字节长度。
    (3)客户进程链接到服务进程
    用此函数实现客户进程对服务进程链接的初始化。此系统调用是:
    connect(sockfd,address,addrlen)
    其中,sockfd是本地Sockets的Sockets描述符。address规定目的机上服务进程正在使用的地址,addrlen规定了地址的字节长度。
    当connect()函数被调用时,若是客户的Sockets尚未结合到一个本地地址,则系统自动选择一个本地地址和一个适当的端口号,而且把它们和该客户的Sockets相结合。
    (4)网络监听
    int listen(int sockfd,int backlog);
    sockfd是Socket系统调用返回的Socket描述符;backlog指定在请求队列中容许的最大请求数,进入的链接请求将在队列中等待 accept ()(参考下文)。backlog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20。若是一个服务请求到来时,输入队列已满,该 Socket将拒绝链接请求,客户将收到一个出错信息。当出现错误时listen函数返回-l,并置相应的errno错误码。
    (5)接收请求函数
    accept()函数让服务器接收客户的链接请求。在创建好输入队列后,服务器就调用accept函数,而后睡眠并等待客户的链接请求。
    int accept(int sockfd,void*addr,int*addrlen);
    sockfd是被监听的Socket描述符,addr一般是一个指向sockaddr_in变量的指针,该变量用来存放提出链接请求服务的主机的信息;addrlen一般为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。
    (6)数据传输
    Send()和Recv()这两个函数应用于面向链接的Socket上进行数据传输。
    Send()函数原型为:int send(int sockfd,const void*msg,int len,int flags);sockfd是用来传输数据的socket描述符;msg是一个指向要发送数据的指针;len是以字节为单位的数据长度;flags通常状况下置为0。
    Recv ()函数原型为:int Recv(int sockfd,void*buf int len,unsigned int flags);sockfd是接受数据的Socket描述符;buf是存放接收数据的缓冲区;len是缓冲的长度。flags也被置为O。Recv()返回实际上接收的字节数,当出现错误时,返回-1并置相应的errno值。
   

      本部分设计的目的是经过分析Socket的编程方法,编写一个服务器程序server,用arm-linux-gcc编译后运行在ARM开发板上,一个客户端程序client用gcc编译后在PC上运行。
   

       整体编程模型即客户机与服务器的通讯过程见图4。

      4.1 服务器端
    (1)初始化

      4.2 客户机端
    (1)经过服务器域名得到服务器的IP地址


    函数gethostbyname ()是完成域名转换的。当gethostname()调用成功时,返回指向struct hosten的指针,当调用失败时返回-1。
    (2)建立一个Socket(实现方法与服务器端相同)
    (3)与服务器创建链接


        这样,给ARM开发板CS8900A网卡分配地址,而且编译server和client程序后,能够将开发板用做服务器,PC用做客户端,实现二者的通讯。

       5 结束语
   

        本文设计开发了基于MC9328MXl的以太网通讯系统,并利用嵌入式linux操做系统强大的网络功能实现了Socket通讯。文中的客户端应用程序已 经在基于ARM9TDMI核的MC9328MXl处理器的嵌入式开发平台上成功运行,应用宿主PC机的服务器端应用程序成功实现了Socket通讯。当 然,也能够把目标硬件开发平台看成服务器端,而把宿主PC机看成客户端来进行双向文件传输。

相关文章
相关标签/搜索