跳转至

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

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论
  10. 附录

简介

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接口,为开发者提供了可靠的以太网通信解决方案。

主要优势

  1. 完整的功能支持:实现了CH390的所有核心功能
  2. 灵活的配置选项:支持多种工作模式和配置参数
  3. 高性能设计:优化的内存管理和中断处理机制
  4. 良好的错误处理:完善的错误检测和恢复机制
  5. 标准的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