# 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`
