1.1 嵌入式网络简介1.1.1 嵌入式下的网络硬件接口提起网络,我们一般想到的硬件就是“网卡”,现在网卡已经是通过一个芯片来完成了,嵌入式网络硬件分为两部分:mac和phy,大家都是通过看数据手册来判断一款soc是否支持网络,如果一款芯片数据手册说自己支持网络,一般都是说的这款soc内置mac,mac类似i2c控制器、spi控制器一样的外设。
但是光有mac还不能直接驱动网络,还需要另外一个芯片:phy,因此对于内置mac的soc,其外部必须搭配一个phy芯片。内部没有mac的soc芯片,就需要使用外置的mac+phy一体芯片了,这里就要牵扯出常见的两个嵌入式网络硬件方案了。
1.soc内部没有网络mac外设对于内部没有mac的soc芯片,可以使用外置 mac+phy一体的网络芯片来实现网络功能。比如三星linux开发板里面用的最多的dm9000,dm9000对soc提供了一个sram接口,soc会以sram的方式操作dm9000。
有些外置的网络芯片更强大,内部甚至集成了硬件tcp/ip协议栈,对外提供一个spi接口,比如w5500。这个一般用于单片机领域,单片机通过spi接口与w5500进行通信,由于w5500内置了硬件tcp/ip协议栈,因此单片机就不需要移植软件协议栈,直接通过spi来操作w5500,简化了单片机联网方案。
这种方案的优点就是让不支持网络的soc能够另辟蹊径,实现网络功能,但是缺点就是网络效率不高,因为一般芯片内置的mac会有网络加速引擎,比如网络专用dma,网络处理效率会很高。而且此类芯片网速都不快,基本就是10/100m。另外,相比phy芯片而言,此类芯片的成本也比较高,可选择比较少。
soc与外部mac+phy芯片的连接如图1-1所示:
图1-1 主控soc与外置mac+phy芯片连接
2.soc内部集成网络mac外设我们一般说某个soc支持网络,说的就是他内部集成网络mac外设,此时我们还需要外接一个网络phy芯片。。
目前几乎所有支持网络的soc都是内置mac外设,比如stm32f4/f7/h7系列、nxp的i.mx系列,内部集成网络mac的优点如下:
1)内部mac外设会有专用的加速模块,比如专用的dma,加速网速数据的处理。
2)网速快,可以支持10/100/1000m网速。
3)外接phy可选择性多,成本低。
内部的mac外设会通过mii或者rmii接口来连接外部的phy芯片,mii/rmii接口用来传输网络数据。另外主控需要配置或读取phy芯片,也就是读写phy的内部寄存器,所以还需要一个控制接口,叫做mido,mdio很类似iic,也是两根线,一根数据线叫做mdio,一根时钟线叫做mdc。
soc内部mac外设与外部phy芯片的连接如图1-2所示:
图1-2 内部mac与外部phy之间的连接
大家在做项目的时候,如果要用到网络功能,强烈建议大家选择内部带有网络mac外设的主控soc!i.mx6ull就有两个10m/100m的网络mac外设,正点原子alpha开发板板载了两颗phy芯片,型号为lan8720。因此,本章节只讲解soc内部mac+外置phy芯片这种方案。
1.1.2 mii/rmii接口前面我们说了,内部mac通过mii/rmii接口来与外部的phy芯片连接,完成网络数据传输,本节我们就来学习一下什么是mii和rmii接口。
1.mii接口mii全称是media independent interface,直译过来就是介质独立接口,它是ieee-802.3定义的以太网标准接口,mii接口用于以太网mac连接phy芯片,连接示意图如图1-3所示:
图1-3 mii接口
mii接口一共有16根信号线,含义如下:
tx_clk:发送时钟,如果网速为100m的话时钟频率为25mhz,10m网速的话时钟频率为2.5mhz,此时钟由phy产生并发送给mac。
tx_en:发送使能信号。
tx_er:发送错误信号,高电平有效,表示tx_er有效期内传输的数据无效。10mpbs网速下tx_er不起作用。
txd[3:0]:发送数据信号线,一共4根。
rxd[3:0]:接收数据信号线,一共4根。
rx_clk:接收时钟信号,如果网速为100m的话时钟频率为25mhz,10m网速的话时钟频率为2.5mhz,rx_clk也是由phy产生的。
rx_er:接收错误信号,高电平有效,表示rx_er有效期内传输的数据无效。10mpbs网速下rx_er不起作用。
rx_dv:接收数据有效,作用类似tx_en。
crs:载波侦听信号。
col:冲突检测信号。
mii接口的缺点就是所需信号线太多,这还没有算mdio和mdc这两根管理接口的数据线,因此mii接口使用已经越来越少了。
2.rmii接口rmii全称是reduced media independent interface,翻译过来就是精简的介质独立接口,也就是mii接口的精简版本。rmii接口只需要7根数据线,相比mii直接减少了9根,极大的方便了板子布线,rmii接口连接phy芯片的示意图如图1-4所示:
图1-4 rmii接口
tx_en:发送使能信号。
txd[1:0]:发送数据信号线,一共2根。
rxd[1:0]:接收数据信号线,一共2根。
crs_dv:相当于mii接口中的rx_dv和crs这两个信号的混合。
ref_clk:参考时钟,由外部时钟源提供, 频率为50mhz。这里与mii不同,mii的接收和发送时钟是独立分开的,而且都是由phy芯片提供的。
除了mii和rmii以外,还有其他接口,比如gmii、rgmii、smii、smii等,关于其他接口基本都是大同小异的,这里就不做讲解了。正点原子alpah开发板上的两个网口都是采用rmii接口来连接mac与外部phy芯片。
1.1.3 mdio接口mdio全称是management data input/output,直译过来就是管理数据输入输出接口,是一个简单的两线串行接口,一根mdio数据线,一根mdc时钟线。驱动程序可以通过mdio和mdc这两根线访问phy芯片的任意一个寄存器。mdio接口支持多达32个phy。同一时刻内只能对一个phy进行操作,那么如何区分这32个phy芯片呢?和iic一样,使用
器件地址即可。同一mdio接口下的所有phy芯片,其器件地址不能冲突,必须保证唯一,具体器件地址值要查阅相应的phy数据手册。
因此,mac和外部phy芯片进行连接的时候主要是mii/rmii和mdio接口,另外可能还需要复位、中断等其他引脚。
1.1.4 rj45接口网络设备是通过网线连接起来的,插入网线的叫做rj45座,如图1-5所示:
图1-5 rj45座子
rj45座要与phy芯片连接在一起,但是中间需要一个网络变压器,网络变压器用于隔离以及滤波等,网络变压器也是一个芯片,外形一般如图1-6所示:
图1-6 网络变压器
但是现在很多rj45座子内部已经集成了网络变压器,比如最常用的hr911105a就是内置网络变压器的rj45座。内置网络变压器的rj45座和不内置的引脚一样,但是一般不内置的rj45座会短一点。
因此,大家在画板的时候一定要考虑你所使用的rj45座是否内置网络变压器,如果不内置的话就要自行添加网络变压器部分电路!同理,如果你所设计的硬件是需要内置网络变压器的rj45座,肯定不能随便焊接一个不内置变压器的rj45座,否则网络工作不正常!
rj45座子上一般有两个灯,一个黄色(橙色),一个绿色,绿色亮的话表示网络连接正常,黄色闪烁的话说明当前正在进行网络通信。这两个灯由phy芯片控制,phy芯片会有两个引脚来连接rj45座上的这两个灯。内部mac+外部phy+rj45座(内置网络变压器)就组成了一个完整的嵌入式网络接口硬件,如图1-7所示:
图1-7 嵌入式网络硬件接口示意图
1.1.5 phy芯片基础知识phy是ieee 802.3规定的一个标准模块,前面说了,soc可以对phy进行配置或者读取phy相关状态,这个就需要phy内部寄存器去实现。phy芯片寄存器地址空间为5位,地址 031共32个寄存器,ieee定义了015这16个寄存器的功能,16~31这16个寄存器由厂商自行实现。
也就是说不管你用的哪个厂家的phy芯片,其中0~15这16个寄存器是一模一样的。仅靠这16个寄存器是完全可以驱动起phy芯片的,至少能保证基本的网络数据通信,因此linux内核有通用phy驱动,按道理来讲,不管你使用的哪个厂家的phy芯片,都可以使用linux的这个通用phy驱动来验证网络工作是否正常。
事实上在实际开发中可能会遇到一些其他的问题导致linux内核的通用phy驱动工作不正常,这个时候就需要驱动开发人员去调试了。但是,随着现在的phy芯片性能越来越强大,32个寄存器可能满足不了厂商的需求,因此很多厂商采用分页技术来扩展寄存器地址空间,以求定义更多的寄存器。
这些多出来的寄存器可以用于实现厂商特有的一些技术,因此linux内核的通用phy驱动就无法驱动这些特色功能了,这个时候就需要phy厂商提供相应的驱动源码了,所以大家也会在linux内核里面看到很多具体的phy芯片驱动源码。
不管你的phy芯片有多少特色功能,按道理来讲,linux内核的通用phy驱动是绝对可以让你这phy芯片实现基本的网络通信,因此大家也不用担心更换phy芯片以后网络驱动编写是不是会很复杂。
ieee802.3协议英文原版中的 “22.2.4 management functions”章节,此章节对phy的前16个寄存器功能进行了规定,如图1-8所示:
图1-8 ieee规定的前16个寄存器
关于这16个寄存器的内容协议里面也进行了详细的讲解,这里就不分析了。大家可以找个具体的phy芯片数据手册对比看一下,比如百m网络最常用的lan8720a这个phy,大家可以看一下lan8720前面几个寄存器结构是否和图1-8中的一样。
关于嵌入式linux的网络接口设计就讲到这里。
电压和电流探头的时间偏差怎么解决
不可忽视的PCB板layout中12个细节
微型便携式光谱仪--SCiO分子传感器
如何使用RT-Thread MicroPython搭建一个Web服务器
对英特尔Movidius神经计算棒进行深度了解
关于嵌入式Linux的网络接口设计
pcb翘曲了怎么解决
如何将物联网相关的网络风险降到最低
小米推出一款全新无线充电器 输出最高可达10W
波卡和以太坊是怎样的关系
真会玩,机器人进入安防市场,可代替人工进行巡逻
湿法工艺设备的完美合作伙伴
部分网友冷嘲热讽华为,大佬指出华为对Linux内核的贡献度排名第二
工信部 | 公开征求《900MHz频段射频识别(RFID)设备无线电管理规定(征求意见稿)》意见
自由在云上构建全新未来——亚马逊云科技
5G LPHAP低功耗高精度定位芯片产业生态合作协议于9月28日签署
安森美半导体高能效方案赋能机器人创新 助力工业自动化升级
苏姿丰:从不会依赖英特尔的失利 未来将继续研发GPU核心
DeepMind以光学相干断层扫描视网膜图像 AI技术尚难以取代医生专业
根本不是小米6,高通骁龙835处理器要在这个产品上首发了