SFC_GPIO_PIN_MAPPING

2 阅读7分钟

/**

  • NOR FLASH SPI/SFC 的 GPIO 引脚映射
  • 本文档详细说明 WS63 芯片上 NOR Flash/SFC 使用的具体 GPIO 引脚
  • 根据代码分析得出,文件位置: platform_core_rom.h */

========================================================================================

✅ SFC 使用的GPIO引脚列表(已确认)

========================================================================================

源代码位置

文件: src/drivers/chips/ws63/include/platform_core_rom.h
行号: 50-56

标准SPI(Standard/Fast Read)引脚

引脚名GPIO号别名用途必需
SFC_CLKGPIO_19CLK时钟信号✅ 是
SFC_CSNGPIO_20CS/CS_N片选信号(低电平有效)✅ 是
SFC_IO0GPIO_21MOSI/SO主出从入 (写 Flash)✅ 是
SFC_IO1GPIO_22MISO/SI主入从出 (读 Flash)✅ 是

Quad SPI 模式的额外引脚(可选)

引脚名GPIO号别名用途必需*
SFC_IO2GPIO_23WP/WP_N写保护(Quad 模式)⭕ Quad SPI
SFC_IO3GPIO_24HOLD/HOLD_N暂停指令(Quad 模式)⭕ Quad SPI

说明: *Quad SPI 模式下才需要,标准 SPI 模式下这两个引脚可不连接


========================================================================================

🔗 GPIO 引脚电路连接图

========================================================================================

标准 SPI 模式连接

WS63 芯片                              NOR Flash 芯片
┌──────────────────────┐              ┌──────────────────┐
│    GPIO_19 (SFC_CLK) ├──────────────┤ CLK              │
│                      │              │                  │
│    GPIO_20 (SFC_CSN) ├──────────────┤ CS#              │
│                      │              │                  │
│    GPIO_21 (SFC_IO0) ├──────────────┤ MOSI/DO          │
│      (MOSI)          │              │                  │
│                      │              │                  │
│    GPIO_22 (SFC_IO1) ├──────────────┤ MISO/DI          │
│      (MISO)          │              │                  │
│                      │              │                  │
│         GND          ├──────────────┤ GND              │
│                      │              │                  │
│        3.3V          ├──────────────┤ VCC              │
└──────────────────────┘              └──────────────────┘

Quad SPI 模式连接(可选)

WS63 芯片                              NOR Flash 芯片
┌──────────────────────┐              ┌──────────────────┐
│    GPIO_19 (SFC_CLK) ├──────────────┤ CLK              │
│                      │              │                  │
│    GPIO_20 (SFC_CSN) ├──────────────┤ CS#              │
│                      │              │                  │
│    GPIO_21 (SFC_IO0) ├──────────────┤ IO0/MOSI         │
│                      │              │                  │
│    GPIO_22 (SFC_IO1) ├──────────────┤ IO1/MISO         │
│                      │              │                  │
│    GPIO_23 (SFC_IO2) ├──────────────┤ IO2/WP#          │
│                      │              │                  │
│    GPIO_24 (SFC_IO3) ├──────────────┤ IO3/HOLD#        │
│                      │              │                  │
│         GND          ├──────────────┤ GND              │
│                      │              │                  │
│        3.3V          ├──────────────┤ VCC              │
└──────────────────────┘              └──────────────────┘

========================================================================================

📋 快速参考:GPIO 编号到功能的映射

========================================================================================

命令行快查表

# 快速查找 GPIO 的 SFC 功能
GPIO_19 = SFC_CLK     → 时钟信号(必需)
GPIO_20 = SFC_CSN     → 片选信号(必需)
GPIO_21 = SFC_IO0     → MOSI 输出(必需)
GPIO_22 = SFC_IO1     → MISO 输入(必需)
GPIO_23 = SFC_IO2     → 写保护(Quad 模式)
GPIO_24 = SFC_IO3     → 暂停控制(Quad 模式)

代码中引用

// 在你的代码中,可以直接引用这些 GPIO 号
#define SFC_CLK_PIN     GPIO_19
#define SFC_CSN_PIN     GPIO_20
#define SFC_MOSI_PIN    GPIO_21  // SFC_IO0
#define SFC_MISO_PIN    GPIO_22  // SFC_IO1
#define SFC_WP_PIN      GPIO_23  // SFC_IO2 (Quad only)
#define SFC_HOLD_PIN    GPIO_24  // SFC_IO3 (Quad only)

========================================================================================

🔧 配置和验证步骤

========================================================================================

第1步:确认硬件连接

在焊接或连接 NOR Flash 之前,必须确认

