4. 开发环境搭建与第一个PIC32以太网工程
要让一块 PIC32 以太网开发板真正“活”起来,第一步不是写协议栈,而是把工具链、配置工具和硬件连接理顺。本节以 PIC32MX795F512L + LAN8720A PHY 的典型组合为例,走通从安装 MPLAB X IDE 到点亮 RJ45 座链路指示灯(Link LED)的完整路径。链路灯亮起,说明 MAC 已通过 RMII 接口与 PHY 建立通信、PHY 与对端交换机完成了自协商,这是后续跑通 TCP/IP 之前最关键的“物理层验收”。
一、工具链三件套及其分工
PIC32 以太网开发涉及三个必须协同的工具,理解它们各自的职责,能避免后面“改了配置不生效”的困惑:
- MPLAB X IDE:工程管理、代码编辑、下载与调试的集成环境,负责组织源文件、调用编译器和调试器。
- XC32 编译器:把 C 源码编译成 PIC32 的 MIPS32 机器码,并提供设备启动代码、链接脚本和寄存器头文件。
- MPLAB Harmony 3:Microchip 的中间件与代码生成框架,通过 MCC(MPLAB Code Configurator)图形化配置时钟、引脚、以太网 MAC、PHY 驱动和 TCP/IP 协议栈,自动生成初始化代码。
三者版本必须匹配:Harmony 3 的某个版本通常要求特定范围的 XC32 与 IDE 版本。建议从 Harmony 3 的 release notes 中确认推荐组合,例如 Harmony v3.10 搭配 XC32 v4.10、MPLAB X IDE v6.05。版本错配最常见的表现是 MCC 图形界面无法加载器件包,或生成的代码在编译时报“未定义的外设寄存器宏”。
二、安装与调试器设置
安装顺序建议为:先装 MPLAB X IDE,再装 XC32 编译器,最后通过 IDE 的 Tools → Plugins 安装 MCC 与 Harmony 内容包。安装完成后,在 Tools → Options → Embedded → Build Tools 中确认 XC32 路径已被识别。
调试器方面,PIC32 以太网开发常用 PICkit 4 或 ICD 4,通过 ICSP 接口连接。在工程属性中需要设置:
- Debugger:选择实际使用的调试器型号,接口选 ICSP,供电方式选“由目标板供电”或“由调试器供电”,取决于开发板是否已接外部电源。
- Compiler:优化等级建议调试阶段用
-O0或-O1,避免优化导致单步跳转混乱;发布阶段再切到-Os。 - Programmer:勾选“Program after build”可让每次编译后自动烧录,提高迭代效率。
三、用 MCC 配置以太网外设
新建工程时选择器件 PIC32MX795F512L,工具链选 XC32,然后启动 MCC。配置的核心是让 MAC 与 PHY 的时钟、引脚和数据通路对齐。以 RMII 接口为例,关键配置项如下:
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 系统时钟 SYSCLK | 80 MHz | 由 8 MHz 晶振经 PLL 倍频得到 |
| REFCLKO | 50 MHz | RMII 参考时钟,由 REFCLKO 输出给 PHY |
| 以太网接口模式 | RMII | 相比 MII 引脚更少,需 50 MHz 参考时钟 |
| PHY 地址 | 0x00 | 由 PHY 的 PHYAD 引脚电平决定 |
| PHY 类型 | LAN8720 | Harmony 内置对应驱动 |
| 中断优先级 | 4 | 以太网 MAC 中断,需高于普通任务 |
配置完成后点击 Generate,MCC 会生成 system_config、ethernet_init、drv_ethmac 等初始化代码。此时不要急着写应用逻辑,先确认生成的 sys_initialize() 被正确调用。
四、点亮链路指示灯的验证逻辑
链路指示灯由 PHY 直接驱动,但它的亮灭取决于三个条件同时成立:PHY 已上电并完成复位、REFCLKO 50 MHz 时钟已送达 PHY、PHY 与对端交换机完成自协商。因此,点灯过程实际上是一次完整的物理层自检。
在 Harmony 生成的代码中,PHY 驱动会周期性读取 BMSR(Basic Mode Status Register)寄存器的 Link Status 位。我们可以用调试器观察该位,或在代码中加入轮询:
// 轮询 PHY 链路状态(示例)
uint16_t bmsr;
DRV_ETH_PHY_Read(phyHandle, PHY_REG_BMSR, &bmsr);
if (bmsr & 0x0004) {
// Link up:链路已建立
LED_GREEN_On();
} else {
LED_GREEN_Off();
}
如果 RJ45 座上的绿色 Link LED 常亮,说明链路已建立;若同时有黄色 Activity LED 闪烁,说明有数据帧收发。若灯始终不亮,按以下顺序排查:
- 用示波器测 REFCLKO 引脚是否有 50 MHz 方波,无则检查时钟配置。
- 测 PHY 的 nRST 引脚,确认复位已释放。
- 读 PHY 的 PHYID 寄存器,若读回 0x0000 或 0xFFFF,说明 MDIO/MDC 通信失败,检查这两根线及 PHY 地址。
- 换一根确认可用的网线,并确认对端交换机端口已启用。
ethernet_init 之后立即读 BMSR,可能因协商未完成而读到 Link Down。建议在初始化后延时 2~3 秒再判断,或使用驱动提供的链路状态回调。五、从点灯到可通信的最小验证
链路灯亮只是第一步。要确认 MAC 侧也正常工作,可以进一步读取 MAC 的统计寄存器,例如 EMACSTAT 中的接收帧计数。若发送一个 ARP 请求后该计数增加,说明数据通路已经打通。此时再引入 TCP/IP 协议栈,才有稳定的基础。
整个流程可以概括为:工具链版本对齐 → 调试器连接正常 → MCC 配置时钟与 RMII → 生成并编译 → 烧录后观察 Link LED → 读 PHY 寄存器确认链路 → 读 MAC 统计确认数据通路。每一步都有明确的观察点和判断依据,而不是“烧进去看看”。
把上述配置和验证步骤走一遍,得到的不仅是一个亮灯的工程,而是一条可复用的调试路径。后续引入 TCP/IP 协议栈、DHCP 或 HTTP 服务器时,只要物理层这条链路是确定的,问题范围就能迅速缩小到协议栈配置或应用逻辑,而不是在“灯不亮”和“ping 不通”之间反复猜测。