2、MTK8678硬件平台介绍:核心板资源、以太网MAC/PHY外设接口、参考时钟与复位电路

好,咱们进入第二章。说实话,搞车载以太网协议栈,硬件平台是地基。地基不稳,上面协议栈写得再漂亮也是白搭。今天我就带你把MTK8678这颗芯片的硬件家底摸清楚。

2.1 核心板资源概览

MTK8678这颗SoC,我最早接触是在一个智能座舱项目上。当时客户要求同时跑Android Auto和CarPlay,还要做AVB音视频同步。嗯,这颗芯片扛住了。

先看核心资源:

资源类别 具体参数 我的备注
CPU 4核Cortex-A76 + 4核Cortex-A55 大小核架构,跑协议栈时建议把中断绑在大核上
GPU Mali-G610 MC6 做HMI渲染够用,但别用它处理网络数据
NPU 8 TOPS 可以用来做网络流量异常检测,我试过
内存 LPDDR5,最高32GB 建议至少配8GB,协议栈缓冲区很吃内存
存储 UFS 3.1 日志和固件存储,别用eMMC,速度跟不上

我个人习惯,拿到开发板第一件事就是看内存带宽。为什么?因为以太网DMA传输时,内存带宽不够会直接导致丢包。MTK8678的LPDDR5带宽大概在51.2GB/s,应付千兆以太网绰绰有余。

2.2 以太网MAC外设接口

MTK8678内部集成了两个千兆以太网MAC控制器。注意,是MAC,不是PHY。这两个MAC支持RGMII和RMII两种接口模式。

我建议你优先用RGMII。为什么?

  • RGMII:使用DDR采样,时钟频率125MHz,数据速率1000Mbps。信号线只有12根,布线相对简单。
  • RMII:时钟频率50MHz,数据速率100Mbps。虽然线更少,但只能跑百兆。车载场景下,百兆真的不够用。

这里有个坑,我曾经踩过。RGMII的TX和RX时钟是独立的,但有些PHY芯片要求时钟同源。如果你用的是Microchip的KSZ9031,记得把时钟模式配成“Slave”模式,否则链路死活起不来。

MAC寄存器配置要点:

// 以MAC0为例,配置RGMII模式
// 寄存器地址:0x1A100000 (GMAC0控制寄存器)
*(volatile uint32_t*)0x1A100000 |= (1 << 2);  // 设置RGMII模式
*(volatile uint32_t*)0x1A100004 |= (1 << 0);  // 使能MAC

2.3 PHY外设接口与选型

MAC和PHY之间,靠的是MII管理接口(MDIO/MDC)来通信。MTK8678的MDIO总线频率最高支持2.5MHz,但实际项目中我一般降到1MHz。为什么?因为有些老款PHY对高频MDIO很敏感,容易读到0xFF。

常用的车载PHY芯片,我列个表:

PHY型号 速率 接口 车载温度范围 我的评价
Marvell 88Q2112 1000BASE-T1 RGMII -40~105°C 单对线,适合车载,但贵
Microchip KSZ9031 1000BASE-T RGMII -40~85°C 性价比高,我项目里用得最多
TI DP83867 1000BASE-T RGMII/SGMII -40~125°C 抗干扰强,适合恶劣环境

我个人习惯,PHY的复位引脚一定要用GPIO控制,别直接接RC复位电路。为什么?因为软件可以在PHY初始化前先复位一次,确保PHY处于已知状态。我曾经遇到过PHY上电后状态机卡死,硬是找不到原因,后来加了个软件复位就好了。

小技巧:PHY的LED引脚可以配置成“Link/Activity”指示。调试时看一眼LED就知道链路状态,省得老抓包。

2.4 参考时钟与复位电路

时钟和复位,是硬件设计里最容易出问题的地方。我见过太多因为时钟抖动过大导致丢包的案例了。

2.4.1 参考时钟

MTK8678的以太网MAC需要两个时钟:

  • 125MHz:RGMII的TX时钟,由MAC提供或PHY提供都可以。我建议由PHY提供,因为PHY的时钟抖动通常更小。
  • 25MHz:PHY的参考时钟,通常由外部晶振提供。

时钟抖动的要求,IEEE 802.3规定是±50ppm。但实际项目中,我建议控制在±25ppm以内。为什么?因为车载环境温度变化大,晶振频率会漂。你想想看,夏天车内70°C,冬天-30°C,晶振能稳住就不错了。

警告:千万不要用SoC内部的PLL输出给PHY做参考时钟。内部PLL的抖动通常很大,会导致PHY无法锁定链路。我踩过这个坑,折腾了两天。

2.4.2 复位电路

复位电路的设计,说白了就三个原则:

  1. 低电平有效:所有以太网相关芯片(MAC、PHY、Switch)都用低电平复位。
  2. 复位时间足够长:至少保持10ms的低电平。有些PHY需要更长时间,比如TI的DP83867需要20ms。
  3. 独立复位:MAC和PHY的复位信号要分开,别共用。这样软件可以单独复位PHY而不影响MAC。

我曾经在一个项目里,为了省一个GPIO,把MAC和PHY的复位连在一起。结果PHY死锁后,我只能连MAC一起复位,导致整个网络中断。后来改板子才解决。

复位时序示例:

// PHY复位函数
void phy_reset(void) {
    // 拉低复位引脚
    GPIO_WriteLow(PHY_RST_PIN);
    // 等待20ms
    delay_ms(20);
    // 拉高复位引脚
    GPIO_WriteHigh(PHY_RST_PIN);
    // 等待PHY完成内部初始化
    delay_ms(50);
    // 读取PHY ID确认复位成功
    uint16_t phy_id = mdio_read(PHY_ADDR, 0x02);
    if (phy_id != EXPECTED_PHY_ID) {
        // 复位失败,重试
        phy_reset();
    }
}

2.5 硬件调试心得

最后,分享几个我调试以太网硬件时的习惯:

  • 先看时钟:用示波器量125MHz和25MHz时钟,看波形和频率。频率偏差超过1%就别往下走了。
  • 再看复位:用逻辑分析仪抓复位时序,确认低电平时间足够长。
  • 最后看MDIO:用示波器抓MDIO波形,确认PHY能正常响应。

嗯,硬件平台这部分就讲到这里。下一章我们会开始搭建开发环境,到时候我会手把手教你配置交叉编译工具链。记住,硬件是基础,基础不牢,地动山摇。