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 引脚配置void QSPI_GPIO_Config(void)
{
GPIO_Config_T gpioConfig;
// 配置 QSPI_CLK
gpioConfig.pin = GPIO_PIN_1;
gpioConfig.mode = GPIO_MODE_AF_PP;
gpioConfig.speed = GPIO_SPEED_HIGH;
GPIO_Config(GPIOB, &gpioConfig);
// 配置 QSPI_NCS
gpioConfig.pin = GPIO_PIN_6;
GPIO_Config(GPIOB, &gpioConfig);
// 配置 QSPI_IO0 至 QSPI_IO3
gpioConfig.pin = GPIO_PIN_7;
GPIO_Config(GPIOA, &gpioConfig);
gpioConfig.pin = GPIO_PIN_6;
GPIO_Config(GPIOA, &gpioConfig);
gpioConfig.pin = GPIO_PIN_4;
GPIO_Config(GPIOC, &gpioConfig);
gpioConfig.pin = GPIO_PIN_5;
GPIO_Config(GPIOC, &gpioConfig);
}
(2) QSPI 外设初始化
void QSPI_Init(void)
{
QSPI_Config_T qspiConfig;
// 初始化 QSPI 配置结构体
QSPI_ConfigStructInit(&qspiConfig);
// 设置时钟相位和极性
qspiConfig.clockPhase = QSPI_CLKPHA_2EDGE;
qspiConfig.clockPolarity = QSPI_CLKPOL_LOW;
// 配置帧格式为 Quad 模式
qspiConfig.frameFormat = QSPI_FRF_QUAD;
// 设置数据帧大小为 8 位
qspiConfig.dataFrameSize = QSPI_DFS_8BIT;
// 设置时钟分频系数(根据系统时钟调整)
qspiConfig.clockDiv = 4;
// 初始化 QSPI
QSPI_Config(&qspiConfig);
// 启用 QSPI
QSPI_Enable();
}
5. QSPI 数据传输操作
(1) 写入数据到 Flashvoid QSPI_WriteData(uint32_t address, uint8_t *data, uint16_t size)
{
QSPI_ConfigAddrLen(QSPI_ADDR_LEN_24BIT); // 设置地址长度
QSPI_ConfigInstLen(QSPI_INST_LEN_8BIT); // 设置指令长度
QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_STANDARD); // 设置指令和地址传输类型
// 写入命令
QSPI_TxData(WRITE_COMMAND);
// 写入地址
QSPI_TxData((address >> 16) & 0xFF);
QSPI_TxData((address >> 8) & 0xFF);
QSPI_TxData(address & 0xFF);
// 写入数据
for (uint16_t i = 0; i < size; i++)
{
QSPI_TxData(data[i]);
}
}
(2) 从 Flash 读取数据
void QSPI_ReadData(uint32_t address, uint8_t *data, uint16_t size)
{
QSPI_ConfigAddrLen(QSPI_ADDR_LEN_24BIT);
QSPI_ConfigInstLen(QSPI_INST_LEN_8BIT);
QSPI_ConfigInstAddrType(QSPI_INST_ADDR_TYPE_STANDARD);
// 发送读取命令
QSPI_TxData(READ_COMMAND);
// 发送地址
QSPI_TxData((address >> 16) & 0xFF);
QSPI_TxData((address >> 8) & 0xFF);
QSPI_TxData(address & 0xFF);
// 读取数据
for (uint16_t i = 0; i < size; i++)
{
data[i] = QSPI_RxData();
}
}
6. 应用场景与优势
(1) 外部存储扩展通过 QSPI,可与高速 NOR Flash 存储器实现高效通信,支持大数据量的读取和存储需求。
(2) 高吞吐量需求适用于需要高速数据传输的场景,例如音视频数据处理、大容量固件更新等。
(3) 高效与低功耗结合通过多通道并行传输,降低总通信时间,从而减少功耗。
7. 总结
基于 APM32F411 的 QSPI 接口,提供了灵活的配置方式和强大的性能支持。通过合理的硬件设计和软件配置,可以充分发挥其在高速数据传输和外部存储中的优势,满足现代嵌入式应用的需求。
|