[应用方案] 基于 APM32F411 的 QSPI 接口简介与优势解析

[复制链接]
1239|1
 楼主| a976209770 发表于 2024-12-15 22:43 | 显示全部楼层 |阅读模式
1. 什么是 QSPI?

QSPI(Quad Serial Peripheral Interface)是 APM32F411 提供的一种增强型 SPI 接口,相比传统 SPI 接口,QSPI 支持多通道数据传输,可在时钟频率不变的情况下显著提升数据吞吐量。该接口被广泛应用于与高速存储设备(如 NOR Flash 和 NAND Flash)的通信,特别适用于固件存储、数据记录和高速读取等场景。

2. APM32F411 中 QSPI 的特点


特性SPI(Serial Peripheral Interface)QSPI(Quad Serial Peripheral Interface)
数据传输模式单通道(1-bit 数据线)四通道(4-bit 数据线,可同时发送/接收数据)
通信速率较低,仅支持 1-bit 数据传输更高,支持 4-bit 数据传输,速率是 SPI 的 4 倍
接口引脚数量通常 4 个(CLK、MOSI、MISO、NSS)通常 6 个(CLK、NCS、IO0、IO1、IO2、IO3)
数据吞吐量较低,受限于单通道数据传输较高,支持多通道数据并行传输
典型应用低速通信设备(传感器、DAC、ADC 等)高速存储设备(外部 Flash、存储扩展等)
功耗较低功耗略高,但相对于其吞吐量提升,能效比更高

3. APM32F411 的硬件资源

  • QSPI 引脚配置:
    • QSPI_CLK:PB1
    • QSPI_NCS:PB6
    • QSPI_IO0:PA7
    • QSPI_IO1:PA6
    • QSPI_IO2:PC4
    • QSPI_IO3:PC5
  • QSPI 支持模式:
    • 标准 SPI 模式:单通道通信,与传统 SPI 兼容。
    • Dual-SPI 模式:双通道通信,速率提升一倍。
    • Quad-SPI 模式:四通道通信,速率提升至传统 SPI 的四倍。

4. QSPI 初始化与配置

(1) QSPI GPIO 引脚配置
  1. void QSPI_GPIO_Config(void)
  2. {
  3.     GPIO_Config_T gpioConfig;

  4.     // 配置 QSPI_CLK
  5.     gpioConfig.pin = GPIO_PIN_1;
  6.     gpioConfig.mode = GPIO_MODE_AF_PP;
  7.     gpioConfig.speed = GPIO_SPEED_HIGH;
  8.     GPIO_Config(GPIOB, &gpioConfig);

  9.     // 配置 QSPI_NCS
  10.     gpioConfig.pin = GPIO_PIN_6;
  11.     GPIO_Config(GPIOB, &gpioConfig);

  12.     // 配置 QSPI_IO0 至 QSPI_IO3
  13.     gpioConfig.pin = GPIO_PIN_7;
  14.     GPIO_Config(GPIOA, &gpioConfig);

  15.     gpioConfig.pin = GPIO_PIN_6;
  16.     GPIO_Config(GPIOA, &gpioConfig);

  17.     gpioConfig.pin = GPIO_PIN_4;
  18.     GPIO_Config(GPIOC, &gpioConfig);

  19.     gpioConfig.pin = GPIO_PIN_5;
  20.     GPIO_Config(GPIOC, &gpioConfig);
  21. }

(2) QSPI 外设初始化
  1. void QSPI_Init(void)
  2. {
  3.     QSPI_Config_T qspiConfig;

  4.     // 初始化 QSPI 配置结构体
  5.     QSPI_ConfigStructInit(&qspiConfig);

  6.     // 设置时钟相位和极性
  7.     qspiConfig.clockPhase = QSPI_CLKPHA_2EDGE;
  8.     qspiConfig.clockPolarity = QSPI_CLKPOL_LOW;

  9.     // 配置帧格式为 Quad 模式
  10.     qspiConfig.frameFormat = QSPI_FRF_QUAD;

  11.     // 设置数据帧大小为 8 位
  12.     qspiConfig.dataFrameSize = QSPI_DFS_8BIT;

  13.     // 设置时钟分频系数(根据系统时钟调整)
  14.     qspiConfig.clockDiv = 4;

  15.     // 初始化 QSPI
  16.     QSPI_Config(&qspiConfig);

  17.     // 启用 QSPI
  18.     QSPI_Enable();
  19. }

5. QSPI 数据传输操作

(1) 写入数据到 Flash
  1. void QSPI_WriteData(uint32_t address, uint8_t *data, uint16_t size)
  2. {
  3.     QSPI_ConfigAddrLen(QSPI_ADDR_LEN_24BIT); // 设置地址长度
  4.     QSPI_ConfigInstLen(QSPI_INST_LEN_8BIT); // 设置指令长度
  5.     QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_STANDARD); // 设置指令和地址传输类型

  6.     // 写入命令
  7.     QSPI_TxData(WRITE_COMMAND);

  8.     // 写入地址
  9.     QSPI_TxData((address >> 16) & 0xFF);
  10.     QSPI_TxData((address >> 8) & 0xFF);
  11.     QSPI_TxData(address & 0xFF);

  12.     // 写入数据
  13.     for (uint16_t i = 0; i < size; i++)
  14.     {
  15.         QSPI_TxData(data[i]);
  16.     }
  17. }
(2) 从 Flash 读取数据
  1. void QSPI_ReadData(uint32_t address, uint8_t *data, uint16_t size)
  2. {
  3.     QSPI_ConfigAddrLen(QSPI_ADDR_LEN_24BIT);
  4.     QSPI_ConfigInstLen(QSPI_INST_LEN_8BIT);
  5.     QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_STANDARD);

  6.     // 发送读取命令
  7.     QSPI_TxData(READ_COMMAND);

  8.     // 发送地址
  9.     QSPI_TxData((address >> 16) & 0xFF);
  10.     QSPI_TxData((address >> 8) & 0xFF);
  11.     QSPI_TxData(address & 0xFF);

  12.     // 读取数据
  13.     for (uint16_t i = 0; i < size; i++)
  14.     {
  15.         data[i] = QSPI_RxData();
  16.     }
  17. }
6. 应用场景与优势

(1) 外部存储扩展通过 QSPI,可与高速 NOR Flash 存储器实现高效通信,支持大数据量的读取和存储需求。

(2) 高吞吐量需求适用于需要高速数据传输的场景,例如音视频数据处理、大容量固件更新等。

(3) 高效与低功耗结合通过多通道并行传输,降低总通信时间,从而减少功耗。

7. 总结

基于 APM32F411 的 QSPI 接口,提供了灵活的配置方式和强大的性能支持。通过合理的硬件设计和软件配置,可以充分发挥其在高速数据传输和外部存储中的优势,满足现代嵌入式应用的需求。

LEDyyds 发表于 2024-12-16 15:00 | 显示全部楼层
QSPI最大的优势就是数据并行,传输速度快
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部