检查项                         标准模式          Quad模式
─────────────────────────────────────────────────────────
GPIO_19 定义为 SFC_CLK        [ ] 已连接       [ ] 已连接
GPIO_20 定义为 SFC_CSN        [ ] 已连接       [ ] 已连接
GPIO_21 定义为 SFC_IO0(MOSI)  [ ] 已连接       [ ] 已连接
GPIO_22 定义为 SFC_IO1(MISO)  [ ] 已连接       [ ] 已连接
GPIO_23 定义为 SFC_IO2(WP)    N/A              [ ] 已连接
GPIO_24 定义为 SFC_IO3(HOLD)  N/A              [ ] 已连接
GND 连接                      [ ] 已连接       [ ] 已连接
VCC 3.3V 连接                 [ ] 已连接       [ ] 已连接

第2步:验证信号(用示波器)

信号          GPIO_19   GPIO_20   GPIO_21   GPIO_22
            (CLK)      (CS)      (MOSI)    (MISO)
──────────────────────────────────────────────────────
时序          ▃▂▃▂      ╔║╚║╔     ▄▅▄▅      ▄▅▄▅
频率          150MHz    脉冲      同步      同步
幅度          3.3V      3.3V      3.3V      3.3V

第3步:软件配置确认

在以下文件中定义 GPIO:

文件 1: sfc_porting.h

// 检查是否有以下定义
#define SFC_CLK_PIN      GPIO_19
#define SFC_CSN_PIN      GPIO_20
#define SFC_IO0_PIN      GPIO_21
#define SFC_IO1_PIN      GPIO_22

文件 2: board.c (或 pinctrl 文件)

// 检查是否配置了引脚映射
hal_pinctrl_config(SFC_CLK_PIN, FUNC_SFC);
hal_pinctrl_config(SFC_CSN_PIN, FUNC_SFC);
hal_pinctrl_config(SFC_IO0_PIN, FUNC_SFC);
hal_pinctrl_config(SFC_IO1_PIN, FUNC_SFC);

第4步:编译验证

# 编译时应该能够找到这些定义
gcc -I src/drivers/chips/ws63/include -c sfc.c

# 如果出现 "undefined reference",说明 GPIO 定义有问题

========================================================================================

💡 实用建议

========================================================================================

✅ 推荐方案(安全可靠)

在你的项目中,建议创建一个 gpio_mapping.h 文件:

#ifndef __GPIO_MAPPING_H__
#define __GPIO_MAPPING_H__

// ===== SFC (NOR Flash) 引脚映射 =====
// 源: src/drivers/chips/ws63/include/platform_core_rom.h
// 
// 标准 SPI 模式(必需):GPIO_19-22
// Quad SPI 模式(可选):GPIO_23-24

#define SFC_CLK_GPIO        GPIO_19     // Serial Flash Clock
#define SFC_CSN_GPIO        GPIO_20     // Chip Select (active low)
#define SFC_IO0_GPIO        GPIO_21     // MOSI (Master Out, Slave In)
#define SFC_IO1_GPIO        GPIO_22     // MISO (Master In, Slave Out)
#define SFC_IO2_GPIO        GPIO_23     // Write Protect (Quad mode only)
#define SFC_IO3_GPIO        GPIO_24     // HOLD (Quad mode only)

// ===== GPIO 验证宏 =====
// 编译时验证使用的GPIO是否正确

#ifdef CONFIG_SFC_SUPPORT_QUAD
    // Quad SPI 需要 6 条线
    #define SFC_PINS_COUNT  6
#else
    // 标准 SPI 需要 4 条线
    #define SFC_PINS_COUNT  4
#endif

#endif // __GPIO_MAPPING_H__

⚠️ 常见错误

错误原因如何避免
Flash ID 读不出 (0xFFFFFFFF)GPIO_21 (MOSI) 未连接检查 GPIO_21 到 Flash IO0
Flash ID 全是 0x000000GPIO_19 (CLK) 未连接检查 GPIO_19 到 Flash CLK
SPI 信号紊乱GPIO_20 (CS) 未拉低检查 GPIO_20 到 Flash CS#
写入失败GPIO_23 (WP) 被拉低Quad 模式需要 WP 拉高
读写很慢使用了标准模式而非 QuadQuad 模式 GPIO_23/24 需配置

========================================================================================

🔍 如何从代码中验证 GPIO

========================================================================================

方法 1:查看源代码定义

# 查找 GPIO 定义的位置
grep -r "SFC_CLK.*GPIO" src/drivers/chips/ws63/

# 查找引脚映射文件
find . -name "*pinctrl*" -o -name "*pin_config*"

方法 2:追踪初始化代码

// sfc.c 中的初始化函数
errcode_t uapi_sfc_init(sfc_flash_config_t *config)
{
    // 这里会调用引脚初始化
    sfc_port_init();  // 看这个函数
    // ...
}

