关键芯片都驱动,且测试成功
This commit is contained in:
92
AGENTS.md
92
AGENTS.md
@@ -2,14 +2,44 @@
|
||||
|
||||
## 项目概述
|
||||
|
||||
STM32F407ZGTx (Cortex-M4 FPU) 基础固件项目,集成 CH395F 以太网控制器 SPI 驱动(CH395F 自带 MAC+PHY 及 TCP/IP 协议栈固件)。
|
||||
STM32F407ZGTx (Cortex-M4 FPU) 基础固件项目,集成 CH395F 以太网控制器 SPI 驱动、GD5F2GQ5UE SPI NAND Flash 存储(含 FlashDB KVDB/TSDB 数据库)和 TPAFE5160 16位8通道同步采样 ADC 并行接口驱动。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
STM32F4-Base/
|
||||
├── Src/ # CubeMX 生成的外设初始化 + main
|
||||
├── Inc/ # CubeMX 生成的头文件
|
||||
├── Drivers/
|
||||
│ ├── BSP/
|
||||
│ │ ├── CH395F/ # CH395F 以太网芯片驱动(手写)
|
||||
│ │ ├── GD5F2GQ5UE/ # GD5F2GQ5UE NAND Flash 驱动(手写)
|
||||
│ │ │ ├── gd5f2gq5ue.h/c # 底层 SPI 驱动
|
||||
│ │ │ ├── fal_flash_gd5f2gq5ue.c # FAL 设备适配层
|
||||
│ │ │ ├── fal_cfg.h # FAL 设备表 + 分区表
|
||||
│ │ │ └── fdb_cfg.h # FlashDB 功能配置
|
||||
│ │ └── TPAFE5160/ # TPAFE5160 ADC 并行接口驱动(手写)
|
||||
│ ├── STM32F4xx_HAL_Driver/ # ST HAL 库(CubeMX 生成)
|
||||
│ └── CMSIS/ # ARM CMSIS(CubeMX 生成)
|
||||
├── Lib/
|
||||
│ └── FlashDB/ # FlashDB 数据库库(v2.2.99)
|
||||
│ ├── src/ # FlashDB 核心源码
|
||||
│ ├── inc/ # FlashDB 头文件
|
||||
│ └── port/fal/ # FAL 抽象层
|
||||
├── MDK-ARM/ # Keil MDK 工程文件
|
||||
├── docs/ # 参考文档
|
||||
└── STM32F407-Demo.ioc # STM32CubeMX 项目源文件
|
||||
```
|
||||
|
||||
## 关键文件
|
||||
|
||||
| 路径 | 说明 |
|
||||
|---|---|
|
||||
| `Src/main.c` | 程序入口,初始化序列及主循环 |
|
||||
| `Src/ch395f.c` / `Inc/ch395f.h` | CH395F 以太网芯片 SPI 驱动(核心自定义代码) |
|
||||
| `Drivers/BSP/CH395F/ch395f.c/h` | CH395F 以太网芯片 SPI 驱动 |
|
||||
| `Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c/h` | GD5F2GQ5UE NAND Flash SPI 驱动 |
|
||||
| `Drivers/BSP/GD5F2GQ5UE/fal_flash_gd5f2gq5ue.c` | FAL 设备适配层 |
|
||||
| `Drivers/BSP/TPAFE5160/tpafe5160.c/h` | TPAFE5160 ADC 并行接口驱动 |
|
||||
| `MDK-ARM/STM32F407-Demo.uvprojx` | Keil MDK 项目文件 |
|
||||
| `STM32F407-Demo.ioc` | STM32CubeMX 项目源文件 |
|
||||
|
||||
@@ -27,12 +57,14 @@ STM32F407ZGTx (Cortex-M4 FPU) 基础固件项目,集成 CH395F 以太网控制
|
||||
- **主频:** HSE 25MHz → PLL 168MHz (4/168/2)
|
||||
- **6 个 LED:** PC4, PC5, PB1, PB2, PF11, PF12(低电平点亮)
|
||||
- **CH395F:** SPI2 (PB12 CS, PB13 SCK, PB14 SDO, PB15 SDI)
|
||||
- **GD5F2GQ5UE:** SPI1 (PE0 CS, PB3 SCK, PB4 MISO, PB5 MOSI, PB8 WP, PE1 HOLD)
|
||||
- **TPAFE5160:** 并行16位 (PG0-PG15 数据, PD3 RD, PD4 CONVST, PD7 BUSY, PD1 FRSTDATA, PF13-15 OS[2:0])
|
||||
- **USART1:** PA9 TX, PA10 RX (115200bps)
|
||||
|
||||
## 启动顺序
|
||||
|
||||
```
|
||||
HAL_Init() → SystemClock_Config() → MX_GPIO_Init() → MX_USART1_UART_Init() → MX_SPI2_Init() → ch395f_reset() → ch395f_init()
|
||||
HAL_Init() → SystemClock_Config() → MX_GPIO_Init() → MX_USART1_UART_Init() → MX_SPI2_Init() → MX_SPI1_Init() → gd5f2gq5ue_init() → fdb_kvdb_init()
|
||||
```
|
||||
|
||||
## 代码规范
|
||||
@@ -43,13 +75,54 @@ HAL_Init() → SystemClock_Config() → MX_GPIO_Init() → MX_USART1_UART_Init()
|
||||
- 命名:小写字母+下划线;全局变量 `g_` 前缀,静态 `s_`,指针 `p_`,数组 `a_`
|
||||
- 函数注释块需包含:函数功能、入口参数、返回值、限定条件、函数说明
|
||||
- 大括号:K&R 风格(左大括号不换行)
|
||||
- 文件头注释:模块名称、功能、平台、作者、日期、修改记录
|
||||
- 头文件保护宏:`__MODULE_NAME_H` 格式,带 `extern "C"`
|
||||
|
||||
## 注意
|
||||
|
||||
- `Inc/` 和 `Src/` 中 CubeMX 生成的文件(gpio, spi, usart, stm32f4xx_it, main 的骨架)带有 `USER CODE BEGIN`/`END` 标记,自定义代码应写在这些区域之间以免被 CubeMX 重新生成时覆盖
|
||||
- `ch395f.c`/`ch395f.h` 为纯手工代码,不受 CubeMX 保护
|
||||
- `Inc/` 和 `Src/` 中 CubeMX 生成的文件带有 `USER CODE BEGIN`/`END` 标记,自定义代码应写在这些区域之间
|
||||
- `ch395f.c/h`、`gd5f2gq5ue.c/h`、`fal_flash_gd5f2gq5ue.c` 为纯手工代码,不受 CubeMX 保护
|
||||
- `tpafe5160.c/h` 为纯手工代码,不受 CubeMX 保护
|
||||
- CH395F 每次 SPI 事务需调用 `ch395f_spi_begin()` / `ch395f_spi_end()` 包裹
|
||||
- GD5F2GQ5UE 的 `gd5f2gq5ue.c` 中声明了 `extern SPI_HandleTypeDef hspi1`,需确保 SPI1 已初始化
|
||||
- FlashDB 使用 FAL 模式,`fdb_cfg.h` 中定义 `FDB_USING_FAL_MODE`,`fal_cfg.h` 中定义分区表
|
||||
- FlashDB 详细使用说明见 `FlashDB使用说明.md`
|
||||
- `sd2506.c/h` 为纯手工代码,不受 CubeMX 保护
|
||||
|
||||
## CH395F 驱动关键点
|
||||
|
||||
- 初始化必须按手册9.2.1节顺序:`SET_MAC` → `SET_IP/GWIP/MASK` → `INIT_CH395` → `SET_PHY`
|
||||
- **IP/网关/掩码必须在 `INIT_CH395` 之前设置**,INIT 会读取并锁定当前寄存器值到协议栈,之后再设 IP 无效
|
||||
- **`SET_PHY` 必须在 `INIT_CH395` 之后**,它会复位 MAC/PHY 建立物理链路,不影响已锁定的协议栈参数
|
||||
- **`CMD_PING_ENABLE` 不需要显式调用**,INIT 后默认可用
|
||||
- 每次 SPI 事务需调用 `ch395f_spi_begin()` / `ch395f_spi_end()` 包裹
|
||||
- CH395F 命令执行时序参考 `ch395f.h` 中命令码注释及 `CH395F.md`
|
||||
|
||||
## GD5F2GQ5UE 驱动关键点
|
||||
|
||||
- SPI Mode 0(CPOL=0, CPHA=0),时钟 42MHz
|
||||
- 初始化必须按顺序:复位 → 读 ID → 使能 ECC(B0h=10h)→ 解除块保护(A0h=00h)
|
||||
- SET_FEATURE 命令前必须先发写使能(06h)
|
||||
- 块擦除(D8h)参数是字节地址(块编号 × 128KB),不是块编号
|
||||
- 读取 ID(9Fh)返回 3 字节,第 0 字节无意义,第 1 字节 MID,第 2 字节 DID
|
||||
|
||||
## FlashDB 分区规划
|
||||
|
||||
| 分区名 | 偏移 | 大小 | 用途 |
|
||||
|--------|------|------|------|
|
||||
| fdb_kvdb1 | 0 | 64MB | KVDB 键值数据库 |
|
||||
| fdb_tsdb1 | 64MB | 64MB | TSDB 时序数据库 |
|
||||
|
||||
## TPAFE5160 驱动关键点
|
||||
|
||||
- AD7606 P2P 兼容替代品,并行接口协议一致
|
||||
- 并行模式:CS 接地(始终选中),PAR/SER/BYTE SEL 接 GND(并行),DB15/BYTE SEL 接 GND(非字节模式)
|
||||
- 数据总线 DB[15:0] 接 GPIOG[15:0],通过 `(uint16_t)GPIOG->IDR` 一次读取16位
|
||||
- CONVST 上升沿触发全部8通道同步采样,BUSY 高电平表示转换中
|
||||
- RD 下降沿输出通道数据,按通道1~8顺序依次输出
|
||||
- FRSTDATA 在第一个 RD 下降沿变高,指示通道1数据就绪
|
||||
- 过采样 OS[2:0] 在 BUSY 下降沿锁存,无过采样时 tCONV=1.74µs,64倍过采样时 tCONV=167µs
|
||||
- 读取时序:168MHz 下 GPIO 写操作 + 5个 NOP (~30ns) 覆盖 t10=22ns 和 t14=21ns 要求
|
||||
- 硬件 RANGE 接 GND → ±5V 量程,LSB=152.59µV
|
||||
|
||||
## 已知问题
|
||||
|
||||
@@ -57,11 +130,4 @@ HAL_Init() → SystemClock_Config() → MX_GPIO_Init() → MX_USART1_UART_Init()
|
||||
|
||||
CH395F 与 RTL8305NBI-CG 直连(经网络变压器)时,自动协商始终失败(返回 `PHY_DISCONN`),但强制 100M 全双工工作正常。强制 10M 全双工同样失败。
|
||||
|
||||
**诊断结果:**
|
||||
- Auto-Neg: `0x01 (DISCONNECTED)`
|
||||
- Force 100M-FULL: `0x08 (LINK OK)`
|
||||
- Force 10M-FULL: `0x01 (DISCONNECTED)`
|
||||
|
||||
**解决方案:** 初始化协议栈后调用 `ch395f_set_phy(CH395F_PHY_100M_FULL)` 跳过自动协商。
|
||||
|
||||
**推测根因:** 不同厂家 PHY 直连时的自动协商实现差异(CH395F WCH 固件 vs RTL8305NBI Realtek 硬件),物理层正常。
|
||||
|
||||
Reference in New Issue
Block a user