硬件连接电路系统要实现数据的传输,微控制器和网络接口控制器是关键的部分, 东莞高空路灯车出租
硬件连接电路系统要实现数据的传输,微控制器和网络接口控制器是关键的部分, 东莞高空路灯车出租

产品详情

 

     硬件连接电路系统要实现数据的传输,微控制器和网络接口控制器是关键的部分, 东莞高空路灯车出租, 东莞高空路灯车租赁, 东莞高空路灯车价格   其它部分是协同这两个部分共同完成数据的传输。微处理器用于完成主要的控制工作,而网络接口控制器则是根据网络协议,通过物理媒介来实现系统与外部通信的接口。AT91SAM9G45与DM9161A可通过MII或RMII接口方式进行互联,两种方式都支持标准的10Mb/s和100Mb/s数据传输速度,RMII接口目的是用缩减的引脚数来代替IEEE802.3u的MII。该系统采用RMII接口方式进行连接,DM9161A连接网络隔离变压器后直接与RJ45的插座进行连接。隔离变压器在发送和接收数据时用于信号隔离。MDC引脚是管理数据传送时钟的,最高速度为2.5MHz。MDIO是在MDC时钟信号驱动下,通过数据I/O引脚,向PHY设备传递状态信息。CRS为载波监听引脚,由PHY控制,当信道中非空闲时,使能此信号。COL引脚用来检测信道冲突,由DM9161A驱动,当检测到冲突时,使能此信号,并且持续保持此信号有效。TX_CLK、RX_CLK是传输发送数据、接收数据提供的连续时钟信号引脚,对于10Mbps的串行数据传输,时钟为2.5MHz,100Mbps模式下,时钟为25MHz。TXD3:0/RXD3:0是发送/接收数据位,在10Mbps模式下只用TXD0/RXD0。TXEN/RXEN是数据传输发送/接收使能信号引脚。TXER/RXER是数据发送/接收错误信号引脚。RXDV是接收数据有效引脚,由PHY控制,当PHY准备好卸载和解码数据供MII接收时,使能该信号。当RXDV=1表示数据有效。标准的以太网接口,采用曼彻斯特编码方式进行编码。控制器与DM9161A之间的数据是以四位元组的格式进行传输的。当进行数据发送时,数据经MII总线传送到DM9161A上,接收到的数据经过处理变成串行比特流,之后再次进行编码后输出。数据接收的过程与之相反,编码后的比特流经过解码变成四位元组的数据格式。当芯片处于半双工的工作模式下,进行数据的发送或接收时,CRS信号为高电平。当检测到发送和接收信息同时进行的冲突时,COL信号被置为高电平。在全双工的模式下,载波侦听信号只在接收信息时才为高电平,不存在冲突问题。




      以太网设备驱动程序驱动程序是将操作系统和硬件连接起来的接口,操作系统通过该接口才能进行设备的识别和被其它应用程序进行访问。设备的驱动程序为上层应用程序提供了一个接口,无需了解具体的硬件电路,就可以很方便的对设备进行各种操作。本系统中驱动程序是在Linux操作系统下进行开发的,该操作系统源代码开放、内核小,支持TCP/IP协议,具有强大的网络功能。Linux操作系统中支持的硬件设备为:字符设备、块设备、和网络设备。字符设备不具备缓冲区,可以像字节流一样进行实时的读写访问,例如系统中的串口等。块设备是以块为单位进行读写的,支持随机访问,主要是针对慢速设备的。网络设备采用BSD套接口实现读写,驱动根据系统定义的统一接口对硬件进行访问。在Linux内核中,网络驱动程序的体系结构从上到下可以划分为四层,分别为网络协议接口层、网络设备接口层、设备驱动功能层和网络设备媒介层。 网络设备驱动分层结构(1)网络协议接口层是通过调用内核提供的dev_queue_xmit()和net_fx()两个接口为上层提供数据包接收和发送的接口。Linux网络系统采用Socket机制,发送和接收的数据包主要内容为sk_buff结构中的数据,sk_buff套接字缓冲区为网络层提供了一种高效的缓冲区处理和流量控制机制。这一层不会因为设备不同受到影响。(2)网络设备接口层定义了net_device结构体,该结构体中含有网络设备的所有信息。每个网络设备都可以进行注册,通过对自身net_device中成员变量进行赋值,完成内核和设备连接,可通过调用函数来操作设备完成相应功能。net_device相当于网络设备的通用接口,且每个网络接口都可看成一个发送和接收数据包的实体。(3)设备驱动功能层是接口层结构体中函数指针的具体实现,net_device结构中指向的设备打开、关闭、数据包发送、中断处理等具体的函数,是网络设备驱动的主要部分。(4)网络设备媒介层具体对应于实际接收和发送数据的硬件设备。在Linux中网络设备是通过指向net_device数据结构体的以dev_base为头指针的链表28来管理所有的网络设备50。系统通过网络结构管理表中的dev_base指针找到net_device数据结构,通过net_device结构中的初始化指针找到初始化的函数,对设备进行初始化操作。完成初始化后,需将设备进行打开操作,再进行数据包的传送。每个网络设备在内核中都通过一个net_device结构来表示,该数据结构中保存了该设备的所有相关信息。在一个网络设备使用之前,需根据设备特性对该结构内容进行分配和填充,并在net/core/dev.c文件中采用函数将其注册到内核中。网络设备的注册与注销是通过调用register_netdev()和unregister_netdev()函数来实现。net_device结构体比较庞大,按参数类型可分为全局成员、硬件相关成员、接口相关成员、设备方法成员和共用成员五部分。



    东莞高空路灯车出租, 东莞高空路灯车租赁, 东莞高空路灯车价格 http://www.zhaoqingyuntichechuzu.com/





     网络设备初始化网络驱动程序是Linux内核中的一个模块,在内核模块被加载调用时,会对模块进行初始化操作,由初始化函数来对网络设备的硬件寄存器、DMA和相关的内核变量等进行配置。设备的初始化函数中主要实现对硬件的初始化和内核变量的初始化两部分。(1)硬件初始化需对PHY、MAC和DMA三个硬件部分进行操作。PHY模块通过MACB_InitPhy()、MACB_AutoNegotiate()和MACB_GetLinkSpeed()函数实现对双工/半双工模式、自协商模式和运行速率等参数的设置。初始化MAC模块实现对设备接口模式的设置,初始化DMA模块完成对BD表的建立、属性以及分配缓存等进行设置。(2)内核变量的初始化,主要是完成设备IO资源的申请,对net_device结构体中相关成员变量进行初始化,完成中断的处理,时钟的设置、设备注册等。设备通过探针函数probe进行初始化操作,在初始化操作结束后,检测到的设备将直接保存到接口管理链表中,通过指针指向net_device数据结构,其链表中的每个单元表示一个已经存在的网络设备。网络设备的打开和关闭驱动程序在加载的过程中需对接口进行探测,且在数据包发送或接收前必须打开并初始化接口。位于net_device数据结构中的打开接口函数,格式为int(*open)(structnet_device*dev),其中open函数指针指向的函数负责打开接口,并告知接口开始工作,DMA通道、中断、I/O端口等资源进行相应的设置。接着系统通过调用netif_start_queue函数使发送开始工作。关闭接口函数要完成与打开相反的操作,实现函数为net_device数据结构中的stop函数,格式为int(*stop)(structnet_device*dev)。关闭后系统调用netif_stop_queue()函数,数据包结束传送,并释放某些资源以减少系统的负担。




     数据的发送和接收网络设备最重要的操作就是发送和接收数据,发送是通过相应的发送函数接口来实现的,待发送的数据包经过系统调用进入到内核空间,处理后会保存在sk_buff结构体所指向的套接字缓冲区中。然后系统内核再通过调用数据包的发送函数,函数格式为:inthard_start_xmit(structsk_buff*skb,structnet_device*dev),其中skb为sk_buff的指针,将套接字缓冲区的数据通过DMA传输到DM9161A中转换成串行比特流,再进行曼彻斯特编码处理后发送数据。发送后释放skb缓冲区,重新使能中断。数据包的接收是以中断机制为基础的,是个被动的过程。当数据到来时会触发硬件产生中断信号,通过读取中断状态寄存器,判断出数据接收中断后,内核会切断当前正在执行的进程,调用dmfe_packet_receive(structnet_device*dev)数据接收函数。并根据获取接收数据包的大小,通过操作skb=dev_allocskb()函数,申请套接字缓存的大小。将DM9161接收到的数据通过DMA读到skb中,填充信息成为规范的sk_buff结构后,操作netif_rx()函数,将数据包放到系统接收队列中,完成数据向协议层的传输。




     东莞高空路灯车出租, 东莞高空路灯车租赁, 东莞高空路灯车价格