当前位置: 首页 > news >正文

赛灵思ZYNQ官方文档UG585自学翻译笔记:Quad-SPl Flash 闪存控制器

  1. 一段话总结:Xilinx 的 Quad-SPI 闪存控制器是 PS 中 IOP 的一部分,用于访问多比特串行闪存,支持I/O 模式、线性寻址模式和传统 SPI 模式三种操作模式,可连接 1 或 2 个闪存设备,有多种 I/O 配置。其具备32 位 AXI 接口(线性模式)和 32 位 APB 接口(I/O 模式) 等特性,支持多种读写命令,且在不同模式下有特定的配置、操作流程及寄存器设置,同时涉及时钟、复位和 MIO 接口等系统功能配置。

    • XILINX 四通道 SPI 闪存控制器

      第 12 章

      12.1 概述

      四通道 SPI(Quad-SPI)闪存控制器是位于处理系统(PS)内的输入 / 输出外设(IOP)的一部分,用于访问多比特串行闪存设备,适用于高吞吐量和低引脚数的应用场景。

      该控制器有三种工作模式:I/O 模式、线性寻址模式和传统 SPI 模式。在 I/O 模式下,软件与闪存设备协议紧密交互,通过四个 TXD 寄存器向控制器写入闪存命令和数据,并从 RXD 寄存器读取闪存设备返回的数据。

      线性寻址模式采用部分设备操作,消除了 I/O 模式下读取闪存所需的软件开销。此模式中,硬件负责向闪存发出命令,并控制数据从闪存总线传输至 AXI 接口,控制器对 AXI 接口上的内存请求作出响应,如同闪存在充当只读存储器(ROM)。在传统模式下,QSPI 控制器作为普通 SPI 控制器运行。

      控制器可与 1 个或 2 个闪存设备连接。两个设备可并行连接以实现 8 位性能,或采用堆叠式 4 位排列以减少引脚数量,两种设备组合方式如图 12-1 所示。

      12.1.1 特性
    • 用于线性寻址模式传输的 32 位 AXI 接口;
    • 用于 I/O 模式传输的 32 位 APB 接口;
    • 支持 Micron 和 Spansion 闪存的可编程总线协议;
    • 传统 SPI 及可扩展性能:1x、2x、4x、8x I/O 宽度;
    • 灵活的 I/O 配置:
      • 单片选(SS)4 位 I/O 闪存接口模式;
      • 双片选 8 位并行 I/O 闪存接口模式;
      • 双片选 4 位堆叠 I/O 闪存接口模式;
      • 单 SS 传统 SPI 接口;
    • 每个设备 16MB 寻址空间(两个设备共 32MB);
    • I/O 和线性模式下支持的设备密度最高为 128Mb,I/O 模式还支持大于 128Mb 的密度;
    • I/O 模式(闪存命令和数据):
      • 软件发出指令并管理闪存操作;
      • 支持 FIFO 控制中断;
      • 63 字接收 FIFO(RxFIFO)、63 字发送 FIFO(TxFIFO);
    • 线性寻址模式(可执行读访问):
      • 控制器解析内存读写操作;
      • AXI 端口最多缓冲 4 个读请求;
      • 支持 AXI 递增和环绕地址功能。
    • 12.1.2 系统视角
    • 四通道 SPI 闪存控制器是 IOP 的一部分,通过 MIO(多功能 I/O)与外部 SPI 闪存连接,如图 12-1 所示,支持 1 个或 2 个存储设备。

      线性地址模式的地址映射和设备匹配

      使用单个设备时,直接内存读取的地址映射从 FC00_0000 开始,最大到 FCFF_FFFF(16MB)。双设备系统的地址映射取决于存储设备和 I/O 配置,且双设备系统中,四通道 SPI 设备需来自同一厂商以保证协议一致。

      8 位并行 I/O 配置还要求设备容量相同,其地址映射从 FC00_0000 开始,到合并内存容量对应的地址为止,最大到 FDFF_FFFF(32MB)。

      在 4 位堆叠 I/O 配置中,设备容量可不同,但协议必须一致。若使用两个不同容量的设备,Xilinx 建议在低地址使用 128Mb 的设备。该模式下,QSPI 0 设备从 FC00_0000 开始,最大到 FCFF_FFFF(16MB);QSPI 1 设备从 FD00_0000 开始,最大到 FDFF_FFFF(另一个 16MB)。若第一个设备容量小于 16MB,两个设备之间会出现内存空间空洞。

      12.1.3 框图

      控制器的框图如图 12-2 所示。

    • 12.1.4 注意事项
    • 操作限制:使用单个设备时,必须连接到 QSPI 0;使用两个设备时,两者必须完全相同(同一厂商且协议序列一致);
    • 四通道 SPI 控制器的 MIO 引脚与 SMC 控制器的 NOR 和 NAND 接口存在冲突,使用四通道 SPI 时,不能使用 NOR/SRAM 和 NAND 接口。有关 MIO 引脚的更多信息,请参见 2.5 节 “PS-PL MIO-EMIO 信号和接口”。
    • 12.2 功能描述

      四通道 SPI 闪存控制器可工作在 I/O 模式或线性寻址模式。对于读取操作,两种模式均支持单、双和四通道读取模式;对于写入操作,I/O 模式支持单通道和四通道模式,线性寻址模式不支持写入操作。

      12.2.1 操作模式

      四通道 SPI 的工作模式转换如图 12-3 所示。

      在 I/O 模式下,软件可通过设置相应的寄存器位,对读数据管理的不同方面进行不同程度的控制。在线性模式下,控制器执行所有必要的读数据管理,软件访问该内存时如同访问 ROM。

      12.2.2 I/O 模式

      在 I/O 模式下,软件需根据四通道 SPI 协议准备和格式化命令及数据为指令,然后通过反复写入 TXD 寄存器,将包含 CMD 和数据的格式化指令序列推入发送 FIFO。发送逻辑根据四通道 SPI 接口规范将 TxFIFO 的内容串行化,并发送到闪存设备。在发送逻辑发送 TxFIFO 内容的同时,会对原始串行数据进行采样、执行串并转换,并将数据存储到 RxFIFO 中。

      对于读命令,当命令和地址字节发送后由闪存设备驱动数据时,MIO 会在发送逻辑的控制下适时从输出切换为输入。移入 RxFIFO 的数据会反映这种切换,使得 RxFIFO 中相应的 FIFO 条目包含有效数据。

      软件需要从 RxFIFO 中过滤原始数据以获取相关内容,控制器不会修改软件写入的指令或放入 RxFIFO 的捕获数据。

      控制器支持小端模式,指令的 4 字节字中最低有效字节的最高有效位首先发送。

    • 流控制:I/O 模式下数据传输有不同的流控制方式,用户可通过 config_reg.MANSTARTEN(Man_start_com)选择自动或手动模式。在手动模式下,用户还可通过 Config_reg.SSFORCE(Manaual_CS)选择手动或自动片选。片选信号有效表示 MIO 上开始一个命令序列,CS 有效后,D0 上的串行数据会被闪存解释为命令;
    • 自动模式:整个传输序列(包括片选控制)由硬件完成,无需软件干预。向 TxFIFO 写入数据后,传输立即开始,片选自动有效;TxFIFO 为空时,数据传输结束,片选自动无效。此模式下,要进行连续数据传输,软件向 TxFIFO 提供数据的速率必须等于或高于 MIO 上的数据传输速率,但由于从 RXD 读取和向 TXD 写入都以 APB 时钟速率进行,这一点难以实现;
    • 手动模式:用户控制数据传输的开始。软件将整个传输序列写入 TxFIFO 或直到 TxFIFO 满,设置 Man_start_en 位后,控制器接管操作:断言 CS,将数据从 TxFIFO 移出并移入 RxFIFO,适当控制 MIO 的输入 / 输出状态,当 TxFIFO 为空时通过撤销 CS 断言终止序列。该模式下,每个命令序列的最大字节数受限于 TxFIFO 的深度(252 字节);
    • 在手动模式下,用户除控制传输开始外,还可选择控制片选。软件先将传输序列(从命令开始)写入 TxFIFO 直到满,然后断言 CS,接着手动启动。硬件接管后,当 TxFIFO 为空时 CS 不会被撤销。软件可再次向 TxFIFO 填充适当数据以继续之前的命令,这种方法消除了每个命令序列的字节数限制,可有效用于大数据传输。命令序列完成后,软件通过写入 Manual_CS 位撤销 CS 断言。
    • 12.2.3 I/O 模式传输寄存器(TXD)

      软件需写入特定闪存设备所需的字节序列(参考四通道 SPI 设备厂商规范)。控制器有四个只写的 32 位 TXD 寄存器,供软件向闪存设备发出命令流以获取状态和读写数据。四通道 SPI TXD 寄存器的写入格式如表 12-1 所示,对 TXD0、TXD1、TXD2 或 TXD3 寄存器的每次访问都会相应地写入 TxFIFO。

      用户必须在以下连续访问之间清空 TxFIFO:

    • TXD0 到 TXD1/TXD2/TXD3;
    • TXD1 到 TXD0/TXD1/TXD2/TXD3;
    • TXD2 到 TXD0/TXD1/TXD2/TXD3;
    • TXD3 到 TXD0/TXD1/TXD2/TXD3。
    •  

      而 TxD0 到 TXD0 的访问无需清空 FIFO。

    • FIFO 读写:TxFIFO 和 RxFIFO 共享同一个门控时钟,因此每从 TxFIFO 移出一个字节(包括命令和地址字节),就会有一个字节移入 RxFIFO;
    • 从四通道 SPI 闪存读取数据时,软件需向 TxFIFO 写入四通道 SPI 闪存所需的适当命令、地址、模式(四通道或双通道 I/O 模式时)和虚拟周期。此外,软件必须向 TxFIFO 填充额外的虚拟数据,这些数据用于提供将数据移入 RxFIFO 所需的 CLK。更多编程细节请参见 12.3.5 节 “Rx/Tx FIFO 对 I/O 命令序列的响应”。
    • 12.2.4 I/O 模式注意事项

      RxFIFO 中断状态位会在数据实际可读取之前指示数据可用,这种延迟与时钟域交叉有关,但通常会被软件处理中断的时间所弥补。

      读命令期间,软件必须向 TxFIFO 写入虚拟数据才能从设备接收数据。在自动模式下,若 TxFIFO 为空,四通道 SPI 控制器会撤销片选,要继续接收数据,软件必须向设备发送读命令和地址。

      12.2.5 线性寻址模式

      控制器有一个 32 位 AXI 从接口,支持读操作的线性地址映射。当主设备通过该端口发出 AXI 读命令时,四通道 SPI 控制器会生成 QSPI 命令以加载相应的内存数据,并通过 AXI 接口返回。

      在线性模式下,闪存子系统的行为类似于具有 AXI 接口的典型只读存储器,支持 4 级命令流水线。与 I/O 模式相比,线性模式通过减少软件开销,提高了用户友好性和整体读内存吞吐量。从软件角度看,访问线性四通道 SPI 内存子系统与访问其他 ROM 没有明显区别,只是延迟可能更长。

      当 qspi.LQSPI_CFG.[LQ_MODE] 位设置为 1 时,会切换到 LQSPI 模式。进入线性寻址模式前,用户必须确保 TXFIFO 和 RXFIFO 都为空。一旦设置 qspi.LQSPI_CFG.[LQ_MODE] 位,FIFO 将由 LQSPI 模块自动控制,对 TXD 和 RXD 的 I/O 访问是未定义的。

      在线性模式下,CS 引脚由 QSPI 控制器自动控制。切换到 LQSPI 模式前,用户必须确保 qspi.Config_reg [Man_start_en] 和 qspi.Config_reg [PCS] 都为 0。

      控制器的简化框图(显示线性和 I/O 部分)如图 12-2 所示。

    • AXI 接口操作:线性寻址模式仅支持 AXI 读命令,所有有效的写地址和写数据会立即得到确认但会被忽略,即不会对闪存执行相应的编程(写入)操作。所有 AXI 写操作都会在写响应通道产生 SLVERR 错误;
    • 支持递增或环绕地址突发读,不支持固定地址突发读,否则会产生 SLVERR 错误。因此,只有 arburst [1:0] 值为 2'b01 或 2'b10 是有效的。所有读访问必须字对齐,数据宽度必须为 32 位(不允许窄突发传输);
    • 表 12-2 列出了接口忽略的来自主设备的读地址通道信号;
    •  
      信号数值
      araddr[1:0]忽略,假设为 0,即始终假设字对齐
      arsize[2:0]忽略,始终为 32 位接口
      arlock[1:0]忽略
      arcache[3:0]忽略
      arprot[2:0]忽略
    • AXI 从接口的读接受能力为 4,可接受最多 4 个未完成的 AXI 读命令。

    • AXI 读命令处理:AXI 读突发命令会被转换为 SPI 闪存读指令并发送到四通道 SPI 控制器的 TxFIFO,控制器的发送逻辑负责从 FIFO 中取出读指令,并根据 SPI 协议发送到 SPI 闪存设备;

    • 一个 64 深的 FIFO 用于提供读数据缓冲,最多可容纳 4 个 16 数据突发。由于 Rx FIFO 在片选信号有效后立即开始接收数据,线性地址模块会去除与指令码(如有)、地址、虚拟周期对应的输入数据,并以有效数据响应 AXI 读指令。

    • 接口配置和读模式:AXI 读突发传输会被转换为 SPI 闪存读指令并发送到控制器的 TxFIFO,发送逻辑从 TxFIFO 中取出读指令,并根据 SPI 协议发送到 SPI 闪存设备;

    • 软件通过写入 qspi.LQSPI_CFG [INST_CODE] 定义线性寻址模式中使用的 SPI 读命令。表 12-3 列出了支持的读命令码和推荐的配置寄存器设置(qspi.LQSPI_CFG)。使用 33 MHz PS_CLK 时四通道 SPI 启动性能的最佳寄存器值如表 6-10 和表 12-3 所示。这些四通道 SPI 寄存器可在非安全模式下通过 BootROM 头中的寄存器初始化功能进行编程,以加快 FSBL / 用户代码的加载。若使用更快的 PS_CLK,需调整时钟分频器;

    •  
      操作模式指令码Winbond & SpansionMicron
      1 个设备2 个设备1 个设备2 个设备
      读(串行位)0x030x800000030xE00000030x800000030xE0000003
      快速读(串行位)0x0B0x8000010B0xE000010B0x8000010B0xE000010B
      双输出快速读0x3B0x8000013B0xE000013B0x8000013B0xE000013B
      四输出快速读0x6B0x8000016B0xE000016B0x8000016B0xE000016B
      双 I/O 快速读0xBB0x82FF00BB0xE2FF00BB0x82FF01BB0xE2FF01BB
      四 I/O 快速读0xEB0x82FF02EB0xE2FF02EB0x82FF04EB0xE2FF06EB
    • 操作模式的选择取决于所连接设备的能力。I/O 快速读模式对地址和数据采用 4 位并行传输,性能最快;输出快速读模式仅对数据采用 4 位并行传输,仍比串行模式快。

    • 性能模式:要获得最高性能,用户应将四通道 SPI 控制器工作在四通道 I/O 模式。通过将四通道 SPI 设备工作在连续读模式,可消除连续命令的读指令开销,更多细节见附录 B “寄存器详情” 中的 LQSPI_CFG 寄存器;

    • 工作频率见相关的 Zynq-7000 AP SoC 数据手册。

    • 读数据管理:一个 63 深的 RxFIFO 提供读数据缓冲,至少可容纳 3 个 16 字节的 AXI 突发传输长度。由于 RxFIFO 在片选信号有效后立即开始接收数据,线性地址适配器会去除与指令码(如有)、地址和虚拟周期对应的输入数据;

    • 读数据必须与地址指定的相应字边界对齐。为实现数据对齐,控制器在将地址发送到闪存设备之前,会对其进行修改(如图 12-4 所示),修改包括将地址减少最多 3 个字节位置,使返回的数据自动按字对齐。地址的修改量对 AXI 接口是透明的,且取决于指令;

    • 例如,若 Cmd + 地址 + 模式 + 虚拟(QSPI 指令)未在 32 位边界结束,线性控制器会从地址中减去 1、2 或 3,以使数据在 32 位边界对齐。

    • 读延迟:在线性模式下,默认的读模式是快速四通道 I/O。以下是在 100 MHz 四通道 I/O 模式下,使用 2 个虚拟字节时计算内存延迟的示例。对于单个设备,从 8 位指令码和 24 位地址可用到第一个 32 位数据可用的时钟周期数为:
      总延迟 = 指令延迟 + 地址延迟 + 开销(模式 + 虚拟位 + 偏移)+ 延迟 = 8 个周期 + 6 个周期 + 8(2+4+2)个周期 + 8 个周期 = 30 个周期;

    • 当 SPI 时钟为 100 MHz 时,内存接口的延迟为 320 ns。其他读模式的延迟更高,可按类似方式计算。

    • 12.2.6 不支持的设备

      一些设备为闪存访问实现了自定义的 4 位宽 SPI 类接口,如 SST 的 SQI 设备和 Atmel 的 Fast4 设备。其他一些四通道 SPI 设备(如某些 Micron/Numonyx 设备)可通过非易失性配置位切换到这种自定义 4 位接口。

      这些接口与四通道 SPI 控制器支持的设备操作不同,它们在指令阶段以及地址和数据阶段都工作在 4 位模式,这要求四通道 SPI 闪存控制器上电后工作在 4 位模式并保持该模式(或直到重新配置,若支持)。目前没有计划支持这些自定义接口。

      12.2.7 支持的内存读写命令

      支持在 SCK 上升沿每时钟传输 1 位地址,并在 SCK 上升沿每时钟返回 1、2 或 4 位数据的命令,这些命令包括:1 位数据的读(Read)或快速读(Fast Read)、2 位数据的双输出读(Dual Output Read)、4 位数据的四输出读(Quad Output)。

      支持在 SCK 上升沿每时钟传输 2 或 4 位地址和数据的命令,即 2 位的双 I/O 读(Dual I/O)和 4 位的四 I/O 读(Quad I/O)。

      指令名称描述代码(十六进制)
      READ读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 1 位数据。03
      FAST_READ快速读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 1 位数据。0B
      DOR双输出读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 2 位数据。3B
      QOR四输出读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 4 位数据。6B
      DIOR双 I/O 读。每个时钟上升沿发送 2 位地址。每个 SCLK 上升沿返回 4 位数据。BB
      QIOR四 I/O 读。每个时钟上升沿发送 4 位地址。每个 SCLK 上升沿返回 4 位数据。EB
      PP页编程。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿发送 1 位数据。02
      QPP四页编程。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿发送 4 位数据。Spansion 和 Micron 设备为 32,Macronix 设备为 38
      12.3 编程指南
    • 示例:启动序列:
      1. 配置时钟(参考 12.4.1 节 “时钟”);
      2. 配置 Tx/Rx 信号(参考 12.5.2 节 “MIO 编程”);
      3. 复位控制器(参考 12.4.2 节 “复位”);
      4. 配置控制器(参考 12.3.1 节 “配置”);
        之后,可将控制器配置为线性寻址模式(12.2.5 节 “线性寻址模式”)或 I/O 模式(12.3.3 节 “配置 I/O 模式” 和 12.3.4 节 “I/O 模式中断”)。
    • 12.3.1 配置
    • 示例:配置控制器:
      该示例适用于线性寻址模式和 I/O 模式,用于设置控制器的波特率、FIFO、闪存模式、时钟相位 / 极性,并编程环回延迟;
      写入 qspi.Config_reg 寄存器的值如表 12-3(344 页)所示;
      1. 配置控制器,写入 qspi.Config_reg 寄存器:
      • 设置波特率 [BAUD_RATE_DIV];
      • 选择主模式 [MCDE_SEL] =1;
      • 选择闪存模式(非传统 SPI)[LEG_FLSH] =1;
      • 选择小端模式 [endian] = 0;
      • 设置 FIFO 宽度为 32 位 [FIFO_WIDTH];
      • 设置时钟相位 [CLK_PH] 和极性 [CLK_POL];
      1. 若波特率分频器为 2,需修改默认设置。若 qspi.Config_reg [BAUD_RATE_DIV] 设置为 0b00,配置 qspi.LPBK_DLY_ADJ(环回延迟调整)寄存器:
      • 设置为选择内部时钟 qspi.LPBK_DLY_ADJ [USE_LPBK] = 1;
      • 设置时钟延迟 0 qspi.LPBK_DLY_ADJ [DLY0] = 0b00;
      • 设置时钟延迟 1 qspi.LPBK_DLY_ADJ [DLY1] = 0b00。
    • 12.3.2 线性寻址模式
    • 示例:线性寻址模式(内存读取):
      线性寻址模式下数据读取的操作序列如下:
      1. 将手动启动使能设置为自动模式,qspi.Config_reg [Man_start_en] = 0;
      2. 断言片选,qspi.Config_reg [PCS] = 0;
      3. 编程线性寻址模式的配置寄存器,示例值如表 12-3(344 页)所示;
      4. 使能控制器,qspi.En_REG [SPI_EN] = 1;
      5. 从线性地址内存区域读取数据,内存范围取决于设备的大小和数量,范围从 0xFC00_0000 到 0xFDFF_FFFF;
      6. 禁用控制器,qspi.En_REG [SPI_EN] = 0;
      7. 撤销片选,qspi.Config_reg [PCS] = 1。
    • 12.3.3 配置 I/O 模式
    • 示例:I/O 模式(内存读写):
      以下是使用 I/O 模式进行读写的操作序列:
      1. 使能手动模式,写入 1 到 qspi.Config_reg [Man_start_en, Manual_CS] = 1;
      2. 配置闪存设备(参考图 12-6,355 页),单个闪存设备使用 qspi.LQSPI_CFG 寄存器的复位值,并行双闪存设备时,向 TWO_MEM、SEP_BUS 位域写入 1;
      3. 断言片选,qspi.Config_reg [PCS] =0;
      4. 使能控制器,qspi.En_REG [SPI_EN] = 1;
      5. 向闪存写入字节序列,通过 TXD 寄存器向 TxFIFO 写入 1 到 4 字节(参考 12.2.3 节 “I/O 模式传输寄存器(TXD)”);
      6. 避免 TxFIFO 溢出,TxFIFO 为空时可写入 252 字节,之后软件可通过读取 qspi.Intr_status_REG [TX_FIFO_full],等待其为 0 后再写入 TXD 寄存器;
      7. 使能中断,写入 qspi.Intrpt_en_REG,中断处理程序相关内容见中断处理程序部分;
      8. 开始数据传输,qspi.Config_reg [Man_start_com] = 1;
      9. 中断处理程序:在四通道 SPI 闪存的编程 / 读取操作期间,将所有所需数据传输到 QSPI 闪存(见示例:I/O 模式中断服务程序,349 页);
      10. 若执行读操作:重新排列读取数据,去除虚拟周期导致的读取数据;
      11. 禁用控制器,qspi.En_REG [SPI_EN] = 0;
      12. 解除片选,QSPI.Config_reg [PCS] = 1。
    •  

      注意,TxFIFO 宽度必须编程为 32 位:qspi.Config_reg [FIFO_WIDTH] = 0b11,软件需要处理 “连续非字对齐” 传输。

    • 示例:I/O 模式中断服务程序:
      1. 根据四通道 SPI 设备类型配置 ISR 以处理中断条件。要从四通道 SPI 设备读取数据,最简单的 ISR 从 RxFIFO 读取数据并向 TxFIFO 写入内容。系统中断控制器(GIC)见第 7 章 “中断”,控制器产生系统外设中断(SPI),IRQ ID #51。四通道 SPI 控制器的中断机制见 12.3.4 节 “I/O 模式中断”;
      2. 读传输中断:RxFIFO 非空中断;
      3. 写传输中断:TxFIFO 非满中断。
    • 12.3.4 I/O 模式中断

      中断仅在 I/O 模式下使用,当任何中断条件满足时,控制器会断言中断。四通道 SPI 中断处理程序检查中断原因,单个中断服务程序可管理所有中断条件。

    • 示例:Rx 和 Tx 的中断处理程序:
      中断处理程序由 IRQ ID #51 触发,示例程序读取 RxFIFO 直到为空,然后填充 TxFIFO。RxFIFO 非空中断状态用于判断是否可从 RxFIFO 读取内容,TxFIFO 非满中断指示 TxFIFO 是否有空间容纳更多内容;
      1. 禁用控制器中的所有中断,qspi.Intrpt_dis_REG [TX_FIFO_not_full, RX_FIFO_full] 均设为 1;
      2. 清除中断,读取中断状态寄存器 qspi.Intr_status_REG;
      3. 清空 RxFIFO,检查 RxFIFO 非空中断是否断言,若 qspi.Intr_status_REG [RX_FIFO_not_empty] = 1,则 RxFIFO 中有数据:
      • 若状态断言,从 RxFIFO 读取数据,使用 qspi.RX_data_REG 寄存器读取;
      • 从 RxFIFO 读取数据并轮询中断状态,直到 RxFIFO 为空(qspi.Intr_status_REG [RX_FIFO_not_empty] = 0);
      1. 填充 TxFIFO,检查 TxFIFO 非满状态是否断言,若 qspi.Intr_status_REG [TX_FIFO_not_Full] = 1,则有数据要发送到闪存设备(编程和 / 或读取操作):
      • 向 qspi.TXD0 寄存器写入数据;
      • 轮询 qspi.Intr_status_REG [TX_FIFO_full] = 1,这表示 TX FIFO 已满;
      • 重复步骤 a 和 b,直到所有数据都写入 TxFIFO 或直到 qspi.Intr_status_REG [TX_FIFO_full] = 1;
      1. 使能中断,设置 qspi.Intrpt_en_REG [TX_FIFO_not_full, RX_FIFO_full] 均为 1;
      2. 开始数据传输,设置 qspi.Config_reg [MANSTRTEN] = 1。
    • 12.3.5 Rx/Tx FIFO 对 I/O 命令序列的响应
    • 示例命令和序列:
      • 写使能命令;
      • 读状态命令;
      • 读数据序列;
    •  

      在这些示例中,YY 可以是任何值,每个 YY 对可以有不同的值。

      在串行传统模式下接收数据时,从 MISO/DQ1 线采样的值同步到时钟后存入 RxFIFO,而命令和地址事务在 MOSI/DQ0 上进行。

    • 示例:写使能命令(代码 0x06):
      1. 发送写使能命令(WREN),向 qspi.TXD1 寄存器写入 0xYYYY_YY06:
      • WREN 命令 = 0×06;
      • YY=0;
      • 控制器从 TxFIFO 向设备移出 1 个字节,并在 RxFIFO 中接收 1 个字节;
      1. 读取状态,读取 qspi.RXD 寄存器并接收 0xYYPP_PPPP:
      • 当 YY=0×0(状态)且 PP_PPPP=0×0(位的先前状态)时,值为 0x0000_0000;
      • 软件记录写使能命令产生了 1 个字节,并向调用函数返回 0xYY;
    •  

      发送 WREN 命令后 RxFIFO 中的内容如下(“先前” 表示该值与寄存器先前的值相比未发生变化):

      RxFIFO 条目最高有效位最低有效位
      1无效无效无效无效
      000先前先前先前
    • 示例:读状态命令(代码 0x05):
      1. 发送读状态命令(RDSR),向 qspi.TXD2 寄存器写入 0xYYYY_DD05:
      • 命令为 0x05,DD = 虚拟数据,YY=0;
      • 控制器从 TxFIFO 向闪存移出 2 个字节,并在 RxFIFO 中接收 2 个字节;
      1. 读取状态值,从 qspi.RXD 寄存器读取 0xZZYY_PPPP:
      • 当 ZZ=0×03、YY=0×0 且 PPPP=0x0 时,值为 0x0300_0000;
      • 软件记录有 2 个有效字节,并向调用函数返回 0x00、0x03;
    •  

      发送 RDSR 命令后 RxFIFO 中的内容如下表(“先前” 表示该值与寄存器先前的值相比未发生变化):

      TxFIFO 条目最高有效位最低有效位
      1无效无效无效无效
      00x30x00先前先前
    • 示例:读数据序列:
      本示例向调用函数返回地址 0 处的 4 个字节数据:
      1. 发送数据读指令,向 qspi.TXD0 寄存器写入 0xA2A1_A003:
      • 指令包括命令(0x03)和地址(A0、A1 和 A2);
      1. 发送虚拟数据,向 qspi.TXD0 寄存器(第二个 TxFIFO 条目)写入 0xD0D1_D2D3(虚拟数据):
      • 控制器从 TxFIFO 向闪存移出 8 个字节,并在 RxFIFO 中接收 8 个字节;
    •  

      本示例中 TxFIFO 的内容如下,从控制器到设备的字节序列为:0x03、Y0、Y1、Y2、D0、D1、D2 和 D3。

      TxFIFO 条目最高有效位最低有效位
      1D3D2D1D0
      0A2A1A00x03
    • 读指令字之后的数据,读取 qspi.RXD 寄存器并接收 0xYYYY_YYYY:
    • YY=0;
    • 读取闪存数据,再次读取 RXD 寄存器并接收 0xD3D2_D1D0:
    • 对于第二次读取,软件记录有 4 个有效字节;
    • 示例数据:0x2468ACEF;
    • 总体而言,软件读取这些字节:0x00、0x00、0x00、0x00、0x24、0x68、0xAC、0xEF,并向调用函数返回这 4 个字节的数据;
    •  

      本示例中 RxFIFO 的内容如下,从设备到控制器的字节序列为:YY、YY、YY、YY、0xEF、0xAC、0x68 和 0x24。

      RxFIFO 条目最高有效位最低有效位
      10x240x680xAC0xEF
      0YYYYYYYY
      12.3.6 寄存器概述

      寄存器概述如表 12-5 所示:

      地址偏移软件助记符名称描述
      0x00Config_reg配置
      0x04Intr_status_REG中断状态
      0x08Intrpt_en_REG中断使能
      0x0CIntrpt_dis_REG中断禁用
      0x10Intrpt_mask_REG中断掩码
      0x14En_REG控制器使能
      0x18Delay_REG延迟
      0x1CTXD0传输 1 字节命令和 3 字节数据或 4 字节数据
      0x20Rx_data_REG接收数据(RxFIFO)
      0x24Slave_Idle_count_REG从机空闲计数
      0x28TX_thres_REGTxFIFO 阈值水平(以 4 字节字为单位)
      0x2CRX_thres_REGRxFIFO 阈值水平(以 4 字节字为单位)
      0x30GPIO通用输入输出
      0x38LPBK_DLY_ADJ环回主时钟延迟调整
      0x80TXD1传输 1 字节命令
      0x84TXD2传输 1 字节命令和 1 字节数据
      0x88TXD3传输 3 字节 1 字节命令和 2 字节数据
      0xA0LQSPI_CFG线性模式配置
      0xA4LQSPI_STS线性模式状态
      0xFCMOD_ID模块 ID
      12.4 系统功能
      12.4.1 时钟

      控制器和 I/O 接口由参考时钟(QSPI_REF_CLK)驱动,控制器的互连还需要 APB 接口 CPU_1x 时钟,这些时钟由 PS 时钟子系统生成。

    • CPU_1x 时钟:参考 25.2 节 “CPU 时钟” 了解一般时钟编程信息,CPU_1x 时钟与四通道 SPI 参考时钟异步运行;

    • QSPI_REF_CLK 和四通道 SPI 接口时钟:QSPI_REF_CLK 是主控制器时钟,源自 PS 时钟子系统。使用 slcr.LQSPI_CLK_CTRL 寄存器编程时钟使能、PLL 选择和分频器设置,参考 25.6.3 节 “SDIO、SMC、SPI、四通道 SPI 和 UART 时钟” 编程 QSPI_REF_CLK 频率;

    • 使用 qspi.Config_reg [BAUD_RATE_DIV] 位字段将 QSPI_REF_CLK 分频为 2、4、8、16、32、64、128 或 256,以生成四通道 SPI 接口时钟;

    • 为了电源管理,可使用 slcr 寄存器中的时钟使能关闭时钟,参考数据手册了解参考时钟的工作频率;

    • 手动模式下的时钟比率限制:在手动模式下,为保证控制器可靠运行,QSPI_REF_CLK 频率必须大于或等于 CPU_1x 时钟频率;

    • 自动模式下没有这种限制,参考时钟通过 qspi.Config_reg [baud_rate_divisor] 分频生成闪存的 SCLK 时钟。

    • 示例:设置参考时钟:
      本示例假设所选 PLL(ARM、DDR 或 IO)工作在 1000 MHz,所需的四通道 SPI 参考时钟频率为 200 MHz;

      1. 选择 PLL 源、分频器并使能,向 slcr.QSPI_CLK_CTRL 寄存器写入 0x0000_0501:
      • 使能参考时钟;
      • 将 I/O PLL 时钟分频 5:DIVISOR = 0×05;
      • 选择 I/O PLL 作为时钟源。
    • 四通道 SPI 反馈时钟:四通道 SPI 接口支持一个可选的反馈时钟引脚,名为 qspi_sclk_fb_out。该引脚用于高速四通道 SPI 时序模式,此时内存接口时钟需要大于 40 MHz。反馈信号从 I/O 的内部输入接收,因此需要对 MIO 引脚 8 进行编程并允许其自由切换。有关如何编程 MIO_PIN_08 寄存器的说明,请参考 12.5.2 节 “MIO 编程” 中的可选编程示例;

    • 使用四通道 SPI 反馈模式时,qspi_sclk_fb_out 引脚应仅连接到上拉或下拉电阻,这是设置 MIO 电压模式(vmode)所必需的;

    • 12.4.2 复位

      控制器有两个复位域:APB 接口和控制器本身,可一起或独立控制,每种复位类型的影响总结在表 12-6 中:

      名称APB 接口TxFIFO 和 RxFIFO协议引擎寄存器
      APB 接口复位 slcr.LQSPI_RST_CTRL [LQSPI_CPU1X_RST]
      PS 复位子系统 slcr.LQSPI_RST_CTRL [QSPI_REF_RST]
    • 示例:复位 APB 接口和四通道 SPI 控制器:
      1. 设置控制器复位,向 slcr.LQSPI_RST_CTRL [QSPI__REF_RST 和 LQSPI_CPU1X_RST] 位字段写入 1;
      2. 清除控制器复位,向 slcr.LQSPI_RST_CTRL [QSPI__REF_RST 和 LQSPI_CPU1X_RST] 位字段写入 0。
    • 12.5 I/O 接口
      12.5.1 接线连接

      I/O 信号通过 MIO 引脚可用,四通道 SPI 控制器支持最多两个 SPI 闪存,采用共享或独立总线配置,支持多种操作配置:

    • 四通道 SPI 单 SS,4 位 I/O;
    • 四通道 SPI 双 SS,8 位并行 I/O;
    • 四通道 SPI 双 SS,4 位堆叠 I/O;
    • 四通道 SPI 单 SS,传统 I/O;
    •  

      重要提示:若要使用 QSPI 内存子系统,QSPI 0 必须存在。QSPI 1 是可选的,仅在双内存配置时需要,因此 QSPI_1 不能单独使用。

    • 单 SS,4 位 I/O:
      4 位闪存接口连接到控制器配置的框图如图 12-5 所示。

    • 双 SS,8 位并行:
      控制器支持最多两个 SPI 闪存并行工作,如图 12-6 所示。这种配置将最大可寻址 SPI 闪存从 16 MB(24 位寻址)增加到 32 MB(25 位寻址)。

    •  

      对于 8 位并行配置,数据字的偶数位位于低内存,奇数位位于高内存。控制器在 I/O 和线性模式下都负责数据管理。四通道 SPI 控制器从两个四通道 SPI 设备读取数据,并在将状态数据写入 RXFIFO 之前对两个设备的状态信息执行 OR(或)操作。表 12-7 显示了 8 位并行配置下 32 位数据字的数据位排列,表 12-8 显示了双四通道 SPI 并行模式下的四通道 SPI 命令行为。

      命令双并行四通道 SPI 控制器行为
      扇区擦除四通道 SPI 控制器向两个芯片发送擦除命令,每个部分执行 64 KB 擦除操作,实际上从两个存储器中总共擦除 128 KB
      读 ID仅从低闪存总线获取接收的数据并将其放入 RXD,因此无需组合数据。因此,在使用并行闪存模式时,上下闪存部分必须是相同的部件
      页编程将偶数位和奇数位分离并在两个存储器中编程,更多信息参考表 12-7
      从两个设备读取偶数和奇数数据位,并按表 12-7 所示进行交错
      RDSR两个部分的 WIP 位进行 OR 操作以形成读取数据的最低有效位,其他 7 位仅来自低总线

      8 位并行配置中,总可寻址内存大小为 32 MB,这需要 25 位地址。所有内存访问必须字对齐并具有双字节分辨率。在线性模式下,四通道 SPI 控制器将 AXI 地址除以 2,并将除法后的地址发送到四通道 SPI 设备。在 I/O 模式下,软件负责执行地址转换以支持 SPI 24 位地址。

    • 双 SS,4 位堆叠 I/O:
      为减少 I/O 引脚数量,控制器还支持最多两个 SPI 闪存采用共享总线配置,如图 12-7 所示。这种配置将最大可寻址 SPI 闪存从 16 MB(24 位寻址)增加到 32 MB(25 位寻址),但吞吐量与单内存模式相同。请注意,在此配置中,不支持设备级 XIP 模式(读指令码 0xbb 和 0xeb)。

    全文总结

    • 若使用线性四通道 SPI 内存子系统,应始终连接低 SPI 闪存,高闪存是可选的。总地址空间为 32 MB,采用 25 位地址。在 I/O 模式下,地址的最高有效位由 U_PAGE 定义,该位位于寄存器 0xA0 的位 28。在线性地址模式下,AXI 地址位 24 确定高内存页或低内存页。所有命令将由 I/O 模式下 U_PAGE 选择的设备和线性模式下地址位 24 选择的设备执行。

    • 单 SS,传统 I/O:
      四通道 SPI 控制器可工作在传统单比特串行接口模式,支持 1x、2x 和 4x I/O 模式,如图 12-8 所示。
    • 12.5.2 MIO 编程

      四通道 SPI 信号可路由到特定的 MIO 引脚,参考表 12-9 “四通道 SPI 接口信号”,接线图如图 12-5 至图 12-8 所示。一般路由概念和 MIO I/O 缓冲器配置在 2.4 节 “PS–PL 电压电平转换器使能” 中说明。

      若使用 4 位 I/O 总线,则使用四通道 SPI 0。若需要大于 40 MHz 的总线频率,则四通道 SPI 反馈时钟必须路由到 MIO 引脚 8。

    • 示例:为单个设备编程 I/O:
      以下步骤适用于上述所有四通道 SPI I/O 接口连接:

      1. 配置 MIO 引脚 1 为片选 0 输出,向 slcr.MIO_PIN_01 寄存器写入 0x0000_1202:
      • 将四通道 SPI 0 片选路由到引脚 1;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 边沿(良性设置);
      • 启用内部上拉电阻;
      • 禁用 HSTL 接收器(因选择了 LVCMOS 而禁用);
      1. 配置 MIO 引脚 2 至 5 为 I/O,向每个 slcr.MIO_PIN_{02:05} 寄存器写入 0x0000_0302:
      • 将四通道 SPI 0 I/O 引脚路由到引脚 2 至 5;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 驱动边沿;
      • 禁用内部上拉电阻;
      • 禁用 HSTL 接收器;
      1. 配置 MIO 引脚 6 为串行时钟 0 输出,向 slcr.MIO_PIN_06 寄存器写入 0x0000_0302:
      • 将四通道 SPI 0 串行时钟路由到引脚 6;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 边沿(良性设置);
      • 禁用内部上拉电阻;
      • 禁用 HSTL 接收器。
    • 选项:添加第二个设备片选:
      以下 I/O 连接需要此步骤:

      • 双选择,共享 4 位数据内存接口;
      • 双选择,独立 4 位数据内存接口;
      1. 配置 MIO 引脚 0 为片选 1 输出,向 slcr.MIO_PIN_00 寄存器写入 0x0000_1302:
      • 将四通道 SPI 1 片选路由到引脚 0;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 边沿(良性设置);
      • 启用内部上拉电阻;
      • 禁用 HSTL 接收器。
    • 选项:添加第二个串行时钟:
      双选择、独立 4 位数据内存接口需要此步骤:
      5. 配置 MIO 引脚 9 为串行时钟 1 输出,向 slcr.MIO_PIN_09 寄存器写入 0x0000_0302:

      • 将四通道 SPI 1 串行时钟路由到引脚 9;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 边沿(良性设置);
      • 禁用内部上拉电阻;
      • 禁用 HSTL 接收器。
    • 选项:添加 4 位数据:
      双选择、独立 4 位数据内存接口需要以下步骤:
      6. 配置 MIO 引脚 10 至 13 为 I/O,向每个 slcr.MIO_PIN_{10:13} 寄存器写入 0x0000_0302:

      • 将四通道 SPI 1 I/O 引脚路由到引脚 9 至 13;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 驱动边沿;
      • 禁用内部上拉电阻;
      • 禁用 HSTL 接收器。
    • 选项:添加反馈输出时钟:
      当 I/O 接口工作在 40 MHz 以上时,使用可选的反馈时钟。它应仅连接到上拉或下拉电阻,用于 MIO 电压模式(vmode)的引脚绑定时。还必须启用反馈时钟;
      7. 配置 MIO 引脚 8 为反馈时钟,向 slcr.MIO_PIN_08 寄存器写入 0x0000_0302:

      • 将四通道 SPI 反馈时钟输出路由到引脚 8;
      • 三态由四通道 SPI 控制(TRI_ENABLE = 0);
      • LVCMOS18(参考寄存器定义了解其他电压选项);
      • 慢 CMOS 边沿(良性设置);
      • 禁用内部上拉电阻;
      • 禁用 HSTL 接收器。
    • 12.5.3 MIO 信号

      四通道 SPI 闪存信号通过 MIO 多路复用器路由到 MIO 设备引脚。双控制器端口的每一侧可单独启用,或一起作为 8 位 I/O 接口工作。

      四通道 SPI 闪存信号路由到 MIO 引脚,如表 12-9 所示:

      四通道 SPI 闪存接口MIO 引脚控制器默认输入值
      信号数据 I/O 模式四通道 SPI 0四通道 SPI 1I/O名称
      1 位数据2 位数据4 位数据
      闪存片选~~~10OQSPI{1,0}_SS_B~
      串行时钟~~~69OQSPI{1,0}_SCLK~
      输出反馈时钟~~~8OQSPI_SCLK_FB_OUT~
      I/O 0主输出I/O 0I/O 0210IOQSPI{1,0}_IO_00
      I/O 1主输入I/O 1I/O 1311IOQSPI{1,0}_IO_10
      I/O 2写保护写保护I/O 2412IOQSPI{1,0}_IO_20
      I/O 3保持保持I/O 3513IOQSPI{1,0}_IO_30
    • 当四通道 SPI 时钟频率大于 FQSPICLK2 时,MIO 8 引脚必须编程为反馈输出时钟,且 MIO 8 引脚在 PCB 上仅应连接到上拉 / 下拉电阻用于引导。

    一、基本介绍

    • 所属与用途:Quad-SPI 闪存控制器是输入 / 输出外设(IOP)的一部分,位于 PS 中,用于访问多比特串行闪存设备,适用于高吞吐量和低引脚数应用。
    • 操作模式
      • I/O 模式:软件与闪存设备协议紧密交互,通过四个 TXD 寄存器写入命令和数据,从 RXD 寄存器读取接收的数据。
      • 线性寻址模式:使用部分设备操作,消除 I/O 模式读取闪存的软件开销,硬件发出命令并控制数据从闪存总线到 AXI 接口的流动,控制器响应 AXI 接口上的内存请求,如同闪存是 ROM。
      • 传统 SPI 模式:QSPI 控制器作为普通 SPI 控制器工作。
    • 连接设备:可连接 1 或 2 个闪存设备。两个设备可并行连接实现 8 位性能,或堆叠成 4 位排列以最小化引脚数。

    二、主要特性

    • 接口:32 位 AXI 接口(用于线性寻址模式传输)、32 位 APB 接口(用于 I/O 模式传输)。
    • 协议:可编程总线协议,支持 Micron 和 Spansion 的闪存。
    • 性能:传统 SPI 及可扩展性能,支持 1x、2x、4x、8x I/O 宽度。
    • 灵活 I/O 配置:单 SS 4 位 I/O 闪存接口模式、双 SS 8 位并行 I/O 闪存接口模式、双 SS 4 位堆叠 I/O 闪存接口模式、单 SS 传统 SPI 接口。
    • 寻址:每设备 16MB 寻址(两个设备 32MB)。
    • 设备密度:I/O 和线性模式下设备密度最高 128Mb,I/O 模式支持大于 128Mb 的密度。
    • I/O 模式特性:软件发出指令并管理闪存操作,有 FIFO 控制中断,63 字 RxFIFO 和 63 字 TxFIFO。
    • 线性寻址模式特性:控制器解释内存读写,AXI 端口缓冲最多四个读请求,支持 AXI 递增和包装地址功能。

    三、功能描述

    • 操作模式转换:通过软件复位等实现模式转换,如图 12-3 所示。
    • I/O 模式
      • 软件负责根据 Quad-SPI 协议准备和格式化命令及数据为指令,推入发送 FIFO,发送逻辑序列化 TxFIFO 内容并发送到闪存,同时采样串行数据转换后存入 RxFIFO。
      • 读命令时,MIO 在发送逻辑控制下适时从输出切换为输入,软件需从 RxFIFO 过滤原始数据获取相关内容,控制器不修改软件写入的指令和 RxFIFO 中的捕获数据,支持小端模式。
      • 流控制:分为自动和手动模式。自动模式下,包括片选控制的整个传输序列由硬件完成;手动模式下,用户控制数据传输的开始,还可进一步选择控制片选。
    • I/O 模式传输寄存器(TXD):有四个只写 32 位 TXD 寄存器,软件写入特定闪存设备所需的字节序列,各寄存器写入格式不同,且连续访问不同 TXD 寄存器需清空 TxFIFO,TXD0 到 TXD0 访问无需清空。
    • 线性寻址模式
      • 具备 32 位 AXI 从接口支持线性地址映射的读操作,AXI 读命令被转换为 QSPI 命令加载对应内存数据并通过 AXI 接口返回,闪存子系统类似带 AXI 接口的只读存储器,命令流水线深度为 4。
      • AXI 接口操作:仅支持 AXI 读命令,忽略有效写地址和数据,所有 AXI 写在写响应通道产生 SLVERR 错误,支持递增或包装地址突发读,不支持固定地址突发读,读访问必须字对齐且数据宽度为 32 位。
      • 部分 AXI 读地址通道信号被忽略,如下表:

    SignalValue
    araddr[1:0]忽略,假设为 0,即始终假设字对齐
    arsize[2:0]忽略,始终为 32 位接口
    arlock[1:0]忽略
    arcache[3:0]忽略
    arprot[2:0]忽略

    • 接口配置和读模式:软件通过写入 qspi.LQSPI_CFG [INST_CODE] 定义线性寻址模式使用的 SPI 读命令,不同操作模式有对应的指令代码和推荐配置寄存器设置,如表 12-3 所示。
    • 读数据管理:63 深 RxFIFO 提供读数据缓冲,线性地址适配器去除与指令码、地址、虚拟周期对应的输入数据,控制器会修改地址以实现数据字对齐。
    • 读延迟:以 100MHz 的 Quad I/O 模式且 2 个虚拟字节为例,总延迟为 30 个周期,对应 320ns,其他读模式延迟更高。
    • 不支持的设备:一些实现自定义 4 位 SPI 类接口的设备,如 SST 的 SQI 设备、Atmel 的 Fast4 设备等,控制器不支持这些自定义接口。
    • 支持的内存读写命令:支持多种命令,如下表:

    Instruction NameDescriptionCode(Hex)
    READ读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 1 位数据。03
    FAST_READ快速读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 1 位数据。0B
    DOR双输出读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 2 位数据。3B
    QOR四输出读。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿返回 4 位数据。6B
    DIOR双 I/O 读。每个时钟上升沿发送 2 位地址。每个 SCLK 上升沿返回 4 位数据。BB
    QIOR四 I/O 读。每个时钟上升沿发送 4 位地址。每个 SCLK 上升沿返回 4 位数据。EB
    PP页编程。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿发送 1 位数据。02
    QPP四页编程。每个时钟上升沿发送 1 位地址。每个 SCLK 上升沿发送 4 位数据。Spansion 和 Micron 设备为 32,Macronix 设备为 38

    四、编程指南

    • 启动序列:配置时钟(参考 12.4.1 节)、配置 Tx/Rx 信号(参考 12.5.2 节 MIO 编程)、复位控制器(参考 12.4.2 节)、配置控制器(参考 12.3.1 节),然后配置为线性寻址模式或 I/O 模式。
    • 配置控制器:适用于线性和 I/O 模式,配置波特率、主模式、闪存模式、字节序、FIFO 宽度、时钟相位和极性等,若波特率分频器为 2,需修改默认设置。
    • 线性寻址模式操作序列:设置手动启动使能为自动模式、断言片选、编程线性寻址模式配置寄存器、使能控制器、从线性地址内存区域读取数据、禁用控制器、解除片选。
    • I/O 模式操作序列:使能手动模式、配置闪存设备、断言片选、使能控制器、向 TxFIFO 写入字节序列、避免 TxFIFO 溢出、使能中断、开始数据传输、处理中断、重新排列读数据(若为读操作)、禁用控制器、解除片选。
    • I/O 模式中断处理:中断由 IRQ ID #51 触发,处理程序读取 RxFIFO 直到为空,然后填充 TxFIFO,有特定的步骤,如禁用中断、清除中断、处理 RxFIFO 和 TxFIFO、使能中断等。
    • Rx/Tx FIFO 对 I/O 命令序列的响应:举例说明写使能命令、读状态命令、读数据序列等情况下 FIFO 的内容和操作。
    • 寄存器概述:多个寄存器,如下表:

    Address OffsetMnemonic Software NameDescription
    0x00Config_reg配置
    0x04Intr_status_REG中断状态
    0x08Intrpt_en_REG中断使能
    0x0CIntrpt_dis_REG中断禁用
    0x10Intrpt_mask_REG中断掩码
    0x14En_REG控制器使能
    0x18Delay_REG延迟
    0x1CTXD0传输 1 字节命令和 3 字节数据或 4 字节数据
    0x20Rx_data_REG接收数据(RxFIFO)
    0x24Slave_Idle_count_REG从机空闲计数
    0x28TX_thres_REGTxFIFO 阈值水平(以 4 字节字为单位)
    0x2CRX_thres_REGRxFIFO 阈值水平(以 4 字节字为单位)
    0x30GPIO通用输入输出
    0x38LPBK_DLY_ADJ环回主时钟延迟调整
    0x80TXD1传输 1 字节命令
    0x84TXD2传输 1 字节命令和 1 字节数据
    0x88TXD3传输 3 字节 1 字节命令和 2 字节数据
    0xA0LQSPI_CFG线性模式配置
    0xA4LQSPI_STS线性模式状态
    0xFCMOD_ID模块 ID

    五、系统功能

    • 时钟
      • 控制器和 I/O 接口由参考时钟(QSPI_REF_CLK)驱动,互连需要 APB 接口 CPU_1x 时钟,这些时钟由 PS 时钟子系统生成。
      • CPU_1x 时钟与 Quad-SPI 参考时钟异步运行。
      • QSPI_REF_CLK 是主控制器时钟,来自 PS 时钟子系统,其时钟使能、PLL 选择和分频器设置通过 slcr.LQSPI_CLK_CTRL 寄存器编程,Quad-SPI 接口时钟由 QSPI_REF_CLK 分频得到。
      • 手动模式下,QSPI_REF_CLK 频率必须大于或等于 CPU_1x 时钟频率,自动模式无此限制。
      • 可选反馈时钟引脚 qspi_sclk_fb_out,用于高速 Quad-SPI 时序模式(内存接口时钟大于 40MHz)。
    • 复位:控制器有 APB 接口和控制器本身两个复位域,可一起或独立控制,复位效果如下表:

    NameAPB InterfaceTxFIFO and RxFIFOProtocol EngineRegisters
    ABP Interface Reset slcr.LQSPI_RST_CTRL[LQSPI_CPU1X_RST]
    PS Reset Subsystem slcr.LQSPI_RST_CTRL[QSPI_REF_RST]

    六、I/O 接口

    • 接线连接:I/O 信号通过 MIO 引脚可用,支持多种配置,且 QSPI 0 必须存在,QSPI 1 可选。
    • MIO 编程:Quad-SPI 信号可路由到特定 MIO 引脚,不同配置有相应的编程步骤,如单设备、添加第二设备片选等。
    • MIO 信号:Quad-SPI 闪存信号路由到 MIO 引脚,如下表:

    Quad-SPI Flash Memory InterfaceMIO PinController Default Input Value
    Signal1-Bit Data2-Bit Data4-Bit DataQuad SPI 0Quad SPI 1I/OName
    Flash Chip Select~~~10OQSPI{1,0}_SS_B~
    Serial Clock~~~69OQSPI{1,0}_SCLK~
    Output Feedback Clk~~~8OQSPI_SCLK_FB_OUT~
    I/O 0Master OutputI/O 0I/O 0210IOQSPI{1,0}_IO_00
    I/O 1Master InputI/O 1I/O 1311IOQSPI{1,0}_IO_10
    I/O 2Write ProtectWrite ProtectI/O 2412IOQSPI{1,0}_IO_20
    I/O 3HoldHoldI/O 3513IOQSPI{1,0}_IO_30

    1. 关键问题:

    • 问题 1:Quad-SPI 闪存控制器的三种操作模式各有什么特点和适用场景?
      • 答案:I/O 模式下,软件与闪存设备协议紧密交互,需手动处理命令和数据,适用于需要软件精细控制闪存操作的场景,如复杂的闪存编程和配置。线性寻址模式消除了 I/O 模式读取的软件开销,硬件自动处理命令和数据流动,使闪存像 ROM 一样被访问,适用于需要高效读取闪存数据的场景,如程序执行。传统 SPI 模式下,控制器作为普通 SPI 控制器工作,适用于兼容传统 SPI 设备的场景。
    • 问题 2:在 I/O 模式下,流控制的自动模式和手动模式有何区别?
      • 答案:自动模式中,包括片选控制的整个传输序列由硬件完成,传输在 TxFIFO 有数据时开始,TxFIFO 为空时结束且片选自动失效,适合连续数据传输但要求软件及时供应数据。手动模式下,用户控制传输开始,可选择是否控制片选。不控制片选时,传输受 TxFIFO 深度限制;控制片选时,可通过再次填充 TxFIFO 继续传输,无字节数限制,适合大数据传输。
    • 问题 3:线性寻址模式下,AXI 接口的操作有哪些限制和特性?
      • 答案:限制方面,仅支持 AXI 读命令,忽略写操作并返回错误;不支持固定地址突发读,仅支持递增或包装地址突发读;读访问必须字对齐且数据宽度为 32 位;部分 AXI 读地址通道信号被忽略。特性方面,AXI 从接口可接受最多四个未完成的读命令;读命令被转换为 SPI 闪存读指令;有 63 深 RxFIFO 用于数据缓冲;控制器会自动调整地址以实现数据字对齐。
    http://www.lryc.cn/news/610967.html

    相关文章:

  • 信息系统项目管理中的沟通管理实战精解
  • 智慧油站误报率↓77%:陌讯多模态融合算法实战解析
  • 【Git】git提交代码报错Git: husky > pre-commit
  • 【Java面试题】注解,异常相关知识
  • 二维数点问题 1
  • Dell电脑Windows系统更新后声卡驱动无法识别插线耳机问题
  • 第13届蓝桥杯Scratch_选拔赛_初级组_真题2022年1月22日
  • leetcode-python-删除链表的倒数第 N 个结点
  • Leetcode 13 java
  • Linux网络编程:TCP初体验
  • 从递归到动态规划-解码方法Ⅱ
  • 【IDEA】IntelliJ IDEA 中文官方文档全面介绍与总结
  • 以Linux为例补充内存管理基础知识
  • 2025年服务器僵尸攻防战:从AI勒索到量子免疫,构建下一代“数字抗体”
  • Linux 常用命令大全
  • 基于vscode连接服务器实现远程开发
  • vi编辑器makefile的使用以及双向链表
  • 【C++详解】⼆叉搜索树原理剖析与模拟实现、key和key/value,内含优雅的赋值运算符重载写法
  • PHP实战代码解析与应用分享:用户管理、日志,配置管理与文件操作全解析
  • PostgreSQL——插入、更新与删除数据
  • [数组]977.有序数组的平方;209.长度最小的子数组
  • 初始化列表,变量存储区域和友元变量
  • Linux系统目录分析
  • 复杂环境跌倒识别准确率↑31%!陌讯多模态算法在智慧养老的落地实践
  • 2. JS 有哪些数据类型
  • 基于Redis实现短信登录
  • 【CTF】命令注入绕过技术专题:变量比较与逻辑运算
  • Redis Stream:高性能消息队列核心原理揭秘
  • 【OSCP】- eLection 靶机学习
  • 基于ARM+FPGA光栅数据采集卡设计