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 复位电路
复位电路的设计,说白了就三个原则:
- 低电平有效:所有以太网相关芯片(MAC、PHY、Switch)都用低电平复位。
- 复位时间足够长:至少保持10ms的低电平。有些PHY需要更长时间,比如TI的DP83867需要20ms。
- 独立复位: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能正常响应。
嗯,硬件平台这部分就讲到这里。下一章我们会开始搭建开发环境,到时候我会手把手教你配置交叉编译工具链。记住,硬件是基础,基础不牢,地动山摇。