Files
STM32F4-Base/Drivers/BSP/CH395F
wandering1 df13dec479
CI / L0 静态门禁 (pre-commit) (push) Failing after 2m14s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 22s
refactor(net): 挂起 recv 模型拆出 net_pending.c/h + 留痕探针编译门控 + E15 归因修正
- E15 归因修正:幽灵状态 0x04+旧端口 = 芯片如实报告拆除中的旧连接
  (文档化行为,非芯片故障;bit3=1 为我方设置(ver>=0x46)、
  RFC 9293 §3.3.2 Fig5 拆除顺序、WCH 官方博客方案 = close 完成后重开监听)
- 术语统一:全库"了结"→"结束"(约 45 处);阻塞模型 §4 首次出现处定义"五路"
- 注释清理:删孤儿函数头注释、考古叙事改现在时、去不可检索内部编码"L3"
  (33 处 6 文件)、banner 去重(唯一理由移到分支现场)
- 挂起超时留痕探针:编译期开关 NET_PENDING_TRIPWIRE(默认 0 = 编译剔除,
  省约 150B Flash;排查调用方挂死时置 1,只留痕绝不强制结束)
- 拆模块:net_pending.c/h(363/94 行)承载挂起 recv 模型,
  net_socket.c 4059→3661 行;tick 收控制块表参数、settle_close 双参显式传;
  net_pending_active 声明移配对头(S17 2.2);仅注册 uvprojx +
  check_registration MCU-only 白名单(同 net_listener.c 机制,
  模拟器走 net_socket_sim.c 按外部语义模拟)
- 文档:阻塞模型新增全过程小节(单主干流程图)+ §9 排查辅助;
  NET README / 函数调用关系 / 自愈架构 / BSD 指南同步;引用关系图重生成
- 台架回归:启动闭环 PASS([ERR]/Fault 零命中、回读一致)、
  :7003 重连探针 10/10、FTP 50 连接 STOR 50/50、回归窗口串口日志无异常
- RAM:ER_IROM1 230004B(探针门控后约 -150B),台账已回填
2026-10-14 09:53:38 +08:00
..

Drivers/BSP/CH395F/ — CH395F 以太网控制器驱动

CH395F 是 SPI 接口的 10/100M 以太网 MAC+PHY 控制器。本目录是其底层寄存器级驱动, 上层的 BSD Socket 抽象见 ../NET/。

文件一览

文件 作用
ch395f.c/h SPI 命令收发、寄存器读写、芯片初始化、通道/中断管理

关键点

  • SPI 接口:SPI2(PB12 CS / PB13 SCK / PB14 MISO / PB15 MOSI)
  • 每次 SPI 事务必须 ch395f_spi_begin() / ch395f_spi_end() 包裹
  • SPI 分频系数必须为 8(PCB 信号完整性约束,勿"优化"改快)
  • 芯片最多 8 个 socket,本层用事件中断 + 周期轮询驱动
  • PHY 强制 100M 全双工(net_task 中配置)

⚠️ 改本驱动前必读陷阱(Trap Records)

Trap 问题 状态
TC-NET-604 "RX 窗口冻结" 判定为非缺陷(原报告系测试程序自吞数据 + 判读工具误判) ✅ 结案
TRAP-NET-17 快速复连事件面未收到 → 监听静默死亡(E14 复核:非芯片丢事件,是读清消费竞态);修复 = net_reconcile_tick() 周期对账自愈 ✅ 已修
TRAP-NET-18 上传中止后首笔复连被静默截断(≤2048B)并误报成功;修复 = 异常释放后复监听隔离排空 ✅ 已修

完整台账与复现配方见 docs/问题记录/CH395F_Trap_Records.md(改驱动前必读)。

相关文档

  • 测试指南:docs/测试说明/CH395F_Test_Guide.md
  • 上层抽象:../NET/README.md
  • 台架探针:MDK-ARM/tcp_reconnect_probe.py、test/host/ftp_abort_probe.py