4. 以太网基础:TCP/IP协议栈简介、MAC与PHY概念、以太网帧结构、IP地址与端口

好,咱们进入以太网基础部分。说实话,很多做RS485的老工程师,一听到“以太网”三个字就头大。觉得那是搞IT的人玩的,跟咱们嵌入式不沾边。其实不然。你想想看,RS485是物理层的总线,以太网也是物理层加数据链路层的东西。本质上,它们都是在“传比特”。只不过以太网更复杂一些,规矩更多一些。

我个人习惯,在讲RS485转以太网之前,先把这几个核心概念捋清楚。不然你后面写代码、调硬件,很容易掉坑里。

4.1 TCP/IP协议栈简介

TCP/IP协议栈,说白了就是一套“通信规矩”。它规定了数据怎么打包、怎么寻址、怎么保证不丢包。我见过不少初学者,一上来就抱着《TCP/IP详解》啃,结果越看越懵。其实对于咱们做嵌入式硬件和底层驱动的,不需要把每一层都吃透。你只要知道它分四层就够了:

  • 应用层:HTTP、MQTT、Modbus TCP 这些。你最终要传的数据,比如温度值、开关状态,就在这一层。
  • 传输层:TCP 和 UDP。TCP 可靠但慢,UDP 快但可能丢包。做RS485转以太网,我建议优先用TCP,因为RS485本身是可靠总线,转成以太网后如果还用UDP,调试起来会很痛苦。
  • 网络层:IP 协议。负责把数据包从A点送到B点。这里涉及路由、IP地址。
  • 链路层:以太网协议。MAC地址、帧结构都在这一层。这也是咱们硬件工程师最需要关注的一层。

嗯,这里要注意。很多芯片厂商提供的TCP/IP协议栈,比如LwIP、uIP,都是把这四层打包好的。你不需要自己写。但你必须理解每一层干了什么,否则出了问题你连日志都看不懂。

我的经验: 我在项目中遇到过,用某款MCU自带的以太网MAC,结果TCP连接总是断。查了三天,最后发现是协议栈的缓冲区配小了。所以,协议栈的参数配置,一定要根据你的实际数据量来调,别用默认值。

4.2 MAC与PHY概念

这是硬件设计里最容易混淆的两个东西。我刚开始做以太网时,也搞不清楚MAC和PHY到底谁管谁。咱们用大白话说:

  • MAC(媒体访问控制层):负责把数据封装成帧,加上源MAC和目标MAC,还要做冲突检测。它工作在数据链路层。很多MCU内部集成了MAC,比如STM32的F4/F7系列。
  • PHY(物理层):负责把MAC送过来的数字信号,变成模拟信号发到网线上。它处理的是电平、时钟、编码这些物理玩意儿。PHY芯片是独立的,比如LAN8720、DP83848。

说白了,MAC是“大脑”,PHY是“嘴巴”。大脑想好说什么,嘴巴把它喊出去。MAC和PHY之间通过MII/RMII接口通信。我个人习惯,在设计RS485转以太网模块时,尽量选内置MAC的MCU,这样外围只需要一个PHY芯片和几个电阻电容,PCB面积能省不少。

避坑指南: 我曾经因为PHY芯片的复位时序没做好,导致上电后网口死活ping不通。后来查手册才发现,PHY的复位信号需要保持至少10ms的低电平。这种细节,数据手册里写得清清楚楚,但就是容易忽略。

4.3 以太网帧结构

以太网帧,就是数据在网线上跑的时候的真实样子。你抓包看到的就是它。咱们做硬件的不需要背每个字节,但结构你得懂:

字段 长度(字节) 说明
前导码 7 用于同步时钟,硬件自动处理
帧起始定界符 1 表示帧正式开始
目标MAC地址 6 接收方的MAC
源MAC地址 6 发送方的MAC
类型/长度 2 0x0800表示IP包,0x0806表示ARP
数据 46-1500 实际传输的数据,不够46字节要填充
帧校验序列 4 CRC32校验,硬件自动计算

你发现没有?MAC地址是帧的核心。没有MAC地址,数据根本不知道发给谁。我调试RS485转以太网模块时,第一步就是确认PHY芯片的Link状态灯亮了没,第二步就是看MAC地址有没有正确写入寄存器。

重点: 以太网帧的最小长度是64字节(从目标MAC到FCS)。如果数据不够,协议栈会自动填充。这个特性在调试时很有用——你抓包看到一堆“00”填充,别慌,那是正常的。

4.4 IP地址与端口

IP地址,是网络层的概念。它解决的是“这个设备在哪个网段”的问题。MAC地址是硬件地址,出厂就烧死了。IP地址是逻辑地址,你可以随便配。咱们做RS485转以太网模块,通常会给模块配一个静态IP,比如192.168.1.100。这样上位机软件就能直接连它。

端口呢?端口是传输层的概念。它解决的是“数据发给哪个应用程序”的问题。比如你的RS485转以太网模块,既支持Modbus TCP(端口502),又支持HTTP配置(端口80)。如果没有端口,数据包到了设备上,设备不知道应该交给Modbus处理还是交给Web服务器处理。

我建议,在设计模块时,把端口号固定下来,并且在说明书里写清楚。我曾经遇到一个客户,他买的模块默认端口是502,但他上位机软件写的是503,折腾了两天才发现是端口没对上。

小技巧: 调试时,可以用“ping”命令测IP通不通,用“telnet IP 端口”测端口通不通。这两个命令,基本能解决80%的网络连接问题。

好了,以太网基础就这些。你把这些概念搞明白,后面讲RS485数据怎么封装成TCP包、怎么通过PHY发出去,你就不会觉得难了。下一章,咱们开始讲具体的硬件设计——怎么选PHY芯片、怎么画原理图。