外设接口规范¶
本文档引用的文件 - config.h - ch390.h - esp_eth_mac_ch390.h - esp_eth_phy_ch390.h - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c - CH390H_Wiring.md - eth_manager.c - hci_passthrough.c - hci_uart_tester.py - main.c - ws2812_led.c
目录¶
简介¶
本文件为ESP32-S3 BLE网关的外设接口技术规范,重点覆盖以下内容: - UART通信协议规范:波特率设置(1Mbps)、数据格式、流控制机制、错误处理 - SPI接口规范:CH390以太网控制器的通信协议、时钟频率(20MHz)、数据传输格式、片选时序 - I2C、GPIO和其他外设接口规范 - 电气参数、时序图和协议帧格式 - 接口测试方法和调试工具使用指南
项目结构¶
该项目采用组件化设计,主要涉及以下模块: - UART(BLE控制器通信):配置为1Mbps,启用硬件流控(RTS/CTS) - SPI(以太网控制器CH390):20MHz时钟,标准SPI模式,片选低电平有效 - I2C:基于ESP32-S3 SoC能力(具体引脚在配置中预留) - GPIO:LED指示、中断、复位等控制引脚 - 其他外设:WS2812 LED指示灯(RMT驱动)
graph TB
subgraph "主控制器"
ESP32S3[ESP32-S3 MCU]
UART[UART外设<br/>1Mbps, 硬件流控]
SPI[SPI外设<br/>20MHz]
I2C[I2C外设<br/>引脚预留]
GPIO[GPIO外设<br/>LED/INT/RST]
end
subgraph "外部设备"
NRF52833[NRF52833 BLE控制器<br/>Zephyr HCI]
CH390[CH390 以太网控制器<br/>SPI接口]
WS2812[WS2812 LED指示灯<br/>RMT驱动]
end
ESP32S3 --> UART
ESP32S3 --> SPI
ESP32S3 --> I2C
ESP32S3 --> GPIO
UART <- --> NRF52833
SPI <- --> CH390
GPIO --> WS2812
图表来源 - main.c - config.h - CH390H_Wiring.md
核心组件¶
- UART(BLE控制器通信)
- 波特率:1Mbps
- 数据格式:8N1(8数据位,无校验,1停止位)
- 流控制:硬件流控(RTS/CTS)
- 引脚:TX=17, RX=18, RTS=15, CTS=16
- SPI(CH390以太网控制器)
- 时钟频率:20MHz
- 模式:SPI模式0(CPOL=0, CPHA=0)
- 片选:低电平有效
- 引脚:MOSI=11, MISO=13, SCK=12, SCS=10
- 中断:INT=14
- 复位:RST=9
- I2C(预留)
- 引脚:在配置中预留,具体引脚由应用决定
- GPIO(其他外设)
- WS2812 LED:RMT驱动,GPIO48
- 中断/复位:INT=14, RST=9
- 其他
- WS2812 LED:RMT编码器,10MHz分辨率,300μs复位时间
章节来源 - config.h - CH390H_Wiring.md - ws2812_led.c
架构总览¶
系统通过UART与NRF52833进行BLE数据交换,通过SPI与CH390以太网控制器通信,同时提供LED状态指示和网络管理。
sequenceDiagram
participant Host as "主机应用"
participant ESP as "ESP32-S3"
participant UART as "UART接口"
participant BLE as "NRF52833"
participant ETH as "CH390以太网"
Host->>ESP : 配置UART(1Mbps, 硬件流控)
ESP->>UART : 初始化TX/RX/RTS/CTS
UART->>BLE : 透明转发HCI数据
Host->>ESP : 配置SPI(20MHz)
ESP->>ETH : SPI写寄存器/内存
ETH-->>ESP : 返回以太网状态
ESP-->>Host : 提供网络状态
图表来源 - hci_passthrough.c - eth_manager.c
章节来源 - hci_passthrough.c - eth_manager.c
详细组件分析¶
UART通信协议规范(BLE控制器)¶
- 波特率设置:1Mbps(匹配NRF52833 Zephyr HCI要求)
- 数据格式:8N1(8数据位,无校验,1停止位)
- 流控制机制:硬件流控(RTS/CTS),启用rx_flow_ctrl_thresh=64
- 错误处理:超时重试、缓冲区溢出检测、日志记录
- 引脚映射:TX=17, RX=18, RTS=15, CTS=16
sequenceDiagram
participant ESP as "ESP32-S3"
participant UART as "UART驱动"
participant BLE as "NRF52833"
ESP->>UART : 配置1Mbps, 8N1, 硬件流控
UART->>BLE : TX数据(带RTS/CTS握手)
BLE-->>UART : RX数据(受RTS/CTS控制)
UART-->>ESP : 事件回调/队列通知
图表来源 - hci_passthrough.c - config.h
章节来源 - hci_passthrough.c - config.h
SPI接口规范(CH390以太网控制器)¶
- 时钟频率:20MHz(ETH_SPI_CLK_MHZ=20)
- 模式:SPI模式0(CPOL=0, CPHA=0)
- 帧格式:命令位1位,地址位7位
- 片选时序:低电平有效,硬件自动管理
- 寄存器访问:OPC_REG_W(0x80)写,OPC_REG_R(0x00)读
- 内存访问:OPC_MEM_WRITE(0xF8),OPC_MEM_READ(0x72)
- 中断:INT引脚下降沿触发,GPIO ISR服务
- 复位:RST引脚低电平复位,上电自动复位
flowchart TD
Start([SPI初始化]) --> Config["配置SPI主机<br/>20MHz, 模式0"]
Config --> AddDev["添加SPI设备<br/>CS=10, MOSI=11, MISO=13, SCK=12"]
AddDev --> Lock["获取SPI互斥锁"]
Lock --> Cmd["发送命令+地址"]
Cmd --> RW{"读或写?"}
RW --> |写| Write["写数据缓冲"]
RW --> |读| Read["读数据缓冲"]
Write --> Unlock["释放SPI互斥锁"]
Read --> Unlock
Unlock --> End([完成])
图表来源 - eth_manager.c - esp_eth_mac_ch390.c
章节来源 - eth_manager.c - esp_eth_mac_ch390.c - ch390.h
CH390寄存器与内存访问¶
- 寄存器访问:通过SPI命令进行寄存器读写
- 内存访问:支持内存读写命令,带地址增量控制
- 中断处理:ISR寄存器状态查询,IMR中断屏蔽寄存器
- 流控配置:FCR(0x0A)启用流控,FCTR高低水位阈值
- 物理层:PHY寄存器BMCR/BMSR等,支持自协商和环回
classDiagram
class CH390寄存器 {
+NCR : 网络控制
+NSR : 网络状态
+TCR : 发送控制
+RCR : 接收控制
+FCR : 流控
+IMR : 中断屏蔽
+ISR : 中断状态
}
class CH390内存 {
+TXPLL/TXPLH : 发送长度
+MRCMD/MWCMD : 内存读写
+MRRL/MWRH : 地址寄存器
}
class CH390PHY {
+BMCR : 控制寄存器
+BMSR : 状态寄存器
+ANAR/ANLPAR : 自协商
}
CH390寄存器 <.. CH390内存 : "通过SPI访问"
CH390寄存器 <.. CH390PHY : "MII管理接口"
图表来源 - ch390.h - esp_eth_mac_ch390.c
章节来源 - ch390.h - esp_eth_mac_ch390.c
I2C接口规范(预留)¶
- 引脚预留:I2C引脚在配置中预留,具体引脚由应用决定
- 时序:标准I2C时序(SDA/SCL),支持主从模式
- 用途:可扩展传感器、EEPROM等外设
章节来源 - config.h
GPIO接口规范¶
- LED指示:WS2812,GPIO48,RMT编码器驱动
- 中断:INT=14,下降沿触发,GPIO ISR服务
- 复位:RST=9,低电平有效
- 其他:NRF复位引脚=4
章节来源 - config.h - ws2812_led.c
电气参数与时序¶
- UART电气参数
- 波特率:1Mbps
- 数据格式:8N1
- 流控:RTS/CTS
- SPI电气参数
- 时钟频率:20MHz
- 模式:SPI模式0
- 片选:低电平有效
- WS2812电气参数
- 逻辑0:T0H=400ns, T0L=850ns
- 逻辑1:T1H=800ns, T1L=450ns
- 复位时间:300μs
- 分辨率:10MHz(1tick=100ns)
章节来源 - ws2812_led.c
依赖关系分析¶
- UART依赖于ESP32-S3的UART外设和GPIO配置
- SPI依赖于ESP32-S3的SPI主机和GPIO配置
- CH390驱动依赖ESP-IDF的以太网框架和SPI驱动
- WS2812依赖RMT外设和DMA传输
graph TB
UART[UART驱动] --> ESP32S3[ESP32-S3 UART外设]
SPI[SPI驱动] --> ESP32S3[ESP32-S3 SPI外设]
CH390[CH390驱动] --> SPI
CH390 --> ETH[以太网栈]
WS2812[RMT驱动] --> ESP32S3[RMT外设]
图表来源 - eth_manager.c - ws2812_led.c
章节来源 - eth_manager.c - ws2812_led.c
性能考虑¶
- UART吞吐量:1Mbps全双工,硬件流控避免数据丢失
- SPI吞吐量:20MHz时钟,建议批量传输减少SPI事务开销
- 中断优先级:CH390中断使用GPIO ISR,注意与WiFi/蓝牙中断优先级协调
- 内存管理:UART/ETH缓冲区大小合理配置,避免溢出
- LED刷新:RMT DMA传输,避免阻塞任务调度
故障排除指南¶
- UART问题
- 症状:数据丢失或超时
- 排查:检查RTS/CTS连接,确认波特率一致,查看日志
- SPI问题
- 症状:CH390初始化失败或寄存器读写错误
- 排查:检查片选时序,确认SPI模式和时钟频率,验证引脚连接
- 中断问题
- 症状:ETH中断不触发
- 排查:确认INT引脚配置为下降沿触发,检查GPIO ISR安装
- LED问题
- 症状:LED不亮或显示异常
- 排查:确认RMT通道配置,检查WS2812引脚和供电
章节来源 - hci_passthrough.c - eth_manager.c - ws2812_led.c
结论¶
本规范明确了ESP32-S3 BLE网关的外设接口要求,包括UART(1Mbps, 硬件流控)和SPI(20MHz, CH390)的具体配置与协议细节。通过合理的电气参数、时序设计和错误处理机制,确保系统稳定运行。建议在实际部署中严格遵循本规范,并结合提供的测试工具进行验证。
附录¶
接口测试方法¶
- UART测试
- 使用上位机工具(如hci_uart_tester.py)进行双向通信测试
- 验证1Mbps波特率下的数据完整性
- 测试RTS/CTS流控功能
- SPI测试
- 使用逻辑分析仪捕获SPI时序
- 验证寄存器读写和内存访问
- 测试CH390中断和复位功能
- LED测试
- 验证RMT编码正确性
- 测试多LED串联和亮度调节
章节来源 - hci_uart_tester.py - CH390H_Wiring.md