互联网技术对人类社会的影响不言而喻。当今大部分电子设备都能以不同的方式接入互联网(Internet),在家庭中PC常见的互联网接入方式是使用路由器(Router)组建小型局域网(LAN),利用互联网专线或者调制解调器(modem)经过电话线网络,连接到互联网服务提供商(ISP),由互联网服务提供商把用户的局域网接入互联网。而企业或学校的局域网规模较大,常使用交换机组成局域网,经过路由以不同的方式接入到互联网中。
通信至少是两个设备的事情,需要相互兼容的硬件和软件支持,我们称之为通信协议、以太网通信在结构上比较复杂,国际标准组织将整个以太网通信结构制定了OSI模型,总共分为7层,分别为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。每个层功能不同,通信中各司其职,整个模型包括硬件和软件定义。OSI模型是理想分层,一般的网络系统只是涉及其中几层。
TCP/IP是互联网最基本的协议,是互联网通信使用的网络协议,由网络层的IP协议和传输层的TCP协议组成。TCP/IP只有4层,分别为应用层、传输层、网络层、网络访问层。虽然TCP/IP分层少了,但与OSI模型是不冲突的,它把OSI模型一些层次整合到了一起,本质上可以实现相同功能。
实际上,还有一个TCP/IP混合模型,分为5层,它实际与TCP/IP4层模型是相通的,只是把网络访问层拆成数据链路层和物理层。这种分层方法对我们学习理解更容易。
设计网络时,为了降低网络设计的复杂性,对组成网络的硬件、软件进行封装、分层,这些分层即构成了网络体系模型。在两个设备相同层之间的对话、通信约定,构成了层级协议。设备中使用的所有协议加起来统称为协议栈。在这个网络模型中,每一层完成不同的任务,都提供接口供上一层访问。而在每层的内部,可以使用不同的方式来实现接口,因而内部的改变不会影响其他层。
在TCP/IP混合参考模型中,数据链路层又被分为LLC(逻辑链路层)和MAC层(媒体介质访问层)。目前,对于普通的接入网络终端的设备。LLC层和MAC层是软件、硬件的分界线。如PC的网卡主要负责实现参考模型中的MAC子层和物理层,在PC的软件系统中则有一套庞大的程序实现了LLC层及以上的所有网络层次的协议。
由硬件实现的物理层和MAC子层在不同的网络形式有很大的区别,如以太网和WIFI,这是由物理传输方式决定的。但由软件实现的其他网络层次通常不会有太大区别,在PC上能实现完整的功能,一般支持所有协议(TCP/IP协议栈的一整套实现),而在嵌入式领域则按需要进行裁剪(譬如目前流行的LwIP协议栈,它是TCP/IP协议栈的精简版)。
以太网(Ethernet)是互联网技术的一种,由于它是在组网技术中占的比例最高,很多人直接把以太网理解为互联网。
以太网是指遵守IEEE 802.3标准组成的局域网,由IEEE 802.3标准规定的主要是位于参考模型的物理层(PHY)和数据链路层中的介质访问控制子层(MAC)。在家庭、企业和学校所组建的PC局域网一般也是以太网,其标志是使用水晶头网线来连接(当然还有其他形式)。IEEE 还有其他局域网标准,如IEEE 802.11是无线局域网,俗称WiFi。IEEE 802.15是个人域网,即蓝牙技术,其中的IEEE 802.15.4标准则是ZigBee技术。
现阶段,工业控制、环境监测、智能家居的嵌入式设备产生了接入互联网的需求,利用以太网技术,嵌入式设备可以非常容易的接入到现有的计算机网络中。
在物理层,由IEEE 802.3标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,物理层一般是通过一个PHY芯片实现其功能的。
①传输介质
传输介质包括同轴电缆、双绞线(水晶头网线是一种双绞线)、光纤。根据不同的传输速度和距离要求,基于这三类介质的信号线又衍生出很多不同的种类。最常用的是“五类线”适用于100BASE-T和10BASE-T的网络,它们的网络速率分别为100Mbps和10Mbps。
②编码
为了让接收方在没有外部时钟参考的情况下也能确定每一位的起始、结束和中间位置,在传输信号时不直接采用二进制编码。在10BASE-T的传输方式中采用曼彻斯特编码,在100BASE-T中则采用4B/5B编码。
曼彻斯特编码把每一个二进制位周期分为两个间隔,在表示‘1’时,以前半个周期为高电平,后半个周期为低电平。表示“0”时则相反。
采用曼彻斯特码在每个位周期都有电压变化,便于同步。但这样的编码方式效率太低,只有50%。
在100BASE-T采用的4B/5B编码是把待发送数据位流的每4位分为一组,以特定的5位编码来表示,这些特定的5位编码能是数据流有足够多的跳变,达到同步的目的,而且效率也从曼彻斯特编码的50%提高到了80%。
③CSMA/CD冲突检测
早期的以太网大多是多个节点连接到同一条网络总线上(总线型网络),存在信道竞争问题,因而每个连接到以太网上的节点都必须具备冲突检测功能。以太网具备CSMA/CD冲突检测机制,如果多个节点同时利用同一条总线发送数据,则会产生冲突,总线上的节点可通过接收到的信号与原始发送的信号做比较检测是否存在冲突,若存在冲突则停止发送数据,随机等待一段时间再重传。
现在大多数局域网组建的时候很少采用总线型网络,大多是一个设备接入到一个独立的路由或交换机接口,组成星型网络,不会产生冲突。但为了兼容,新出的产品还是带有冲突检测机制。
①MAC的功能
MAC子层是属于数据链路层的下半部分,它主要负责与物理层进行数据交接,如是否可以发送数据,发送的数据是否正确,对数据流进行控制等。它自动对来自上层的数据包加上一些控制信号,交给物理层。接收方得到正常数据时,自动去除MAC控制信号,把该数据包交给上层。
②MAC数据包
IEEE对以太网传输的数据包格式也进行了统一规定,该数据包被称为MAC数据包。
MAC数据包由前导字段、帧起始定界符、目标地址、源地址、数据包类型、数据域、填充域、校验和域组成。
以上是标准的MAC数据包,IEEE 802.3同时还规定了扩展的MAC数据包,它是在标准的MAC数据包的SA和数据包类型之间添加4个字节的QTag前缀字段,用于获取标志的MAC帧。前2个字节固定为0x8100,用于识别QTag前缀的存在,后两个字节内容分别为3个位的用户优先级、1个位的标准格式指示符(CFI)和一个12位的VLAN标识符。
标准 TCP/IP 协议是用于计算机通信的一组协议,通常称为 TCP/IP 协议栈,通俗讲就是符合以太网通信要求的代码集合,一般要求它可以实现每个层对应的协议,比如应用层的 HTTP、FTP、DNS、SMTP 协议,传输层的 TCP、UDP 协议、网络层的 IP、ICMP 协议等等。关于 TCP/IP 协议详细内容推荐阅读《TCP-IP 详解》和《用 TCP/IP 进行网际互连》理解。
Windows 操作系统、UNIX 类操作系统都有自己的一套方法来实现 TCP/IP 通信协议,它们都提供非常完整的 TCP/IP 协议。对于一般的嵌入式设备,受制于硬件条件没办法支持使用在 Window 或 UNIX 类操作系统的运行的 TCP/IP 协议栈,一般只能使用简化版本的TCP/IP 协议栈,目前开源的适合嵌入式的有 uIP、TinyTCP、uC/TCP-IP、LwIP 等等。其中LwIP 是目前在嵌入式网络领域被讨论和使用广泛的协议栈。本章内容其中一个目的就是移植 LwIP 到开发板上运行。
物理层主要定义物理介质性质,MAC 子层负责与物理层进行数据交接,这两部分是与硬件紧密联系的,就嵌入式控制芯片来说,很多都内部集成了 MAC 控制器,完成 MAC 子层功能,所以依靠这部分功能是可以实现两个设备数据交换,而时间传输的数据就是 MAC数据包,发送端封装好数据包,接收端则解封数据包得到可用数据,这样的一个模型与使用 USART 控制器实现数据传输是非常类似的。但如果将以太网运用在如此基础的功能上,完全是大材小用,因为以太网具有传输速度快、可传输距离远、支持星型拓扑设备连接等等强大功能。功能强大的东西一般都会用高级的应用,这也是设计者的初衷。
使用以太网接口的目的就是为了方便与其它设备互联,如果所有设备都约定使用一种互联方式,在软件上加一些层次来封装,这样不同系统、不同的设备通讯就变得相对容易了。而且只要新加入的设备也使用同一种方式,就可以直接与之前存在于网络上的其它设备通讯。这就是为什么产生了在 MAC 之上的其它层次的网络协议及为什么要使用协议栈的原因。又由于在各种协议栈中 TCP/IP 协议栈得到了最广泛使用,所有接入互联网的设备都遵守 TCP/IP 协议。所以,想方便地与其它设备互联通信,需要提供对 TCP/IP 协议的支持。
用以太网和WiFi做例子,它们的MAC子层和物理层有较大的区别,但在MAC之上的LLC层、网络层、传输层和应用层的协议,是基本相同的,这几层协议由软件实现,并对各层进行封装。根据TCP/IP协议,各层要实现的功能如下:
实际上,在发送数据时,经过网络协议栈的每一层,都会给来自上层的数据添加上一个数据包的头,再传递给下一层。在接收方收到数据时,一层层的把所在层的数据包的头去掉,向上层递交数据。
STM32F42x系列控制器内部集成了一个以太网外设,它实际是一个通过DMA控制器进行介质访问控制(MAC),它的功能就是实现MAC层的任务。借助以太网外设,STM32F42x控制器可以通过ETH外设按照IEEE 802.3-2002标准发送和接收MAC数据包。
ETH内部自带专用的DMA控制用于MAC,ETH支持两个工业标准接口(MII和RMII)用于和外部PHY芯片连接。MII和RMII接口用于MAC数据包传输(stm32和PHY之间传输数据),ETH还集成了站管理接口(SMI)接口专门用于与外部PHY通信,用于访问PHY芯片寄存器(该接口用于配置PHY芯片的属性)。
物理层定义了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,PHY芯片是物理层功能实现的实体,生活中常用水晶头网线+水晶头插座+PHY组合构成了物理层。
ETH有专用的MDA控制器,它通过AHB主从接口与内核和存储器相连,AHB主接口用于控制数据传输,而AHB从接口用于访问“控制与状态寄存器”(CSR)空间。在进行数据发送时,先将数据由存储器以MDA传输到发送TX FIFO进行缓冲,然后由MAC内核发送;接收数据时,RX FIFO先接收以太网数据帧,再由DMA传输至存储器。ETH系统功能如下图。左边是MAC内核,右边是PHY芯片。
SMI是MAC内核访问PHY寄存器标志接口(用于配置PHY芯片),它由2根线组成,数据线MDIO和时钟线MDC。SMI支持访问32个PHY,这在设备需要多个网口时非常有用,不过一般设备都只使用一个PHY。PHY芯片内部一般都有32个16位的寄存器,用于配置PHY芯片属性、工作环境、状态指示等等,当然很多PHY芯片并没有使用到所有寄存器位。MAC内核就是通过SMI接口向PHY的寄存器写入数据或从PHY寄存器读取PHY状态,一次只能对一个PHY的其中一个寄存器进行访问。SMI最大通信频率为2.5MHZ,通过控制以太网MAC MII地址寄存器(ETH_MACMIIAR)的CR位可选择时钟频率。
①SMI帧格式
SMI是通过数据帧方式与PHY通信的,帧格式如下图,数据位传输顺序从左到右。
PADDR用于指定PHY地址,每个PHY都有一个地址,一般有PHY硬件设计决定,所以是固定不变的。RADDR用于指定PHY寄存器地址。TA为状态转换域,若为读操作,MAC输出两个位高阻态,而PHY芯片则在第一位时输出高阻态,第二位时输出“0”。若为写操作,MAC输出“10”,PHY芯片则输出高阻态。数据段有16位,对应PHY寄存器每个位,先发送或接收到的位对应以太网MAC MII数据寄存器(ETH_MACMIIDR)的位15.
②SMI读写操作
当以太网MAC MII地址寄存器(ETH_MACMIIAR)的写入位和繁忙位被置1时,SMI将向指定的PHY芯片指定寄存器写入ETH_MACMIIDR中的数据。写操作时序图如下。
当以太网MAC MII地址寄存器(ETH_MACMIIAR)的写入位为0并且繁忙位被置1时,SMI将从指定的PHY芯片指定寄存器读取数据到ETH_MACMIIDR内。读操作时序图如下。
介质独立接口(MII)用于连接MAC控制器和PHY芯片,提供数据传输路径。RMII接口是MII接口的简化版本,MII需要16根通信线,RMII只需要7根通信线,在功能上是相同的。
因为要达到100Mbit/s传输速度,MII和RMII数据线数量不同,使用MII和RMII在时钟线的设计是完全不同的。对于MII接口,一般是外部为PHY提供25MHZ时钟源,再由PHY提供TX_CLK和RX_CLK时钟。对于RMII接口,一般需要外部直接提供50MHZ时钟源,同时接入MAC和PHY。
STM32F407开发板板载的PHY芯片型号为LAN8720A,该芯片只支持RMII接口。
ETH外设负责MAC数据包发送和接收。利用DMA从系统寄存器得到数据包数据内容,ETH外设自动填充完成MAC数据包封装,然后通过PHY发送出去。在检测到有MAC数据包需要接收时,ETH外设控制数据接收,并解封MAC数据包得到解封后数据通过DMA传输到系统寄存器内。
①MAC数据包发送
MAC数据帧发送全部由DMA控制,从系统存储器读取的以太网帧由DMA推入FIFO,然后将帧弹出并传输到MAC内核。帧传输结束后,从MAC内核获取发送状态并传回DMA。在检测到SOF(Start Of Frame)时,MAC接收数据并开始MII发送。在EOF(End Of Frame)传输到MAC内核后,内核将完成正常的发送,然后将发送状态返回给DMA。如果在发送过程中发送常规冲突,MAC内核将使发送状态有效,然后接收并丢弃所有后续数据,直至收到下一SOF。检测到来自MAC的重试请求时,应从SOF重新发送同一帧。如果发生期间未连续提供数据,MAC将发出下溢状态。在帧的正常传输期间,如果MAC在未获得前一帧的EOF的情况下接收到SOF,则将忽略该SOF并将新的帧视为前一帧的延续。
MAC控制MAC数据包的发送操作,它会自动生成前导字段和SFD以及发送帧状态返回给DMA,在半双工模式下自动生成阻塞信号,控制jabber(MAC看门狗)定时器用于在传输超过2048字节时切断数据包发送。在半双工模式下,MAC使用延迟机制进行流量控制,程序通过ETH_MACFCR寄存器的BPA位置1来请求流量控制。MAC包含符合IEEE 1588的时间戳快照逻辑。MAC数据包发送时序参考图如下图。
②MAC数据包接收
MAC接收到的数据包填充RX FIFO,达到FIFO设定阈值后请求DMA传输。在默认直通模式下,当FIFO接收到64个字节(使用ETH_DMAOMR寄存器中的RTC位配置)或完整的数据包时,数据将弹出,其可用性将通知给DMA。DMA向AHB接口发起传输后,数据传输将从FIFO持续进行,直到传输完整个数据包。完成EOF帧的传输后,状态字将弹出并发送到DMA控制器。在RX FIFO存储转发模式(通过ETH_DMAOMR寄存器中的RSF配置)下,仅在帧完全写入RX FIFO后才可读出帧。
当MAC在MII上检测到SFD时,将启动接收操作。MAC内核将去除报头和SFD,然后再继续处理帧。检查报头字段以进行过滤,FCS字段用于验证帧的CRC,如果帧未通过地址滤波器,则在内核中丢弃该帧。MAC数据包接收时序参考图如下。
MAC过滤功能可以选择性的过滤设定目标地址或源地址MAC帧。它将检查所有接收到的数据帧的目标地址和源地址,根据过滤选择设定情况,检测后报告过滤状态。针对目标地址过滤可以有三种,分别是单播、多播和广播目标地址过滤;针对源地址过滤就只有单播地址过滤。
单播目标地址过滤是将接收的相应DA字段与预设的以太网MAC地址寄存器内容比较,最高可预设4个过滤MAC地址。多播目标地址过滤是根据过滤寄存器中的HM位执行对多播地址的过滤,是对MAC地址寄存器进行比较来实现的。单播和多播目标地址过滤都还支持Hash过滤模式。广播目标地址过滤通过将帧过滤寄存器的BFD位置1使能,这使得MAC丢弃所有广播帧。
单播源地址过滤是将接收的SA字段与SA寄存器内容进行比较过滤。
MAC过滤还具备反向过滤操作功能,即让过滤结构求补集。
我们的STM32F407采用 RMII 接口和外部 PHY 芯片连接,实现网络通信功能,探索者 STM32F4 开发板使用的是 LAN8720A 作为 PHY 芯片。
LAN8720A 是低功耗的 10/100M 以太网 PHY 层芯片,I/O 引脚电压符合 IEEE802.3-2005 标准,支持通过 RMII 接口与以太网 MAC 层通信,内置 10-BASE-T/100BASE-TX 全双工传输模块,支持 10Mbps 和 100Mbps。
LAN8720A 可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持 HPAuto-MDIX 自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。
LAN8720A 的主要特点如下:
LwIP是Light Weight Internet Protocol的缩写,是由瑞士计算机科学院Adam Dunkels等开发的适用于嵌入式领域的开源轻量级TCP/IP协议栈。它可以移植到含有操作系统的平台中,也可以在无操作系统的平台下运行。由于它开源、占用的RAM和ROM比较少、支持较为完整的TCP/IP协议、且十分便于裁剪、调试,被广泛应用在中低端的32位控制器平台。可以访问网站:http://savannah.nongnu.org/projects/lwip获取更多Lwip信息。
我们在上述网站可以找到相应的LwIP源码下载通道。我们下载2个压缩包:lwip-1.4.1.zip和contrib-1.4.1.zip。
lwip-1.4.1.zip包括了LwIP的实现代码,contrib-1.4.1.zip包含了不同平台移植LwIP的驱动代码和使用LwIP实现的一些应用实例测试。
但是,遗憾的是contrib-1.4.1.zip并没有为STM32平台提供实例,这对于初学者想要移植LwIP来说难度还是非常大的。ST公司也是认识到LwIP在嵌入式领域的重要性,所以他们针对LwIP应用开发了测试平台,其中有一个是在STM32F4x7系列控制器运行的(文件编号为:STSW-STM32070),虽然我们的开发板平台是STM32F429控制器,但经测试发现关于ETH驱动部分以及LwIP接口函数部分是可以通用的。为减少移植工作量,我们选择使用ST官方例程相关文件,特别是ETH底层驱动部分函数,这样我们也可以花更多精力在理解代码实现方法上。
文章浏览阅读1.7w次,点赞4次,收藏9次。编程语言排行榜TIOBE排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据,只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。链接:https://www.tiobe.com/tiobe-index/2019年3月排..._常见的编程语言
文章浏览阅读442次。cache是smarty区别于其他模板系统的一个很重要的地方: 1. 设置当前这个页面的缓存时间。 2. 设置当前这个页面的CacheID,模板编号可以使用“|”分组。 3. 判断当前页面有没有被缓存过,如果缓存过,则直接读取缓存文件,没有缓存或者缓存过期,则执行正常的逻辑查找数据,显示页面,同时生成缓存文件。1.配置cacheinclude("Smart_id="basictpl
文章浏览阅读442次。快速排序(每次看到它我总会想起大一上学C语言的时候的二分法查找目标元素。。。)快速排序中的重要一员就是基准数,将它归位,使得归位后该数的左边都是小于它的数,右边都是大于它的数。此时得到的序列不一定有序,因为它的左边和右边的大小顺序是不一定的。然后再选择一个基准数,继续进行交换,归位。采用递归方式实现。有点怕递归。。。举个例子:假设现在有无序的一组数:4,2,8,7,6,9,10,1,3,5(也就是1-10),以第一个数作为基准数,然后从最后一个位置开始向前寻找比4小的数,找到后停止,再从第二个位置向后寻_c语言快速排序程序实现。 要求:输入一组无序的数据a[]={4,7,1,5,3,8,2,6} 输出这
文章浏览阅读10w+次,点赞222次,收藏2.3k次。本文章目的:1)针对单片机外设做详细的教程,丰富个人技能吃,彻底从原理+应用来写外设2)给广大蓝牙爱好者提供蓝牙应用方面的教程(结合我们的蓝牙协议栈会事半功倍)蓝牙协议栈教程点击我3)给广大Wi-Fi爱好者提供Wi-Fi方面的教程(结合我们的Wi-Fi协议栈会事半功倍)Wi-Fi协议栈教程点击我4)给广大GUI爱好者提供LVGL方面的教程LVGL教程点击我5)把各个技能池组合起来,举一反三,做炫酷的实例应用教程内容:我们的内容包括但不限于:1)IDF基础介绍_esp32教程
文章浏览阅读2.1k次,点赞6次,收藏17次。目录一.实验目的:二.实验任务:三.实验内容:1.冒泡排序实验分析:2.冒泡排序实验代码:3.冒泡排序实验结果:4.二维数组实验分析:5.实验代码6.运行结果:四.实验总结:一.实验目的:掌握用指针及引用作参数编写程序的知识技能; 提高学习者面向对象程序开发工具的自学习能力; 掌握一维数组和二维数组的定义、赋值和输入输出的方法。 能..._c++引用实验报告
文章浏览阅读1.3k次。2019独角兽企业重金招聘Python工程师标准>>> ..._mysql事务与spring中的事务的关系
文章浏览阅读1.3w次。chromedriver下载地址:https://npm.taobao.org/mirrors/chromedriver/_118.0.5993.71对应的driver
文章浏览阅读1.6k次,点赞2次,收藏6次。Easy Excel 字典映射_easyexcel字典转换
文章浏览阅读3.2k次。本文转自 :http://blog.csdn.net/kingmax26/article/details/5252667测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%。同等情形下Windows上测试,仅丢几条数据。形势严峻,必须解决。考虑可能是因为协议栈Buffer太低所致,于是先看看默认情况: sysctl -a_linux iperf丢包怎么解决
文章浏览阅读1.2k次。记不清,是从哪看到的了. 但 一直以来,感觉十分有道理.1. 好好规划自己的路,不要跟着感觉走.2. 可以做技术的,切不可沉湎于技术.3. 不要去做技术高手,只去做综合素质高手.4. 多交"三交九流"的朋友.5. 知识涉猎不仅要专,还一定要广。6. 抓住时机向技术管理或市场销售方面转变。7。逐渐克服自己的心理弱点和性格缺陷。8。工作的同时要为以后作准备,建立自己的工作的环境。9。学会善于推销_给程序员的忠告
文章浏览阅读165次。1年半android经验,初次接触python,学了几天,相见恨晚,迫不及待的写了这篇记录下。python新手,请多见谅。其实也不是最近才接触Python,大四上有一门计算机性能相关的课各种算法、工具要求用python写,不过当时太懒了,全用java写的。导致毕业一年多了,现在每天忙碌的工作之余,晚上这个点左右挤时间出来学,算是"自我救赎"吧,哈哈。其实第一感觉python只是简单,没有那么吸引人..._做android有必要学习python吗
文章浏览阅读5.2k次。CoreDNS是一款灵活可扩展的 DNS 服务器,并且基于插件架构,具有强大的模块化能力。其快速,简单,可扩展等特性也非常受人欢迎。_docker coredns