19 有线以太网
有线以太网(Ethernet)
Etheret这个词一般指的就是有线以太网,若涉及无线网络,通常会使用Wi-Fi或其他明确术语
嵌入式网络概述
之前总是听到“网卡”这个词,实际上他是个非常笼统的概念包含了多个硬件。实际上需要以下的具体硬件来实现Ethernet:
MAC控制器:它负责OSI体系中数据链路层的工作(以太网帧的封装、差错与流量控制、MAC地址寻址…)
- MAC可能位于SoC的内部,也可能外接。如果说一个SoC具备网络功能,一般指的SoC内部有MAC外设
PHY(物理层收发器)芯片:它负责OSI体系中物理层的工作:
- PHY一般位于SoC外部
- 信号转换:MAC层的数字信号 <—-> RJ45的模拟信号
- 时钟同步:从信号中提取时钟,确保数据采样准确(如通过PLL锁相环)
- 自适应协商:自动协商速率(10/100/1000Mbps)和双工模式(全/半双工)
- 电气隔离和抗干扰:与耦合到RJ45网络接口上的变压器芯片直接相连
网络接口&网络变压器模块
- 网络接口一般指的就是RJ45接口。黄灯亮表示正在进行网络连接;绿灯亮表示网络连接正常,这2个灯由PHY芯片上的引脚控制
- 网络变压器模块一般是一个芯片,通常和RJ45搭配使用,主要是为了滤波、防止干扰等
- 目前也有集成了变压器的RJ45,比如正点原子使用的HR911105A
MAC控制器和PHY芯片是一一对应的,有几个MAC控制器,就要几个PHY和RJ45接口
嵌入式网络方案
刚才提到MAC可能在SoC内部,也有可能在外边,这就引申出2个方案:
内部没有MAC外设
外置网络芯片一般都是MAC控制器+PHY一体的,SoC可以通过某些接口与该芯片通信从而获得网络功能,但是这种方案一般速度比较慢(10/100M),因为内置MAC外设一般有专用DMA
内部有MAC外设
内部的MAC外设会通过MII或者RMII接口来传输网络数据,使用MIDO接口配置或读取PHY芯片的内部寄存器
MDIO很类似IIC,也是两根线,一根数据线叫做MDIO,一根时钟线叫做MDC
内部有MAC外设时一般支持更快的网速:10/100/100M,并且外部PHY芯片的价格肯定低于MAC+PHY
相关接口
MII
MII全称是Media Independent Interface,直译过来就是介质独立接口,它是 IEEE-802.3 定义的以太网标准接口,MII 接口用于以太网 MAC 连接 PHY 芯片,一共16根线
RMII
RMII全称是Reduced Media Independent Interface,翻译过来就是精简的介质独立接口,也就是MII接口的精简版本。RMII接口只需要7根数据线,相比MII直接减少了9根,极大的方便了板子布线
MDIO
MDIO全称是Management Data Input/Output,直译过来就是管理数据输入输出接口,是一个简单的两线串行接口,一根MDIO数据线,一根MDC时钟线。驱动程序可以通过MDIO和MDC这两根线访问PHY芯片的任意一个寄存器。MDIO接口支持多达32个PHY。为了区分不同的PHY芯片,每个PHY都自带一个器件地址(正点原子开发版上的是0x01)。同一MDIO接口下的所有PHY芯片,其器件地址不能冲突,必须保证唯一,具体器件地址值要查阅相应的PHY数据手册
MAC控制器
不同芯片的MAC控制器可能名字不太一样,但是功能都是一样的。i.mx6ull的MAC外设叫ENET(或者设备树里也叫fec),它的具体功能如下:
实现了全功能的 802.3 规范前导码/SFD 生成、帧填充、CRC 生成和检查
支持零长的前导码
支持 10/100M 动态配置
兼容 AMD 远端节点电源管理的魔术帧中断检测
可以通过如下接口无缝的连接 PHY 芯片:
4bit 的 MII 接口,频率为 2.5/25MHz
4bit 的 MII-Lite 接口,也就是 MII 接口取消掉 CRS 和 COL 这两根线,频率也是2.5/25MHz
2bit 的 RMII 接口,频率为 50MHz
MAC 地址可编程
多播和单播地址过滤,降低更高层的处理负担
MDIO 主接口,用于管理和配置 PHY 设备
PHY
PHY是Physical Layer Transceiver(物理层收发器)的缩写,本质是负责在物理介质上传输和接收原始信号的硬件模块。虽然它在以太网中最常见,但PHY的概念广泛存在于多种通信协议中。无论何种通信协议,PHY的核心任务始终是:
- 信号转换:将数字信号(来自MAC或协议控制器)转换为适合物理介质传输的模拟信号,反之亦然。比如:以太网PHY将RMII接口的数字信号转为网线上的差分电压
- 时钟同步:从信号中恢复时钟,确保数据采样准确
- 介质适配:匹配物理介质的电气特性(如阻抗、电压、光功率)
- 抗干扰与隔离:抑制噪声、提供电气隔离(如以太网变压器的1500V隔离)
不同协议中的PHY
- 以太网PHY:
- 作用:连接MAC层的MII/RMII接口与RJ45网口,处理曼彻斯特编码、自适应协商等
- 典型PHY芯片:LAN8720A(10/100M)、RTL8211(千兆)
- USB PHY:
- 负责将USB控制器的数字信号转换为差分信号(D+/D-)
- 示例:STM32的USB OTG模块需外接USB3300 PHY芯片
- PCIE PHY:
- 将并行数据转为高速串行信号(如PCIe 3.0的8GT/s)
- wifi/蓝牙 PHY:
- 处理基带信号与射频信号的转换(如OFDM调制、2.4GHz载波)
- 示例:ESP32的Wi-Fi/BT模块集成射频PHY
- RS485 PHY:
- 将UART信号转为差分总线信号
- CAN PHY:
- 处理CAN控制器的电平转换
以太网PHY
以太网PHY是IEEE802.3规定的一个标准模块,SOC可以对PHY进行配置或者读取PHY相关状态,这个就需要PHY内部寄存器去实现了。PHY芯片寄存器地址空间为5位,地址031共32个寄存器,IEEE定义了015这16个寄存器的功能,1631这16个寄存器由厂商自行实现。也就是说不管你用的哪个厂家的PHY芯片,其中015这16个寄存器是一模一样的。仅靠这16个寄存器是完全可以驱动起PHY芯片的,至少能保证基本的网络数据通信,因此Linux内核有通用PHY驱动,按道理来讲,不管你使用的哪个厂家的PHY芯片,都可以使用Linux的这个通用PHY驱动来验证网络工作是否正常。
事实上在实际开发中可能会遇到一些其他的问题导致Linux内核的通用PHY驱动工作不正常,这个时候就需要驱动开发人员去调试了。但是,随着现在的PHY芯片性能越来越强大,32个寄存器可能满足不了厂商的需求,因此很多厂商采用分页技术来扩展寄存器地址空间,以求定义更多的寄存器。这些多出来的寄存器可以用于实现厂商特有的一些技术,因此Linux内核的通用PHY驱动就无法驱动这些特色功能了,这个时候就需要PHY厂商提供相应的驱动源码了,所以大家也会在Linux内核里面看到很多具体的PHY芯片驱动源码。不管你的PHY芯片有多少特色功能,按道理来讲,Linux内核的通用PHY驱动是绝对可以让你这PHY芯片实现基本的网络通信,因此大家也不用担心更换PHY芯片以后网络驱动编写是不是会很复杂
