# TCP2UART 工程调试指南 ## 1. 适用范围 本指南面向当前 `TCP2UART` 工程,目标是指导以下调试场景: 1. `STM32F103R8T6 + CH390D` 的基础 bring-up 2. CH390D 的寄存器读写、链路检测、中断与收发调试 3. `lwIP RAW API + NO_SYS=1` 路线下的网络链路问题定位 4. UART 透传与 TCP 双链路联调 本指南默认基线: 1. 当前工程已切换为裸机主循环架构 2. CH390 运行时访问统一由 `ch390_runtime` 持有 3. 调试输出通过 `SEGGER RTT` 4. 当前代码已经通过 `MDK-ARM` 构建,且构建结果为 `0 error / 0 warning` ## 2. 当前工程调试边界 截至当前版本,工程状态应按以下层级理解: 1. MCU 启动、系统时钟、RTT、TIM4 心跳与主循环均可正常工作 2. CH390D 已恢复基础寄存器读写,不再处于“全 `0xFF` / 全 `0x0000`”阶段 3. 实机已读到可信芯片与 PHY 标识:`VID=0x1C00`、`PID=0x9151`、`REV=0x2B`、`PHYID1=0x7371`、`PHYID2=0x9011` 4. 实机已观察到主机 Realtek USB GbE 网卡为 `Connected 100 Mbps`,且设备侧 `lwIP netif` 标志包含 `LINK_UP` 5. 当前调试重点不再是“SPI 是否完全不通”,而是: - 默认配置是否完整生效 - MAC 写入与回读是否一致 - PHY 协商、`INT/LINK/RX/TX` 是否进入正常工作态 - 网络链路与 UART 透传是否稳定协同 因此,后续调试应避免继续沿用“CH390 完全无响应”的旧结论,而应转入功能链路验证。 ## 3. 代码入口与责任边界 ### 3.1 启动路径 当前 CH390 相关启动链路为: 1. `main()` 2. `App_Init()` 3. `lwip_netif_init()` 4. `ethernetif_init()` / `low_level_init()` 5. `ch390_runtime_init()` 6. `ch390_gpio_init()` 7. `ch390_spi_init()` 8. `ch390_hardware_reset()` 9. `ch390_runtime_probe_identity()` 10. `ch390_default_config()` 11. `ch390_set_mac_address()` / `ch390_get_mac()` 12. `ch390_interrupt_init()` ### 3.2 运行时责任边界 当前代码约束如下: 1. `Drivers/CH390/CH390_Interface.c` - 只负责底层 GPIO、SPI 与寄存器/内存访问 - 当前寄存器读写路径使用 `Mode 3 + bytewise exchange` 事务模型 2. `Drivers/CH390/CH390.c` - 只负责芯片级 helper,例如 `default_config`、PHY 访问、MAC 操作 3. `Drivers/CH390/ch390_runtime.c` - 唯一的 CH390 运行时拥有者 - 负责初始化、链路查询、IRQ 消费、RX/TX 服务 4. `Drivers/LwIP/src/netif/ethernetif.c` - 不再直接承担复杂 CH390 运行时事务,只做 netif glue 5. `Core/Src/main.c` - 启动后只通过 `BootDiag_ReportCh390()` 读取 runtime 提供的启动快照 调试时应优先维护这个边界,不要重新把原始寄存器访问散落回 `main.c` 或 EXTI 中断中。 ## 4. 当前硬件连接事实 根据 `PCB/SCH_Schematic1_2026-03-26.pdf`,CH390D 关键硬件事实如下: 1. MCU 与 CH390D 的连接关系: - `PA4 -> CH_CS -> U4.SCS` - `PA5 -> CH_CLK -> R10(22Ω) -> U4.SCK` - `PA6 <- CH_SDO <- U4.SDO/MISO` - `PA7 -> CH_SDI -> U4.SDI/MOSI` - `PB0 <- CH_INT <- U4.INT` - `PB1 -> CH_RST -> R8(470Ω) -> U4.RSTB` 2. CH390D 使用 `25MHz` 晶振 `X2` 3. CH390D 存在独立相关电源域: - `VDDK` - `AVDD33/VDDIO` - `AVDD33` 4. CH390D 周边去耦电容包括 `C18/C20/C21/C22` 5. 原理图上未看到独立的 `MISO` 外部上拉电阻 6. 当前代码中的 `ch390_hardware_reset()` 采用: - 复位前等待 `10ms` - `RSTB` 拉低 `3ms` - 释放后等待 `50ms` 调试时必须优先在 **CH390 芯片脚侧** 量测,而不是只在 MCU GPIO 侧判断。 ## 5. 推荐调试顺序 ### 5.1 P0:先确认基础条件 每次进入功能调试前,先确认以下最小基线: 1. `MDK` 可成功构建,且当前日志为 `0 error / 0 warning` 2. RTT 可输出启动日志 3. `BootDiag_ReportCh390()` 能打印出 `VID/PID/REV/NSR/NCR/RCR/IMR/INTCR/GPR/ISR` 4. `App_Poll()` 正常运行,LED 心跳正常 ### 5.2 P1:验证 CH390 初始化状态 优先检查以下问题: 1. `ETH init: probe/default/mac/getmac/irq/done` 是否完整打印 2. `VID/PID/REV` 与 PHY ID 是否稳定、可信 3. MAC 写入与 `ch390_get_mac()` 回读是否一致 4. `RCR/IMR/INTCR/GPR` 是否进入预期工作态 5. `link_up` 与 `lwIP netif` 的 `LINK_UP` 标志是否与物理网线状态一致 如这一层失败,优先回到芯片侧量测: 1. `RSTB` 2. `CS` 3. `SCK` 4. `MOSI` 5. `MISO` 6. `VDDK / AVDD33/VDDIO / AVDD33` ### 5.3 P2:验证 IRQ 与链路检测 在基础寄存器读写可信后,重点验证: 1. `PB0/EXTI0` 是否能接收到 CH390 的 `INT` 2. `ISR_LNKCHG` 发生时,`ch390_runtime_poll()` 是否正确更新链路状态,不再依赖阻塞式 `HAL_Delay(65)` 3. `ethernetif_check_link()` 与 `ch390_runtime_check_link()` 的结果是否一致 4. 必须区分“启动快照中的 `g_diag.link_up`”与“主循环中实时更新后的 `netif->flags & NETIF_FLAG_LINK_UP`” ### 5.4 P3:验证 RX/TX 数据通路 在 `link_up` 可信后,再继续验证数据通路: 1. 先确保主机网卡与设备处于同一子网;当前联调基线曾使用主机 `192.168.31.1` 与设备 `192.168.31.x` 2. `ch390_runtime_input()` 是否能稳定读取 `RX SRAM` 3. `rx_status / rx_len` 是否合理 4. `ch390_runtime_output()` 是否能正确等待 `TCR_TXREQ` 清零并发送帧 5. 网络端与 UART2/UART3 透传是否联通 ### 5.5 P4:验证系统级联调 最终再验证: 1. TCP Server 与 UART2 双向透传 2. TCP Client 与 UART3 双向透传 3. 配置保存、复位与 MAC 生效路径 4. 长时间运行稳定性 ## 6. 推荐的现场观测点 ### 6.1 软件观测点 优先关注以下函数与状态: 1. `BootDiag_ReportCh390()` 2. `ch390_runtime_probe_identity()` 3. `ch390_runtime_init()` 4. `ch390_runtime_poll()` 5. `ch390_runtime_check_link()` 6. `ch390_runtime_input()` 7. `ch390_runtime_output()` ### 6.2 硬件观测点 优先关注 CH390 芯片脚侧: 1. `RSTB` 2. `SCS` 3. `SCK` 4. `SDI/MOSI` 5. `SDO/MISO` 6. `INT` 7. `VDDK` 8. `AVDD33/VDDIO` 9. `AVDD33` 10. `XI/XO` ## 7. 常见误区 调试当前工程时,应避免以下误区: 1. 不要再直接沿用“CH390 恒为全 `0xFF`”这一过时结论 2. 不要在 `main.c`、IRQ、netif 多处重新插入原始 CH390 访问 3. 不要在没有芯片脚侧证据前,只凭 MCU 侧 GPIO 就认定 `RST/CS/SCK/MISO` 正常 4. 不要在基础寄存器读写尚不可信时,直接调高层 `TCP/UART` 业务逻辑 5. 不要把一次性的 bring-up 实验代码长期留在正式启动路径中 ## 8. 当前推荐结论表达方式 当需要向项目成员同步当前状态时,推荐使用如下表述: 1. 当前工程软件架构已稳定在 `bare-metal + lwIP RAW + ch390_runtime 单一拥有者` 2. 当前 CH390D 已恢复基础寄存器读写,调试重点已转入初始化完整性、链路、中断与收发功能 3. 硬件验证仍必须以 CH390 芯片脚侧波形与电源域量测为准 4. 上层 `TCP/UART` 联调应建立在 CH390 初始化、链路与供电稳定三者都可信之后 5. 本项目已确认过一次真实硬件根因:CH390D 供电滤波电容虚焊会直接表现为网络收发异常 ## 9. 建议配套文档 建议与本指南配套阅读: 1. `项目技术实现.md` 2. `CH390D_硬件检查指南.md` 3. `uart-ch390-debug-handoff.md` 4. `PCB/SCH_Schematic1_2026-03-26.pdf`