flexspi 基础结构体分析
/*! @brief FLEXSPI 初始化配置结构体 */typedef struct _flexspi_config {/*!< 选择读取 FLASH 使用的采样时钟源 */flexspi_read_sample_clock_t rxSampleClock;/*!< 是否使能 SCK 自由运行输出 */bool enableSckFreeRunning;/*!< 是否使能 PORT A 和 PORT B 的数据引脚组合 (SIOA[3:0] 和 SIOB[3:0]) 以支持FLASH 的 8 位模式 */bool enableCombination;/*!< 是否使能 doze 模式 */bool enableDoze;/*!< 是否使能 为半速率命令而对时钟 2 分频 的功能 */bool enableHalfSpeedAccess;/*!< 是否使能 SCKB 用作 SCKA 的差分时钟,当使能时, PORT B 的 FLASH 无法访问 */bool enableSckBDiffOpt;/*!< 是否使能对所有连接的设备使用同样的配置,当使能时,FLSHA1CRx 寄存器的配置会应用到所有设备 */bool enableSameConfigForAll;/*!< 命令序列执行的等待超时周期, ahbGrantTimeoutCyle*1024 个串行根时钟周期后超时 */uint16_t seqTimeoutCycle;/*!< IP 命令授予等待超时周期, ipGrantTimeoutCycle*1024 个 AHB 时钟周期后超时 */uint8_t ipGrantTimeoutCycle;/*!< FLEXSPI IP 发送水印值 */uint8_t txWatermark;/*!< FLEXSPI 接收水印值 */uint8_t rxWatermark;struct {/*!< 使能 AHB 总线对 IP TX FIFO 的写访问 */bool enableAHBWriteIpTxFifo;/*!< 使能 AHB 总线对 IP RX FIFO 的写访问 */bool enableAHBWriteIpRxFifo;/*!< AHB 命令授予等待超时周期,在 ahbGrantTimeoutCyle*1024 个 AHB 时钟周期后超时 */uint8_t ahbGrantTimeoutCycle;/*!< AHB 读写访问超时周期, ahbBusTimeoutCycle*1024 个 AHB 时钟后超时 */uint16_t ahbBusTimeoutCycle;/*!< 在暂停命令序列恢复之前空闲状态的等待周期, ahbBusTimeoutCycle 个 AHB时钟后超时 */uint8_t resumeWaitCycle;/*!< AHB 缓冲区信息 */flexspi_ahbBuffer_config_t buffer[FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT];/*!< 是否使能当 FLEXSPI 返回停止模式响应时自动清除 AHB RX 和 TX 缓冲 */bool enableClearAHBBufferOpt;/*!< 是否使能 AHB 预读取特性,当使能时, FLEXSPI 会读取比当前 AHB 突发读取更多的数据 */bool enableAHBPrefetch;/*!< 是否使能 AHB 缓冲写访问的功能,当使能时, FLEXSPI 会在等待命令执行完成前就返回 */bool enableAHBBufferable;/*!< 是否使能 AHB 总线缓冲读访问的功能 */bool enableAHBCachable;} ahbConfig;} flexspi_config_t;
1. flexspi_read_sample_clock_t rxSampleClock
- 功能:指定 FLEXSPI 读取 FLASH 数据时的采样时钟源,直接影响数据接收的稳定性,是高速通讯的关键配置。
- 参数类型:枚举类型(flexspi_read_sample_clock_t),常见枚举值包括:
- kFLEXSPI_ReadSampleClk_LoopbackFromDqsPad:从 DQS 引脚回环采样(适用于带 DQS 引脚的高速 FLASH,如 Octal SPI FLASH);
- kFLEXSPI_ReadSampleClk_LoopbackFromSckPad:从 SCK 引脚回环采样(适用于普通 SPI FLASH,通过 SCK 时钟同步采样);
- kFLEXSPI_ReadSampleClk_ExternalInputFromDqsPad:外部输入采样时钟(从 DQS 引脚接入外部时钟,特殊场景使用)。
2. bool enableSckFreeRunning
- 功能:控制 SCK 时钟是否 “自由运行”(即 CS 信号无效时,SCK 是否持续输出时钟)。
- true:CS 无效时 SCK 仍持续运行,可减少时钟启停的延迟,提升连续数据传输效率(适用于高频次、连续的 FLASH 操作,如固件升级);
- false:CS 无效时 SCK 立即停止,降低功耗(适用于低功耗场景,如电池供电设备)。
3. bool enableCombination
- 功能:使能 PORT A 与 PORT B 的数据引脚组合,以支持 FLASH 的 8 位模式(如 “4+4” 引脚组合的 8 位 SPI 模式)。
- true:启用 SIOA [3:0](PORT A)与 SIOB [3:0](PORT B)引脚组合,数据总线宽度扩展至 8 位,传输速率翻倍;
- false:仅使用单 PORT 引脚(如仅 SIOA [3:0]),支持 1/2/4 位模式。
- 注意事项:需 FLASH 硬件支持 8 位模式,且 MCU 引脚需正确配置为 FLEXSPI 功能;启用后 PORT B 无法再用于其他外设。
4. bool enableDoze
- 功能:控制 FLEXSPI 在 MCU 进入 “Doze 模式”(休眠的一种,核心时钟降低但外设可运行)时是否继续工作。
- true:Doze 模式下 FLEXSPI 保持运行,可继续处理 FLASH 数据(适用于需后台刷新数据的场景);
- false:Doze 模式下 FLEXSPI 暂停,降低整体功耗。
5. bool enableHalfSpeedAccess
- 功能:使能 “半速率命令” 功能,即对特定命令的时钟进行 2 分频。
- true:执行指定命令(如 FLASH 的擦除、写命令)时,SCK 时钟自动减半,提升低速命令的稳定性(部分 FLASH 的擦写命令对时钟频率敏感);
- false:所有命令使用相同的 SCK 时钟频率。
6. bool enableSckBDiffOpt
- 功能:将 SCKB 引脚配置为 SCKA 的差分时钟,用于高速差分通讯。
- true:SCKA 为差分时钟正端,SCKB 为负端,抗干扰能力增强(适用于长距离、高速传输场景);
- false:SCKA、SCKB 独立作为普通 SCK 时钟,分别驱动不同 PORT 的 FLASH。
- 限制:启用后 PORT B 的 FLASH 无法访问,因为 SCKB 被占用为差分时钟。
7. bool enableSameConfigForAll
- 功能:控制是否对所有连接的 FLEXSPI 设备使用相同的配置。
- true:仅需配置FLSHA1CRx寄存器,配置自动应用到所有 FLEXSPI 设备(适用于多设备型号、参数完全一致的场景);
- false:需为每个设备单独配置对应的FLSHAxCRx寄存器(适用于多设备型号不同的场景)。
8. uint16_t seqTimeoutCycle
- 功能:设置命令序列执行的超时周期,防止因 FLASH 异常导致 FLEXSPI 卡死。
- 计算方式:超时时间 = seqTimeoutCycle * 1024 个串行根时钟周期。
- 例:串行根时钟为 100MHz(周期 10ns),seqTimeoutCycle=10时,超时时间 = 10102410ns=102.4μs。
9. uint8_t ipGrantTimeoutCycle
- 功能:设置 FLEXSPI IP 核申请总线权限的超时周期,防止总线仲裁死锁。
- 计算方式:超时时间 = ipGrantTimeoutCycle * 1024 个AHB 时钟周期。
- 作用:当 FLEXSPI 向 AHB 总线申请访问权限时,若超过该时间未获得权限,将触发超时中断,避免无限等待。
10. uint8_t txWatermark/uint8_t rxWatermark
- 功能:设置 FLEXSPI 发送 / 接收 FIFO 的 “水印阈值”,用于触发 FIFO 中断。
- txWatermark:当发送 FIFO 中的数据量≤该阈值时,触发发送 FIFO 空中断(提示需补充数据);
- rxWatermark:当接收 FIFO 中的数据量≥该阈值时,触发接收 FIFO 满中断(提示需读取数据)。
二、嵌套结构体ahbConfig(AHB 总线接口配置)
ahbConfig子结构体专门配置 FLEXSPI 与 AHB 总线的交互参数,AHB 是 MCU 内部高速总线,FLEXSPI 通过 AHB 接口与 CPU、DMA 等核心单元通讯。
1. bool enableAHBWriteIpTxFifo/bool enableAHBWriteIpRxFifo
- 功能:允许 AHB 总线直接读写 FLEXSPI 的发送 / 接收 FIFO(默认仅 FLEXSPI IP 核可访问 FIFO)。
- true:AHB 总线(如 CPU、DMA)可直接向发送 FIFO 写数据,或从接收 FIFO 读数据,提升数据传输效率(适用于 DMA 驱动的高速数据传输);
- false:仅 FLEXSPI IP 核可访问 FIFO,安全性更高但灵活性降低。
2. uint8_t ahbGrantTimeoutCycle
- 功能:设置 AHB 总线申请 FLEXSPI 访问权限的超时周期,与ipGrantTimeoutCycle对应,解决总线双向仲裁的超时问题。
- 计算方式:超时时间 = ahbGrantTimeoutCycle * 1024 个AHB 时钟周期。
3. uint16_t ahbBusTimeoutCycle
- 功能:设置 AHB 总线与 FLEXSPI 交互的超时周期,防止 FLEXSPI 响应异常导致 AHB 总线阻塞。
- 计算方式:超时时间 = ahbBusTimeoutCycle * 1024 个AHB 时钟周期。
- 应用场景:当 FLEXSPI 因 FLASH 故障无法响应 AHB 请求时,超过该时间将触发总线超时,保护 CPU 不被卡死。
4. uint8_t resumeWaitCycle
- 功能:设置 FLEXSPI 从 “命令暂停状态” 恢复时的等待周期,用于稳定总线时序。
- 作用:当 FLEXSPI 暂停命令执行(如响应 AHB 中断)后,恢复执行前需等待指定 AHB 时钟周期,确保 FLASH 与总线时序同步。
- 配置建议:高频 AHB 总线(如 200MHz 以上)建议设为 2~4 个周期,低频总线可设为 1 个周期。
5. flexspi_ahbBuffer_config_t buffer[FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT]
- 功能:AHB 缓冲区配置数组,FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT为 MCU 支持的 AHB 缓冲区数量(通常为 2~4 个),每个缓冲区通过flexspi_ahbBuffer_config_t结构体配置。
- 配套结构体flexspi_ahbBuffer_config_t核心成员(通常包含):
- bufferSize:缓冲区大小(单位:字节);
- bufferAddr:缓冲区在 AHB 总线上的地址;
- enableBuffer:是否启用该缓冲区。
- 作用:通过多缓冲区并行处理 AHB 读写请求,减少总线等待时间,提升高速数据传输效率(如 Octal SPI FLASH 的固件加载)。
6. bool enableClearAHBBufferOpt
- 功能:当 FLEXSPI 返回 “停止模式响应”(如 FLASH 进入低功耗停止模式)时,自动清除 AHB 接收 / 发送缓冲区。
- true:自动清除缓冲区,避免残留数据导致后续操作错误;
- false:需手动清除缓冲区,适用于需保留中间数据的场景。
7. bool enableAHBPrefetch
- 功能:使能 AHB 预读取特性,提升连续读取效率。
- true:FLEXSPI 会自动读取比当前 AHB 突发读取更多的数据(如 CPU 请求读取 4 字节,FLEXSPI 预读取 8 字节),并缓存到 AHB 缓冲区,后续 CPU 读取时可直接从缓冲区获取,减少 FLASH 访问次数;
- false:仅读取 CPU 明确请求的数据,适用于随机读取场景。
8. bool enableAHBBufferable/bool enableAHBCachable
- 功能:配置 AHB 总线的 “缓冲” 与 “缓存” 属性,是 AHB 总线协议的标准配置:
- enableAHBBufferable:true时,AHB 写操作可通过总线缓冲器批量执行(而非立即写入 FLEXSPI),提升 CPU 效率;
- enableAHBCachable:true时,AHB 读操作的数据可缓存到 CPU 缓存中,后续相同地址读取无需访问 FLEXSPI,降低延迟。