单芯片MAC+PHY的10/100M并口以太网方案:INDEX/DATA双端口总线、16K SRAM双包收发架构、硬件校验和卸载、网络变压器与Bob Smith终端电路、差分对布局规则与低功耗模式
给MCU外挂一个10/100M以太网口,DM9000A 是国内嵌入式领域最成熟的并口方案之一:单颗48脚LQFP同时集成MAC与PHY,16K字节片内SRAM提供双包发送与环形接收缓冲,8/16位并行总线直接挂到处理器本地总线,且内置3.3V转2.5V稳压器、I/O容忍5V。它把以太网接口的全部模拟部分(PHY、变压器驱动)和数字协议部分(MAC、DMA、硬件校验和)都收进一颗芯片,嵌入式工程师只需处理三件事:总线时序、收发包驱动流程、网口模拟电路与PCB布局。本文基于 DAVICOM 官方数据手册,把这三件事的参数与规则一次性讲透。
工业物联网场景里,Modbus TCP、MQTT over TCP 都要跑在有线以太网上。可选的接入方案有四类,各有取舍:
| 方案 | 接口类型 | 速率 | CPU占用 | 固件复杂度 | 典型场景 |
|---|---|---|---|---|---|
| MCU内置MAC+外挂PHY(如STM32F407+DP83848) | RMI/MII | 100M全速 | 低(DMA) | 高(需移植TCP/IP栈+驱动) | 高性能网关、协议转换器 |
| DM9000A(并口MAC+PHY) | 8/16位并行总线 | 10/100M | 低(DMA+硬件校验和) | 中(寄存器驱动,Linux/U-Boot原生支持) | RTU、工控主板、老旧平台升级 |
| W5500(SPI硬件协议栈) | SPI | 10/100M | 极低(硬件TCP/IP) | 低(socket API) | 小资源MCU、快速组网 |
| ENC28J60(SPI MAC+PHY) | SPI | 10M | 高(软件校验和) | 中 | 低成本低速采集节点 |
DM9000A 的独特价值在于:不占用MCU的以太网MAC外设资源、不受SPI带宽瓶颈限制(16位并口一次搬两个字节),同时硬件完成 IP/TCP/UDP 校验和的生成与检查,把协议栈里最热的路径卸载掉。这也是它在国产RTU远程终端与工控板卡中长盛不衰的原因。
DM9000A(48-pin LQFP,3.3V供电、工作电压范围3.135~3.465V)内部由四大部分构成:通用处理器接口与DMA控制器、MAC引擎、10/100M PHY收发器(支持HP Auto-MDIX直连交叉自适应)、以及16K字节SRAM。存储划分非常清晰:前3K字节作为发送缓冲,可同时驻留两帧数据(index I 与 index II 交替发送);后13K字节作为接收环形缓冲,复位后起始地址为0x0C00。其它关键规格:100Base-TX 发射链路采用4B5B编码、扰码、NRZI与MLT-3转换的完整处理链;支持IEEE 802.3x全双工流控与半双工背压;支持唤醒帧、链路状态变化和魔术包(Magic Packet)远程唤醒;可选EEPROM自动加载厂商ID与产品ID;内核识别码为 VID=0x0A46、PID=0x9000,驱动探测时以此确认芯片在位。
DM9000A 只占用两个地址空间:CMD引脚为0时访问INDEX端口(写入目标寄存器地址),CMD为1时访问DATA端口(读写寄存器数据)。也就是说,任何一次寄存器访问都是"先写INDEX、再读写DATA"两步。配合片选CS#(默认低有效,可由EEPROM重定义极性)、读选通IOR#、写选通IOW#,构成最小并口;数据线SD0~SD15按8位或16位模式连接。
| 信号 | 方向 | 功能 | 设计要点 |
|---|---|---|---|
| SD0~SD15 | 双向 | 数据总线(8/16位模式) | 16位模式需IO16信号配合;8位模式SD8~15悬空 |
| CS# | 输入 | 片选 | 默认低有效,极性可EEPROM配置;接MCU片选译码输出 |
| CMD | 输入 | 端口选择:0=INDEX,1=DATA | 接MCU最低地址线A0,用两个相邻地址区分端口 |
| IOR# / IOW# | 输入 | 读/写选通 | 接MCU读/写选通;脉宽不低于10ns |
| INT | 输出 | 中断请求 | 接MCU外部中断,收包完成/发送完成/链路变化触发 |
| PWRST# | 输入 | 上电复位 | 需保证足够复位脉宽,建议接RC+MCU GPIO双重控制 |
| X1/X2 | — | 25MHz晶振接口 | 基频串联谐振晶体,两脚各并22pF对地 |
| EECS/EECK/EEDIO | — | EEPROM接口 | 选用93C46类EEPROM存MAC地址;不用时EECS经10kΩ下拉 |
读时序的关键参数(数据手册AC特性):CS#与CMD建立到IOR#有效(T1)最小0ns;IOR#脉宽(T2)最小10ns;读数据延迟(T3)最大3ns;读选通撤销到下一次访问的间隔(T6)读寄存器需2个系统时钟、读写SRAM数据需4个系统时钟。对STM32这类主频几十上百MHz的MCU,用GPIO模拟并口时要注意在IOR#/IOW#前后插入NOP或短延时满足T6;用FSMC静态存储器接口则把地址建立、数据保持参数配置进寄存器即可天然满足。
发送流程分四步:通过DATA端口把帧数据写入TX SRAM(DMA自动递增地址)→ 将帧长度写入TXPLL/TXPLH(FCH/FDH)寄存器 → 置位NCR(00H)的bit1启动发送 → 查询NSR(01H)或等中断确认完成。得益于双包缓冲,index I 在发送期间MCU就可以把下一帧预装进index II,实现背靠背发送无空泡。
接收缓冲是环形结构,每帧前面有4字节包头:01h、状态字节、帧长低字节、帧长高字节。驱动轮询时先读MRCMDX(F0H,预取读、地址不递增)判断是否有新数据——该寄存器读两次值不同即表示有新包;随后用MRCMD(F2H,读且地址自动递增)一次性把包头和帧数据读出。核心代码骨架如下:
/* STM32 GPIO 模拟并口示例(16位模式, CMD=A0) */
#define DM_ADDR_CMD_LOW() HAL_GPIO_WritePin(CMD_GPIO_Port, CMD_Pin, GPIO_PIN_RESET)
#define DM_ADDR_CMD_HIGH() HAL_GPIO_WritePin(CMD_GPIO_Port, CMD_Pin, GPIO_PIN_SET)
uint8_t dm9000_read_reg(uint8_t reg)
{
DM_ADDR_CMD_LOW(); /* INDEX端口 */
bus_write_byte(reg);
DM_ADDR_CMD_HIGH(); /* DATA端口 */
return bus_read_byte(); /* 读IOR#脉冲内采样SD */
}
/* 轮询收包:先查MRCMDX两次值是否变化 */
uint8_t dm9000_rx_ready(void)
{
uint8_t save = dm9000_read_reg(0xF0); /* MRCMDX预取 */
return (dm9000_read_reg(0xF0) != save); /* 值变化=有新帧 */
}
void dm9000_rx_packet(uint8_t *buf, uint16_t *len)
{
header = dm9000_read_data_inc(); /* MRCMD(F2H): 01h,status,len_l,len_h */
*len = (header & 0xFFFF) >> 8; /* 从4字节包头取帧长 */
for (i = 0; i < *len; i++) /* DMA地址自动递增, 顺序读出整帧 */
buf[i] = dm9000_read_data_inc();
}
四个工程细节容易被忽略:第一,DMA顺序读的第一个数据是上一次操作的缓冲残留(dummy read),必须丢弃;第二,8位模式与16位模式下环形缓冲的包起始地址边界不同,移植驱动时要按模式对齐;第三,ISR(FEH)中断状态位写1清除,IMR(FFH)bit7置1后SRAM地址才会在读写中回绕;第四,PAR(10H~15H)写入MAC地址、MAR(16H~1DH)写入组播过滤表(组播全收写0xFF),不上电写入这两组寄存器,网络层的ARP和组播协议全都会失效。
DM9000A 到 RJ45 之间的模拟电路是设计成败的关键。标准连接为:TXO±/RXI± 差分对经1:1网络变压器接RJ45;每根差分线串50Ω 1%电阻;变压器中心抽头接2.5V AVCC并配220μF大电容与0.1μF陶瓷电容去耦;RJ45空余线对经75Ω×3电阻网络与0.1μF/2kV电容接到机壳地(Bob Smith终端),为共模噪声提供低阻泄放路径;BGGND引脚接6.8kΩ 1%基准电阻到地,该电阻必须紧贴芯片第1、48脚,周围禁止走任何高速信号。
| 电路要素 | 推荐取值/型号 | 作用与备注 |
|---|---|---|
| 晶振 | 25MHz基频串联谐振,X1/X2各并22pF对地 | 时钟周期40ns,精度±50ppm;也可用有源晶振单端馈入 |
| 网络变压器 | Pulse PE-68515/H1078、Delta LF8200、YCL 20PMT04、Halo TG22-3506ND | 1:1变比、含Auto-MDIX要求的型号需核对数据手册表2 |
| 差分串阻 | 50Ω 1% × 4(TXO±、RXI±各两颗) | 阻抗匹配,抑制反射 |
| 中心抽头 | 2.5V AVCC + 220μF + 0.1μF | PHY模拟供电滤波,隔离直流偏置 |
| Bob Smith终端 | 75Ω 1% × 3 + 0.1μF/2kV | 空线对共模端接,接机壳地,耐压必须2kV |
| 基准电阻 | 6.8kΩ 1%(BGGND) | 带隙基准,位置紧贴pin1/48 |
| 电源去耦 | 0.1μF或0.01μF每电源脚 | 距电源引脚3mm以内放置 |
数据手册应用笔记把布局要求写得很明确,可归纳为:
对电池供电或需待机的智能硬件,DM9000A 的各工作模式功耗(3.3V)必须心里有数:
| 工作模式 | 典型电流 | 设计建议 |
|---|---|---|
| 100Base-TX 收发 | 87mA | 满速工作基线 |
| 10Base-T 发送(100%利用率) | 92mA | 10M满负荷反而最耗电 |
| 10Base-T 空闲 | 38mA | 链路保持但无流量 |
| 自协商进行中 | 56mA | 上电瞬态,协商完成自动回落 |
| 省电模式(无网线插入) | 31mA | 掉线检测自动进入,可配合中断唤醒 |
| 掉电模式 | 21mA | 软件配置进入,链路断开 |
| 掉电+时钟关闭 | 7mA | 远程唤醒(魔术包)场景的最深睡眠态 |
设计低功耗设备时,利用"掉电+时钟关"的7mA档位,配合魔术包唤醒寄存器,可以让设备平时深度睡眠、网络侧一有请求立即恢复通信——这是DM9000A相对纯数字方案少有的模拟侧休眠能力。
DM9000A 的工程价值在于"一颗芯片+一条并口"就把10/100M以太网完整落地:INDEX/DATA双端口让任何MCU都能以最小代价访问它,16K SRAM双包收发架构与硬件校验和卸载保证了吞吐,而网口部分的成败完全取决于模拟电路与布局纪律——1:1变压器、50Ω串阻、Bob Smith终端、完整地平面、差分对净空这五条规则做到位,产品直通FCC/EMC认证的把握就大得多。驱动侧抓住"4字节包头、MRCMDX轮询、PAR/MAR初始化"三个要点,配合Linux/U-Boot中原生驱动的成熟生态,是从原型到量产最快的一条路。
本文基于 DAVICOM《DM9000A Ethernet Controller with General Processor Interface》数据手册(DM9000A-17-DS-F01)整理优化。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应