CH390硬件驱动¶
本文档引用的文件 - ch390.h - esp_eth_mac_ch390.h - esp_eth_phy_ch390.h - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c - README.md - CH390H_Wiring.md
目录¶
简介¶
CH390是以太网控制器硬件驱动,基于ESP-IDF框架实现了对WCH CH390H/D以太网控制器的完整支持。该驱动提供了工业级的10/100M以太网Media Access Control (MAC)和Physical Layer Transceiver (PHY)功能,支持CAT3、4、5和CAT5、6连接,具备HP Auto-MDIX、低功耗设计和IEEE 802.3u合规性。
CH390驱动采用SPI接口通信协议,内置16K字节SRAM,支持3.3V或2.5V电源供电。驱动实现了完整的以太网数据链路层功能,包括帧发送接收、流量控制、错误检测和中断处理等核心功能。
项目结构¶
CH390组件采用标准的ESP-IDF组件结构,主要包含以下目录和文件:
graph TB
subgraph "CH390组件结构"
A[include/] --> B[ch390.h<br/>esp_eth_mac_ch390.h<br/>esp_eth_phy_ch390.h]
C[src/] --> D[esp_eth_mac_ch390.c<br/>esp_eth_phy_ch390.c]
E[其他文件] --> F[README.md<br/>CHANGELOG.md<br/>idf_component.yml]
end
subgraph "头文件"
B --> G[寄存器定义]
B --> H[配置结构体]
B --> I[函数声明]
end
subgraph "源文件"
D --> J[MAC驱动实现]
D --> K[PHY驱动实现]
D --> L[SPI通信接口]
D --> M[中断处理]
D --> N[数据传输]
end
图表来源 - ch390.h - esp_eth_mac_ch390.c
章节来源 - README.md
核心组件¶
CH390驱动系统由两个主要组件构成:MAC(媒体访问控制)层和PHY(物理层)驱动。
MAC驱动组件¶
MAC驱动负责以太网帧的发送和接收,管理内部寄存器配置,处理SPI通信,并实现中断驱动的数据传输机制。
关键特性: - 支持中断驱动和轮询两种接收模式 - 内置16K字节SRAM缓冲区 - 完整的帧格式处理(含头部信息) - 流量控制支持 - 错误检测和恢复机制
PHY驱动组件¶
PHY驱动实现对内部PHY的管理和配置,支持自动协商、速度检测和双工模式切换。
关键特性: - IEEE 802.3兼容性 - 自动协商功能 - 链路状态监控 - 速度和双工模式检测
章节来源 - esp_eth_mac_ch390.h - esp_eth_phy_ch390.h
架构概览¶
CH390驱动采用分层架构设计,实现了清晰的职责分离和模块化组织:
graph TB
subgraph "应用层"
App[应用程序]
end
subgraph "ESP-IDF以太网框架"
EthMgr[以太网管理器]
Mediator[中介者模式]
end
subgraph "CH390驱动层"
MAC[MAC驱动]
PHY[PHY驱动]
SPI[SPI接口层]
end
subgraph "硬件层"
CH390[CH390芯片]
PHY[内部PHY]
RAM[16K SRAM]
end
App --> EthMgr
EthMgr --> Mediator
Mediator --> MAC
Mediator --> PHY
MAC --> SPI
PHY --> SPI
SPI --> CH390
CH390 --> PHY
CH390 --> RAM
图表来源 - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c
系统初始化流程¶
sequenceDiagram
participant App as 应用程序
participant MAC as MAC驱动
participant SPI as SPI接口
participant CH390 as CH390芯片
participant PHY as 内部PHY
App->>MAC : 创建MAC实例
MAC->>SPI : 初始化SPI设备
SPI->>CH390 : 配置SPI参数
MAC->>CH390 : 软件复位
CH390->>CH390 : 等待复位完成
MAC->>CH390 : 验证芯片ID
MAC->>CH390 : 默认寄存器配置
MAC->>CH390 : 清除多播表
MAC->>CH390 : 获取MAC地址
MAC->>PHY : 初始化PHY
PHY->>CH390 : 配置PHY寄存器
MAC->>App : 初始化完成
图表来源 - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c
详细组件分析¶
CH390寄存器系统¶
CH390芯片提供了丰富的寄存器配置选项,涵盖了网络控制、状态监控、传输控制、接收控制等多个功能域。
寄存器分类¶
graph LR
subgraph "网络控制寄存器"
NCR[NCR - 网络控制]
NSR[NSR - 网络状态]
WCR[WCR - 唤醒控制]
end
subgraph "传输控制寄存器"
TCR[TCR - 传输控制]
TSRA[TSRA - 传输状态A]
TSRB[TSRB - 传输状态B]
TCR2[TCR2 - 传输控制II]
TCSCR[TCSCR - 传输校验和控制]
end
subgraph "接收控制寄存器"
RCR[RCR - 接收控制]
RSR[RSR - 接收状态]
RCSCSR[RCSCSR - 接收校验和控制]
RLENCR[RLENCR - 接收数据包长度控制]
end
subgraph "中断和时钟寄存器"
ISR[ISR - 中断状态]
IMR[IMR - 中断掩码]
INTCR[INTCR - 中断引脚控制]
SCCR[SCCR - 系统时钟控制]
end
subgraph "内存和指针寄存器"
MRRL[MRRL - 内存读低字节地址]
MRRH[MRRH - 内存读高字节地址]
MWRL[MWRL - 内存写低字节地址]
MWRH[MWRH - 内存写高字节地址]
MPTRCR[MPTRCR - 内存指针控制]
end
图表来源 - ch390.h
SPI通信协议¶
CH390采用专有的SPI命令格式进行寄存器和内存访问:
flowchart TD
Start([SPI通信开始]) --> Cmd[发送命令字节]
Cmd --> Addr[发送地址字节]
Addr --> Data[发送/接收数据]
Data --> Check{检查操作类型}
Check --> |寄存器读| RegRead[寄存器读取]
Check --> |寄存器写| RegWrite[寄存器写入]
Check --> |内存读| MemRead[内存读取]
Check --> |内存写| MemWrite[内存写入]
RegRead --> End([通信结束])
RegWrite --> End
MemRead --> End
MemWrite --> End
图表来源 - ch390.h
章节来源 - ch390.h
MAC驱动实现¶
MAC驱动实现了完整的以太网帧处理功能,包括初始化、数据传输、接收处理和错误恢复。
数据帧格式¶
CH390接收的数据帧采用特定的头部格式:
graph LR
subgraph "接收帧结构"
Header[4字节帧头]
Status[状态字节]
LenLow[长度低字节]
LenHigh[长度高字节]
Payload[数据载荷]
end
Header --> Status
Status --> LenLow
LenLow --> LenHigh
LenHigh --> Payload
subgraph "帧头解析"
Flag[标志位]
Status --> Flag
Status --> ErrorMask[错误掩码]
end
图表来源 - esp_eth_mac_ch390.c
接收处理流程¶
flowchart TD
Start([接收处理开始]) --> DummyRead[执行虚拟读取]
DummyRead --> CheckReady{检查就绪状态}
CheckReady --> |错误状态| ResetDevice[重置设备]
CheckReady --> |正常状态| CheckPacket{检查数据包}
CheckPacket --> |无数据| ReturnZero[返回长度0]
CheckPacket --> |有数据| ReadHeader[读取帧头]
ReadHeader --> ValidateStatus{验证状态}
ValidateStatus --> |错误| DropFrame[丢弃帧]
ValidateStatus --> |正确| CheckLength{检查长度}
CheckLength --> |超长| ResetPointer[重置指针]
CheckLength --> |正常| ReadData[读取数据]
ReadData --> RemoveCRC[移除CRC]
RemoveCRC --> ReturnData[返回数据]
DropFrame --> ReturnError[返回错误]
ResetDevice --> ReturnError
ResetPointer --> ReturnError
ReturnZero --> End([接收处理结束])
ReturnData --> End
ReturnError --> End
图表来源 - esp_eth_mac_ch390.c
章节来源 - esp_eth_mac_ch390.c
PHY驱动实现¶
PHY驱动基于标准的IEEE 802.3规范实现,提供了完整的PHY功能支持。
链路状态检测¶
sequenceDiagram
participant MAC as MAC驱动
participant PHY as PHY驱动
participant CH390 as CH390芯片
participant Peer as 对端设备
MAC->>PHY : 请求链路状态
PHY->>CH390 : 读取BMSR寄存器
CH390-->>PHY : 返回链接状态
PHY->>CH390 : 读取ANLPAR寄存器
CH390-->>PHY : 返回对端能力
alt 链接状态变化
PHY->>MAC : 通知链接状态改变
PHY->>CH390 : 读取BMCR寄存器
CH390-->>PHY : 返回速度和双工设置
PHY->>MAC : 通知速度和双工变更
PHY->>MAC : 通知对端暂停能力
else 链接保持不变
PHY->>MAC : 不发送状态变更
end
图表来源 - esp_eth_phy_ch390.c
章节来源 - esp_eth_phy_ch390.c
依赖关系分析¶
CH390驱动依赖于多个ESP-IDF组件和外部库:
graph TB
subgraph "ESP-IDF核心组件"
SPI[driver/spi_master]
GPIO[driver/gpio]
Timer[esp_timer]
FreeRTOS[FreeRTOS]
Heap[heap_caps]
end
subgraph "ESP-IDF以太网框架"
EthDriver[esp_eth_driver]
EthMAC[esp_eth_mac]
EthPHY[esp_eth_phy]
Eth8023[esp_eth_phy_802_3]
end
subgraph "CH390驱动"
MAC[esp_eth_mac_ch390]
PHY[esp_eth_phy_ch390]
Reg[ch390.h]
end
MAC --> SPI
MAC --> GPIO
MAC --> Timer
MAC --> FreeRTOS
MAC --> Heap
MAC --> EthDriver
MAC --> EthMAC
MAC --> Reg
PHY --> EthPHY
PHY --> Eth8023
PHY --> Reg
EthDriver --> EthMAC
EthDriver --> EthPHY
图表来源 - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c
关键依赖项¶
| 依赖项 | 版本要求 | 用途 | 重要性 |
|---|---|---|---|
| ESP-IDF | >= 5.3.0 | 主要开发框架 | 核心 |
| SPI Master | 内置 | 设备通信 | 核心 |
| FreeRTOS | 内置 | 任务调度 | 核心 |
| GPIO | 内置 | 引脚控制 | 核心 |
| Heap Caps | 内置 | 内存管理 | 重要 |
章节来源 - esp_eth_mac_ch390.c
性能考虑¶
CH390驱动在设计时充分考虑了性能优化和资源利用效率。
内存管理¶
驱动采用DMA兼容的内存分配策略,确保与以太网栈的高效协作:
- 接收缓冲区:使用
heap_caps_malloc分配DMA兼容内存 - 任务栈大小:默认4096字节,可通过配置调整
- 内存对齐:接收缓冲区按4字节对齐,优化SPI传输性能
中断处理优化¶
flowchart TD
ISR[中断触发] --> CheckInt{检查中断源}
CheckInt --> |接收中断| NotifyTask[通知接收任务]
CheckInt --> |其他中断| ClearStatus[清除状态]
CheckInt --> |无中断| Continue[继续等待]
NotifyTask --> TaskWake[唤醒接收任务]
TaskWake --> ProcessFrame[处理接收帧]
ProcessFrame --> ClearISR[清除中断状态]
ClearISR --> Continue
ClearStatus --> Continue
Continue --> ISR
图表来源 - esp_eth_mac_ch390.c
传输性能优化¶
- DMA传输:使用SPI轮询传输模式,避免中断开销
- 批量处理:接收任务连续处理多个数据包,减少任务切换
- 错误恢复:自动检测和恢复传输错误,提高可靠性
章节来源 - esp_eth_mac_ch390.c
故障排除指南¶
常见问题及解决方案¶
设备初始化失败¶
症状:驱动初始化过程中出现错误 可能原因: - SPI配置不正确 - 引脚连接错误 - 电源问题
解决步骤: 1. 检查SPI主机配置和时钟频率 2. 验证引脚连接是否正确 3. 确认电源电压稳定
接收数据异常¶
症状:接收数据包损坏或丢失 可能原因: - SPI通信错误 - 中断配置问题 - 缓冲区不足
解决步骤: 1. 检查SPI时序和时钟频率 2. 验证中断引脚配置 3. 增加接收缓冲区大小
链接状态不稳定¶
症状:频繁的链接状态变化 可能原因: - PHY配置问题 - 网络环境干扰 - 电缆质量问题
解决步骤: 1. 检查PHY寄存器配置 2. 验证网络连接质量 3. 更换网线或网络设备
调试工具和方法¶
驱动提供了详细的日志输出,便于问题诊断:
- 初始化日志:显示设备检测和配置过程
- 传输日志:记录发送和接收状态
- 错误日志:报告具体的错误类型和位置
章节来源 - esp_eth_mac_ch390.c - esp_eth_mac_ch390.c
结论¶
CH390硬件驱动是一个功能完整、性能优良的以太网控制器驱动程序。它成功地将复杂的硬件功能封装为易于使用的API接口,为开发者提供了可靠的以太网通信解决方案。
主要优势¶
- 完整的功能支持:实现了CH390的所有核心功能
- 灵活的配置选项:支持多种工作模式和配置参数
- 高性能设计:优化的内存管理和中断处理机制
- 良好的错误处理:完善的错误检测和恢复机制
- 标准的API接口:符合ESP-IDF框架的设计规范
技术特点¶
- SPI通信协议:标准化的SPI接口,易于集成
- 中断驱动:高效的中断处理机制
- DMA兼容:优化的内存管理策略
- IEEE 802.3兼容:完全符合以太网标准
- HP Auto-MDIX:自动交叉线识别功能
该驱动为工业应用提供了可靠的以太网连接解决方案,适用于各种需要稳定网络通信的嵌入式系统。
附录¶
硬件连接图¶
graph TB
subgraph "ESP32-S3微控制器"
CPU[ESP32-S3]
GPIO[GPIO引脚]
end
subgraph "CH390以太网控制器"
CH390[CH390芯片]
RJ45[RJ45接口]
Transformer[隔离变压器]
end
subgraph "外部连接"
Power[3.3V电源]
Ground[GND]
Network[网线]
end
CPU --> GPIO
GPIO --> CH390
Power --> CH390
Ground --> CH390
Network --> RJ45
RJ45 --> Transformer
Transformer --> CH390
subgraph "引脚映射"
MOSI[GPIO11 - SDI]
MISO[GPIO13 - SDO]
SCK[GPIO12 - SCK]
CS[GPIO10 - SCS]
INT[GPIO14 - INT]
RST[GPIO9 - RST]
end
GPIO --> MOSI
GPIO --> MISO
GPIO --> SCK
GPIO --> CS
GPIO --> INT
GPIO --> RST
图表来源 - CH390H_Wiring.md
引脚定义¶
| 引脚名称 | 功能描述 | 电平 | 默认状态 |
|---|---|---|---|
| VCC | 电源正极 | 3.3V | 高电平 |
| GND | 电源负极 | 0V | 低电平 |
| SDI | SPI数据输入 | 3.3V | 高阻态 |
| SDO | SPI数据输出 | 3.3V | 高阻态 |
| SCK | SPI时钟 | 3.3V | 高阻态 |
| SCS | SPI片选 | 3.3V | 高电平 |
| INT | 中断输出 | 3.3V | 高电平 |
| RST | 复位输入 | 3.3V | 高电平 |
电气特性¶
- 工作电压:3.3V ± 0.3V
- 工作电流:典型值 15mA,最大值 25mA
- SPI时钟频率:最高 50MHz
- 存储器容量:16K字节 SRAM
- 温度范围:-40°C 到 +85°C
兼容性注意事项¶
- ESP-IDF版本:需要 ESP-IDF >= 5.3.0
- 编译器:支持 ESP-IDF 的标准编译器
- 内存要求:至少 4KB RAM 可用空间
- SPI主机:支持标准 SPI 主机接口
- 引脚配置:GPIO 引脚需支持 SPI 功能
章节来源 - CH390H_Wiring.md