1. 串行Flash基础与读取模式概述
串行NOR Flash作为一种非易失性存储器,在现代嵌入式系统中扮演着关键角色。与并行NOR Flash相比,串行版本通过精简的接口(通常为SPI或QSPI)实现了更小的封装尺寸和更低的引脚数要求,这使得它成为空间受限应用的理想选择。在嵌入式系统启动(XIP,eXecute In Place)和固件存储场景中,串行NOR Flash因其随机访问能力和可靠性而备受青睐。
传统的串行Flash读取操作遵循严格的协议序列:每次读取都需要完整的命令周期(Command Phase)、地址周期(Address Phase)、模式周期(Mode Phase)、空周期(Dummy Cycle)和数据输出周期(Data Phase)。这种标准模式被称为Non-Continuous read模式,其特点是每次CS(Chip Select)信号有效期间都必须完整发送命令序列,即使连续读取相邻地址的数据也不例外。
2. Continuous read模式的核心原理
2.1 基本工作机制
Continuous read模式的核心创新在于优化了命令传输机制。在该模式下,只有第一次读取操作需要发送完整的命令序列(包括命令码、地址等),后续的读取操作可以省略命令码传输阶段,直接通过CS信号的再次有效来触发新的读取周期。这种机制显著减少了总线上的冗余数据传输,具体表现为:
- 命令序列精简:后续读取操作省去了8个SCK周期的命令码传输
- 时序效率提升:在100MHz时钟下,单次命令传输节省约80ns时间
- 总线利用率提高:更多时钟周期用于有效数据传输而非协议开销
2.2 模式切换与控制
进入Continuous read模式需要通过特定的模式字节配置。在Fast Read Quad I/O命令序列中,MODE周期(通常为8位)的高4位被用于模式控制。以主流Flash芯片为例:
- Cypress S25FS系列:M[7:4]=0xA0进入Continuous模式
- Winbond W25Q系列:M[5:4]=2'b10启用该模式
- ISSI IS25WP系列:M[7:4]=0xA0激活AXI模式(即Continuous read)
模式切换通常发生在第一次读取的MODE周期,之后Flash控制器会维持这个状态直到收到退出指令或发生复位。退出机制各厂商略有不同,华邦芯片推荐发送0xFF作为临时命令码来确保可靠退出。
3. 硬件实现与控制器支持
3.1 FlexSPI的XIP Enhanced Mode
恩智浦FlexSPI控制器通过XIP Enhanced Mode原生支持Continuous read特性。其关键实现机制包括:
- LUT序列优化:在查找表(LUT)中配置特殊的跳转指令(JMP_ON_CS)
- 命令缓存:首次命令码被自动存储在控制器内部寄存器
- 时序自适应:控制器自动调整后续读取的时序相位
典型配置示例(i.MX RT1170 FlexSPI):
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18), [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xA0, DUMMY_SDR, FLEXSPI_4PAD, 0x04), [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, JMP_ON_CS, FLEXSPI_1PAD, 0x01),3.2 性能提升实测数据
在i.MXRT1170-EVK开发板上实测IS25WP128 Flash:
- 随机小数据块(16-32B)读取:吞吐量提升18-22%
- XIP代码执行:平均加速约15%(配合预取缓冲)
- 功耗表现:总线活跃时间减少带来约5%的功耗降低
4. 工程实践中的关键考量
4.1 兼容性检查清单
在项目中启用Continuous read前,必须确认:
- Flash型号明确支持该特性(查阅数据手册"Continuous read"章节)
- 控制器硬件兼容(如FlexSPI版本支持XIP Enhanced Mode)
- 丝印标识验证(如华邦芯片"IM"后缀支持,"IQ"不支持)
4.2 配置注意事项
- 模式字节配置:必须严格遵循Flash厂商定义的MODE值
- 时序参数调整:退出Continuous模式时需要增加1-2个等待周期
- 异常处理:在DMA传输中断场景下需显式退出该模式
- 温度影响:高温环境下建议增加DUMMY周期确保时序裕量
4.3 典型问题排查
问题现象:启用Continuous read后偶发数据错误
排查步骤:
- 确认初始模式字节正确写入(逻辑分析仪抓取MODE周期)
- 检查CS信号质量(上升/下降时间需<5ns)
- 验证电源稳定性(VCC波动应<±3%)
- 调整Dummy Cycle数量(通常增加1-2个周期可解决)
5. 行业应用与选型建议
5.1 适用场景分析
Continuous read模式特别适合以下应用:
- 实时操作系统(RTOS)的上下文切换
- 图形界面频繁的帧缓冲读取
- 音频流处理中的波形数据获取
- 机器学习模型的参数加载
5.2 主流芯片对比
| 型号 | 模式字节 | 最大频率 | 退出方式 | 特殊说明 |
|---|---|---|---|---|
| S25FS128S | 0xA0 | 133MHz | 模式字节更改 | 需配置CR3寄存器 |
| W25Q256JW-DTR | M[5:4]=10 | 166MHz | 发送0xFF命令 | 支持DTR模式 |
| IS25WP128 | 0xA0 | 104MHz | CS拉高>100ns | 兼容AXI协议 |
| GD25Q256E | M[5:4]=10 | 120MHz | 硬件复位 | 国产替代首选 |
5.3 设计取舍考量
虽然Continuous read能提升性能,但在以下情况建议保持标准模式:
- 多主设备共享Flash总线时
- 使用旧款Flash控制器(如不支持JMP_ON_CS)
- 工作环境存在强电磁干扰
- 需要频繁切换读/写操作的场景
在实际项目中,我通常会先在开发阶段使用Continuous模式进行性能测试,然后根据实际稳定性测试结果决定最终配置。特别是在汽车电子等严苛环境中,有时宁愿牺牲部分性能也要确保绝对的数据可靠性。