// sfc_porting.c 中
void sfc_port_init(void)
{
    // 这里会设置 GPIO_19-24 为 SFC 模式
    hal_pinctrl_set_alt_mode(GPIO_19, ALT_MODE_SFC);  // CLK
    hal_pinctrl_set_alt_mode(GPIO_20, ALT_MODE_SFC);  // CS
    // ...
}

方法 3:使用 debug 日志

// 在初始化时添加调试输出
printf("SFC GPIO Configuration:\n");
printf("  CLK:  GPIO_%d\n", SFC_CLK);      // 应输出 19
printf("  CS:   GPIO_%d\n", SFC_CSN);      // 应输出 20
printf("  IO0:  GPIO_%d\n", SFC_IO0);      // 应输出 21
printf("  IO1:  GPIO_%d\n", SFC_IO1);      // 应输出 22

========================================================================================

📊 WS63 芯片的全部GPIO引脚分布

========================================================================================

GPIO 功能分布表

GPIO号    |  专属功能        |  复用功能              | SFC 用途
──────────┼──────────────────┼─────────────────────────┼──────────────
GPIO_0    |  通用 I/O        |  UART, PWM等           | -
GPIO_1    |  通用 I/O        |  SPI1, PWM等           | -
...       |  ...             |  ...                   | -
GPIO_19   |  **SFC_CLK**     |  时钟信号专用          | ✅ 时钟
GPIO_20   |  **SFC_CSN**     |  片选信号专用          | ✅ 片选
GPIO_21   |  **SFC_IO0**     |  数据线 0              | ✅ MOSI
GPIO_22   |  **SFC_IO1**     |  数据线 1              | ✅ MISO
GPIO_23   |  **SFC_IO2**     |  数据线 2(Quad)      | ⭕ WP
GPIO_24   |  **SFC_IO3**     |  数据线 3(Quad)      | ⭕ HOLD

注意:GPIO_19-24 是硬核 SFC 专用引脚,不能改,不支持复用到其他功能


========================================================================================

测试 GPIO 连接的快速脚本

========================================================================================

/**
 * 快速验证 SFC GPIO 连接
 * 编译: gcc -o test_gpio test_gpio.c
 * 运行: ./test_gpio
 */

#include <stdio.h>
#include "sfc.h"
#include "hal_gpio.h"

#define TEST_GPIO_PIN     GPIO_19  // 测试一个 SFC GPIO

int main(void) {
    printf("Testing SFC GPIO connections...\n");
    
    // 使用硬件 ID 来验证初始化
    uint32_t flash_id;
    errcode_t ret = hal_sfc_get_flash_id(&flash_id);
    
    if (ret == ERRCODE_SUCC && flash_id != 0xFFFFFFFF && flash_id != 0x000000) {
        printf("✅ GPIO 连接正常!\n");
        printf("   Flash ID: 0x%06X\n", flash_id);
        
        // 打印使用的 GPIO
        printf("   GPIO_19 (SFC_CLK):  OK\n");
        printf("   GPIO_20 (SFC_CSN):  OK\n");
        printf("   GPIO_21 (SFC_IO0):  OK\n");
        printf("   GPIO_22 (SFC_IO1):  OK\n");
        
        return 0;
    } else {
        printf("❌ GPIO 连接有问题!\n");
        printf("   Flash ID: 0x%08X (异常值)\n", flash_id);
        printf("   检查清单:\n");
        printf("   [ ] GPIO_19 连接到 Flash CLK\n");
        printf("   [ ] GPIO_20 连接到 Flash CS#\n");
        printf("   [ ] GPIO_21 连接到 Flash MOSI\n");
        printf("   [ ] GPIO_22 连接到 Flash MISO\n");
        
        return -1;
    }
}

========================================================================================

总结

========================================================================================

✅ 确认的 GPIO 映射

┌─────────────────────────────────────────────┐
│  WS63 NOR Flash/SFC 专用 GPIO 引脚          │
├─────────────────────────────────────────────┤
│  GPIO_19 ← CLK   (时钟)                    │
│  GPIO_20 ← CSN   (片选)                    │
│  GPIO_21 ← IO0   (MOSI/写)                 │
│  GPIO_22 ← IO1   (MISO/读)                 │
│  GPIO_23 ← IO2   (WP/写保护, Quad only)    │
│  GPIO_24 ← IO3   (HOLD, Quad only)        │
└─────────────────────────────────────────────┘

这些 GPIO 引脚是 硬核专用引脚不能更改。如果你的开发板上 NOR Flash 连接到了不同的引脚,说明:

  1. 板子设计有问题,或
  2. 代码中的引脚映射有问题

建议用示波器观察实际的信号,或查看你的板子的原理图确认。