.. _ip_ls_intf_spi: SPI ======================= Nuclei SPI(串行外设接口)是一种专为单通道、双通道或四通道nor-flash芯片设计的通信接口。它可在以下三种模式中任意一种下运行: - 普通(寄存器)模式:通过配置相应寄存器实现SPI的发送与接收。 - DMA模式:SPI DMA接口采用流式预处理协议,便于构建包含命令与数据流的SPI传输。 - XIP模式:外部flash被映射到设备地址空间,系统将其视作内部存储器。 主要特性 --------------- - SPI控制器支持通过单通道、双通道、四通道以及半双工单通道协议进行主从操作。 - 可编程时钟极性和相位(CPOL/CPHA)。 - 可配置的最高有效位优先或最低有效位优先。 - 主/从模式可配置频率(最高FPCLK/2)。 - SPI总线忙状态标志。 - 基准控制器提供了一个基于FIFO的接口,用于执行程序化I/O操作。软件通过将帧入队到发送FIFO中来启动传输;当传输完成后,从设备的响应将被放入接收FIFO中。 - 支持SPI摩托罗拉和TI格式。 - 硬件CRC特性。 - 带数据选通的高速读取操作。 - 支持双flash模式。 - SPI自由运行时钟模式。 - 专用SPI控制器实现了一个SPI flash读写序列器。该SPI控制器被复位至允许内存映射读取(XIP)的状态。 - RX 和 TX 的缓冲区或 FIFO 大小可在 硬件具体 级别进行配置。 - 支持SDR和DDR模式。 - 适用于DDR模式的可配置SCK采样点。 功能描述 --------------- SPI架构 ------------ .. figure:: /assets/images/spi_arch.png :alt: spi arch :height: 320px :align: center spi架构图 接口协议模式 ---------------- 半双工模式 `````````` 通过将SPI_CR寄存器中的HSDMODE字段设置为1来启用半双工模式。 在此模式下,仅允许以串行方式发送/接收单个比特。通过SO管脚(其I/O与IO0共用)发送数据,通过SI管脚(其I/O同样与IO0共用)接收数据。 在每个配置为单模式的阶段中,: - IO0(SO/SI)为输入输出模式 - IO1 处于输出模式,并被强制设为 1 - IO2 处于输出模式,并被强制置为 0(以禁用写保护功能)。 - IO3 处于输出模式,并被强制置为 1(以禁用保持功能)。 单线模式 `````````` 传统SPI模式仅允许以串行方式发送/接收单个比特。 在这种模式下,数据通过SO信号发送至 flash 存储器(该信号的I/O与IO0共用)。 从 flash 接收到的数据通过SI(其IO0/ IO1/ IO2/ IO3均处于高电平状态,且I/O与IO1共享)传入。 各相可分别配置为使用此单比特模式,方法是将FFMT/FFMT1中的CMD_PROTO、ADDR_PROTO、MODE_PROTO和DATA_PROTO字段设置为00。 在每个配置为单模的相位中: - IO0(SO)处于输出模式 - IO1(SI)处于输入模式(高阻态) - IO2 处于输出模式,并被强制置为 0(以禁用写保护功能)。 - IO3 处于输出模式,并被强制置为 1(以禁用保持功能)。 双线模式 `````````` 在双SPI模式下,通过IO0/IO1信号同时发送/接收两个比特。 各相可分别配置为使用双SPI模式,方法是将FFMT/FFMT1中的CMD_PROTO、ADDR_PROTO、MODE_PROTO和DATA_PROTO字段设置为01。 在每个配置为双模的相中: - 在读操作的数据阶段,IO0/IO1处于高阻态(输入模式);而在其他所有情况下,则为输出模式。 - IO2 处于输出模式,并被强制设为 0 - IO3 处于输出模式,并被强制置为 1。 四线模式 `````````` 在四线SPI模式下,通过IO0/IO1/IO2/IO3信号同时发送/接收四个比特。 各相可分别配置为使用四线SPI模式,方法是将FFMT/FFMT1中的CMD_PROTO、ADDR_PROTO、MODE_PROTO和DATA_PROTO字段设置为10。 在每个以四路模式配置的相位中,数据阶段进行读操作时,IO0/ IO1/ IO2/ IO3 均处于高阻态(输入);而在其他所有情况下,则作为输出。 八线模式(如果有) ``````````````````` 在八线SPI模式下,八个比特通过IO0/ IO1/ IO2/ IO3/ IO4/ IO5/ IO6/ IO7信号同时进行发送或接收。 各相可分别配置为使用四通道SPI模式,方法是将FFMT/FFMT1中的CMD_PROTO、ADDR_PROTO、MODE_PROTO和DATA_PROTO字段设置为11。 SDR模式 `````````` 正常寄存器模式可通过SPI_CR寄存器配置为SDR模式。默认情况下,DDR_EN位(SPI_CR[2])为0,NUQSPI模块以单倍数据速率(SDR)模式运行。 XIP模式可通过配置FFMT1.DDR_EN寄存器来设置SDR模式。不同相位可分别进行配置,通过将FFMT1中的DDR_EN[3:0]字段分别设为命令、地址、模式或数据,以启用SDR模式。 在SDR模式下,当NUQSPI驱动IO0/SO、IO1、IO2和IO3信号时,这些信号仅在CLK的下降沿发生跳变。 在SDR模式下,当NUQSPI驱动IO0/SO、IO1、IO2和IO3信号时,这些信号仅在CLK的下降沿发生跳变。 在SDR模式下接收数据时,NUQSPI假定Flash存储器也通过CLK下降沿发送数据,并使用CLK的下一个(上升)沿对这些信号进行采样。 DDR模式 `````````` 正常寄存器模式可通过SPI_CR寄存器配置为SDR模式。默认情况下,DDR_EN位(SPI_CR[2])为1,NUQSPI器件以单数据速率(DDR)模式运行。 XIP模式可通过配置FFMT1.DDR_EN寄存器来设置DDR模式。各相可分别通过将FFMT1中的DDR_EN[3:0]字段设为命令、地址、模式或数据,以启用DDR模式。 在DDR模式下,当NUQSPI驱动地址/交替字节/数据阶段的IO0/SO、IO1、IO2、IO3信号时,CLK的每个下降沿和上升沿各发送一位数据。 .. figure:: /assets/images/spi_ddr_mode.png :alt: spi ddr mode :height: 320px :align: center spi DDR模式读flash时序图 主从模式 --------- SPI模块支持主模式和从模式。在主模式下,SCK信号被设置为输出;而在从模式下,SCK信号则被配置为输入。在主模式中,SPI可支持4至32位的数据长度;而在从模式下,SPI仅支持8位、16位和32位的数据长度。此外,从模式下仅支持单数据速率(SDR)模式。 TI模式 ---------------- 通过在SPI_CR寄存器中对ti_mode位域进行特定设置,可将SPI配置为符合TI协议。在此模式下,SCK和SS信号的极性、相位及传输方向,以及数据位的排列顺序均已固定,因此无需再设置CPOL、CPHA和LSBFRST等参数。此时,SS信号以最低有效位(LSB)数据位为基准,通过脉冲方式同步整个协议流程,如图所示: .. figure:: /assets/images/spi_ti_mode.png :alt: spi ti mode :height: 320px :align: center spi TI模式时序图 CRC ---------------- 为了确保传输和接收数据的可靠性,系统中实现了两个独立的33位或两个独立的17位CRC计算器。当最大数据长度为32位时,SPI接口支持5至33位长度的任意CRC多项式;而在外设实例中,由于最大数据长度被限制为16位,此时支持的CRC多项式长度范围则为5至17位。多项式的长度由存储在CRCPOLY寄存器中的值的最高有效位决定,且该值必须大于DSIZE字段所定义的数据帧长度。当应用最大数据长度时,还需额外设置CRC33_17位,以明确多项式字符串的最高有效位,同时确保其长度始终超过数据长度。随后,SPI_CFG1中的CRCSIZE字段用于指定从CRC计算寄存器中传输并作为CRC帧进行比较的最高有效位数量。这一数值与数据帧长度相互独立,但必须等于数据帧长度,或为其整数倍。 通信格式 ------------------------------ 极性相位说明 ---------------- 在SPI通信过程中,接收与发送操作是同时进行的。串行时钟(SCK)同步控制着数据线上信息的移位和采样过程。通信格式取决于时钟相位、时钟极性和数据帧结构。为了实现设备间的协同通信,主设备和从设备必须采用相同的通信格式,并确保正确同步。 软件可通过SPI_SCKMODE寄存器中的CPOL和CPHA位,选择四种可能的时序关系。其中,CPOL(时钟极性)位用于控制在无数据传输期间时钟的空闲状态值。该位对主模式和从模式均有效。若CPOL被复位,则SCK引脚的空闲状态为低电平;若CPOL被置位,则SCK引脚的空闲状态为高电平。 如果CPHA位被置位,SCK引脚上的第二个边沿将捕获首次传输的数据位(若CPOL位复位,则为下降沿;若CPOL位置位,则为上升沿)。每次发生这种类型的时钟跳变时,数据都会被锁存。如果CPHA位被复位,SCK引脚上的第一个边沿将捕获首次传输的数据位(若CPOL位置位,则为下降沿;若CPOL位复位,则为上升沿)。同样,每次出现这种时钟跳变类型时,数据也会被锁存。CPOL(时钟极性)和CPHA(时钟相位)两位的组合决定了数据捕获所用的时钟边沿。 .. figure:: /assets/images/spi_clk_timing.png :alt: spi clk timing :height: 320px :align: center spi极性相位图 nor-flash通信命令序列 --------------------- NUQSPI通过命令与nor-flash进行通信。每个命令可包含5个阶段:指令(instruction)、地址(address)、模式(mode)、空闲周期(dummy)和数据(data)。这些阶段中的任一阶段均可配置为跳过,但至少需包含指令、地址、备用字节或数据阶段中的一个。nCS信号在每个命令开始前拉低,并在每个命令执行完毕后重新置高。 .. figure:: /assets/images/spi_read_flash_timing.png :alt: spi read flash timing :height: 320px :align: center spi四线读nor-flash时序图 .. figure:: /assets/images/spi_write_flash_timing.png :alt: spi write flash timing :height: 320px :align: center spi四线写nor-flash时序图 - 指令阶段(Instruction Phase) 在此阶段,8位指令被配置到FFMT[23:16]寄存器的“读取指令”字段,并配置到FFMT1[7:0]寄存器的“写入指令”字段,随后发送至Flash存储器,以指定所要执行的操作类型。尽管大多数Flash存储器每次只能通过IO0/SO信号接收一位指令(单SPI模式),但指令阶段也可选择每次同时发送2位数据(在双SPI模式下通过IO0/IO1实现)或4位数据(在四SPI模式下通过IO0/IO1/IO2/IO3实现)。这一配置可通过FFMT[9:8]寄存器中的“CMD_PROTO”字段进行设置。当FFMT.CMD_EN = 0时,指令阶段将被跳过,命令序列直接从地址阶段开始。 - 地址阶段(Address Phase) 在地址阶段,会向flash存储器发送1至4字节数据,以指示操作的地址。待发送的地址字节数由FFMT[3:1]寄存器中的addr_len字段配置。地址阶段每次可传输1位(在单SPI模式下通过SO引脚)、2位(在双SPI模式下通过IO0/IO1引脚)或4位(在四SPI模式下通过IO0/IO1/IO2/IO3引脚)。这一配置可通过FFMT[11:10]寄存器中的ADDR_PROTO字段进行设置。当ADDR_LEN = 00时,地址阶段将被跳过,命令序列直接进入下一阶段(如有)。 - 模式阶段(Mode Phase) 在交替字节阶段,1至4个字节会被发送到Flash存储器,通常用于控制操作模式。待发送的交替字节数量由FFMT1[31:28]寄存器中FFMT1.mode_cnt字段配置。而具体要发送的字节,则通过FFMT1.mode_code寄存器指定。在交替字节阶段,每次可发送1位(通过单SPI模式下的SO线)、2位(通过双SPI模式下的IO0/IO1线),或4位(通过四重SPI模式下的IO0/IO1/IO2/IO3线)。这一配置可通过FFMT1[19:18]寄存器中的FFMT1.MODE_PROTO字段来实现。 当FFMT1.MODE_CNT = 0时,跳过交替字节阶段,命令序列直接进入下一阶段。 - Dummy-cycle阶段 在空闲周期阶段,会提供1至31个时钟周期,期间不进行任何数据的发送或接收,以便为flash存储器预留时间,使其能够从容应对后续更高频率时钟下的数据传输阶段。该阶段所持续的时钟周期数由FFMT[7:4]寄存器中FFMT.PAD_CNT字段指定。当PAD_CNT为零时,空闲周期阶段将被跳过,命令序列将直接进入数据阶段(如存在)。 - 数据阶段(Data Phase) 数据阶段可一次发送/接收1位(在单SPI模式下通过SO/SI)、2位(在双SPI模式下通过IO0/IO1),或4位(在四SPI模式下通过IO0/IO1/IO2/IO3)。这一配置可通过FFMT[13:12]寄存器的FFMT.DATA_PROTO字段进行设置。 SPI配置流程 ------------------- 主设备和从设备的配置步骤几乎相同。有关具体模式的设置,请参阅相应章节。当需要初始化标准通信时,请按以下步骤操作: 普通模式配置 --------------------- 1. 正确编写GPIO寄存器:配置GPIO以用于MOSI、MISO和SCK引脚。 2. 请向SPI_SCKDIV、SPI_FMT、SPI_FCTRL、SPI_CR和SPI_SCKMODE寄存器写入适当值,设置其中所有未保留的位及位域,但需注意以下例外情况:首先,确定所使用的SPI模式。若为普通模式下的主模式,则将SPI_CR.MSTR置1,同时SPI_FCTRL.FLASH_EN置0。接着,配置SPI的时钟分频系数:SPI_SCkDIV.DIV = 1;配置相位极性:SPI_SCKMODE.PHA=0,SPI_SCKMODE.POL=0。此外,还需设定SPI协议类型:FMT.PROTO = 0(单线协议);数据大小及格式:FMT.ENDINA = 0(大端模式);数据收发方向:FMT.DIR = 1(仅发送方向);最后,配置SPI数据长度:FMT.LEN = 8(1字节)。 3. 写入SPI_TXDATA寄存器会将待发送的数据填充到txfifo中。 4. 最后,判断SPI是否已发送完毕。如果只有一条数据,只需判断STATUS.BUSY = 0即可。若需等待txfifo中的所有数据全部发送完成,则可判断STATUS.SPI_DONE = 0。 XIP模式配置 --------------------- 1. 正确编写GPIO寄存器:配置GPIO以用于MOSI、MISO和SCK引脚。 2. 请写入SPI_SCKDIV、SPI_FFMT、SPI_FFMT1、SPI_FCTRL、SPI_CR和SPI_SCKMODE寄存器,以设置其中所有未保留位及位字段的正确值,但需注意以下例外情况:首先,将SPI控制器切换至XIP模式,随后设置SPI_CR.MSTR=1,并使能 flash 访问功能,即SPI_FCTRL.FLASH_EN=1。接着,配置SPI时钟分频系数:SPI_SCkDIV.DIV = 1;同时设定时钟相位极性,使PHA=0且POL=0。然后,完成SPI伪命令、地址、空闲周期等信息的配置。对于读取数据的配置,需先启用FFMT.CMD_EN,再分别设置地址长度FFMT.ADD_LEN、读取空闲阶段的长度FFMT.PAD_CNT,以及各阶段所采用的数据协议(分别对应命令FFMT.CMD_PROTO、地址FFMT.ADDR_PROTO和数据FFMT.DATA_PROTO)。最后,配置读取命令FFMT.CMD_CODE与读取空闲数据FFMT.PAD_CODE。 3. 配置 flash 写入命令 FFMT1.WCMD_CODE。如果写入操作需要填充数据,则应配置 FFMT1.WAPD_CNT。 4. 最后,您可以通过ICB总线访问 flash 。 寄存器说明 ---------------> 寄存器偏移及简单描述列表 ------------------------- ===== ================= ==================================================== 偏移 寄存器名称 功能描述 ===== ================= ==================================================== 0x0 SPI_SCKDIV 串行时钟分频器寄存器 0x4 SPI_SCKMODE 采样极性/相位配置寄存器 0x8 SPI_DDR_SCKSAMPLE DDR模式下SPI采样点调整寄存器 0xC SPI_FORCE SPI pad输出使能控制寄存器 0x10 SPI_CSID 片选ID寄存器 0x14 SPI_CSDEF 片选默认设置寄存器 0x18 SPI_CSMODE 片选模式寄存器 0x1C SPI_VERSION 硬件版本指示寄存器 0x20 SPI_ADDR_WRAP SPI flash偏移地址寄存器 0x24 SPI_BOUNDARY_CFG SPI flash边界地址配置寄存器 0x28 SPI_DELAY0 总线延迟控制寄存器0 0x2C SPI_DELAY1 总线延迟控制寄存器1 0x30 SPI_FIFO_NUM 指示发送/接收有效fifo数量寄存器 0x34 SPI_TSIZE SPI DMA发送数据数量配置寄存器 0x38 SPI_RSIZE SPI DMA接收数据数量配置寄存器 0x40 SPI_FMT 帧格式配置寄存器(普通模式,非XIP) 0x48 SPI_TXDATA 发送数据寄存器 0x4C SPI_RXDATA 接收数据寄存器 0x50 SPI_TX_MARK 发送水限配置寄存器(普通模式,非XIP) 0x54 SPI_RX_MARK 接收水限配置寄存器(普通模式,非XIP) 0x60 SPI_FCTRL SPI XIP模式接口控制寄存器(XIP模式,非普通模式) 0x64 SPI_FFMT SPI XIP指令格式寄存器0(XIP模式,非普通模式) 0x70 SPI_IE SPI中断使能寄存器(普通模式,非XIP) 0x74 SPI_IP SPI中断pending寄存器(普通模式,非XIP) 0x78 SPI_FFMT1 SPI XIP指令格式寄存器1(XIP模式,非普通模式) 0x7C SPI_STATUS SPI状态寄存器(普通模式,非XIP) 0x80 SPI_SDR_SCKSAMPLE SDR模式下SPI采样点调整寄存器 0x84 SPI_CR SPI控制寄存器 0xC0 SPI_CRC_POLY SPI CRC多项式配置寄存器 0xC4 SPI_CRC_TX SPI发送CRC值寄存器 0xC8 SPI_CRC_RX SPI接收CRC值寄存器 0xCC SPI_CRC SPI CRC初始值寄存器 ===== ================= ==================================================== 寄存器详细说明 ------------------------- - **SPI_SCKDIV** - 地址偏移: ``0x00`` .. list-table:: SPI_SCKDIV格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_sckdiv - 11:0 - RW - 0x4 - 分频公式为:``spiclk = clk / [2 × (div + 1)]`` - ``12’h0``: 系统时钟频率/2 - ``12’h1``: 系统时钟频率/4 - ``12’h2``: 系统时钟频率/6 - ``12’h3``: 系统时钟频率/8 - ``12’h4``: 系统时钟频率/10 - ``12’h5``: 系统时钟频率/12 - ``12’h6``: 系统时钟频率/14 - ``12’h7``: 系统时钟频率/16 - ``12’hf``: 系统时钟频率/32 - ``12’h1f``: 系统时钟频率/64 **使用场景**:若要更改频率,可使用此寄存器。 **注意:** :DDR模式不支持 ``spi_sckdiv=0``。 * - 预留 - 31:12 - / - 0x0 - / - **SPI_SCKMODE** - 地址偏移: ``0x04`` .. list-table:: SPI_SCKMODE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_cpha - 0 - R/W - 0x0 - 时钟相位 - 1'b0:边沿1 - 1'b1:边沿2 **使用场景**:若要更改SPI时钟相位,可通过此寄存器控制。 **注意:**:不支持DDR模式 * - spi_cpol - 1 - R/W - 0x0 - 时钟极性 - 1'b0:低电平是SCK空闲状态 - 1'b1:高电平是SCK空闲状态 **使用场景**:若要更改SPI时钟极性,可通过此寄存器控制。 **注意:**:不支持DDR模式 * - 保留 - 31:2 - / - 0x0 - / - **SPI_DDR_SCKSAMPLE** - 地址偏移: ``0x08`` .. list-table:: SPI_DDR_SCKSAMPLE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_ddr_scksample - 11:0 - R/W - 0x0 - 串行时钟DDR模式的采样点样本,用于调整采样点寄存器。 **使用场景**:值为2时,表示在DDR模式标准采样点基础上延迟3个时间单位,延迟单位为总线时钟的一半。 * - 保留 - 31:12 - / - 0x0 - / - **SPI_FORCE** - 地址偏移: ``0x0C`` .. list-table:: SPI_FORCE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_force_en - 0 - R/W - 0x1 - SPI输出控制(当不使用其他pad时) **注意**:如果此寄存器开关打开,除了WP pad,所有未使用的SPI pad将被强制输出1,而WP pad的输出值将由spi_force_wp决定 * - spi_force_wp - 1 - R/W - 0x0 - SPI写保护控制 **注意**:此寄存器决定在强制输出生效时WP pad的输出值 * - 保留 - 31:2 - / - 0x0 - / - **SPI_CSID** - 地址偏移: ``0x10`` .. list-table:: SPI_CSID格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_csid - 2:0 - R/W - 0x1 - 片选ID: - 3'd0:片选禁用 - 3'd1:选择cs0 - 3'd2:选择cs1 - 3'd3:选择cs2 - 3'd4:选择cs3 **使用场景**:用于选择不同的SPI片选信号 * - 保留 - 31:3 - / - 0x0 - / - **SPI_CSDEF** - 地址偏移: ``0x14`` .. list-table:: SPI_CSDEF格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_csdef - 3:0 - R/W - 0xf - 此寄存器确定空闲状态下cs的值 - 当寄存器为0xf时,cs0-cs3在空闲状态的值均为1 - 当寄存器为0x0时,cs0-cs3在空闲状态的值均为0 **注意**:此寄存器仅在普通模式下有效 * - 保留 - 31:4 - / - 0x0 - / - **SPI_CSMODE** - 地址偏移: ``0x18`` .. list-table:: SPI_CSMODE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_csmode - 1:0 - R/W - 0x0 - 片选模式: - 2'b00:在每个帧的开始/结束处,由硬件控制cs的置位和复位 - 2'b10:在初始帧后保持CS持续置位 - 2'b11:在初始帧后复位CS状态 **使用场景**:用于配置SPI片选信号的工作模式 * - 保留 - 31:2 - / - 0x0 - / - **SPI_VERSION** - 地址偏移: ``0x1C`` .. list-table:: SPI_VERSION格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_version - 31:0 - RO - 0x00020201 - 指示版本号2.2.1 **说明**:此寄存器为只读寄存器,用于标识SPI控制器的版本信息 - **SPI_ADDR_WRAP** - 地址偏移: ``0x20`` .. list-table:: SPI_ADDR_WRAP格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_offset_addr - 31:0 - R/W - 0x0 - SPI flash 偏移地址 **使用场景**:在XIP模式下,此寄存器可设置偏移地址,通过更改偏移地址可在总线访问期间添加到 flash 访问中 - **SPI_BOUNDARY_CFG** - 地址偏移: ``0x24`` .. list-table:: SPI_BOUNDARY_CFG格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_boundary_cfg - 31:0 - RW - 0x3ff - 边界地址配置规则:边界地址必须是2的幂次方(如16、32、64等)减去1 此寄存器在spi_boundary_en寄存器的控制下进行修改 **使用场景**:在SPI XIP突发模式下,当突发长度较长时,由于flash采用自动递增模式,某些flash的自动递增大小由边界决定。因此,软件需要告知硬件该边界大小,以便硬件在边界处重新发送地址,从而避免数据溢出。SPI XIP通过将连续地址分割成多个小型突发操作来实现这一机制。 - **SPI_DELAY0** - 地址偏移: ``0x28`` .. list-table:: SPI_DELAY0格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_cssck - 7:0 - RW - 0x1 - CS到SCK的延迟时间 **注意**:延迟单位为总线时钟 **使用场景**:用于处理不一致的I/O走线延迟 * - 保留 - 15:8 - / - 0x0 - / * - spi_sckcs - 23:16 - RW - 0x1 - SCK到CS的延迟时间 **注意**:延迟单位为总线时钟 **使用场景**:用于处理不一致的I/O走线延迟 * - 保留 - 31:24 - / - 0x0 - / - **SPI_DELAY1** - 地址偏移: ``0x2C`` .. list-table:: SPI_DELAY1格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_intercs - 7:0 - RW - 0x3 - CS信号最小无效时间 **注意**:延迟单位为总线时钟 **使用场景**:用于处理不一致的I/O走线延迟 * - 保留 - 15:8 - / - 0x0 - / * - spi_interxfr - 23:16 - RW - 0x0 - 最大帧间延迟时间 **注意**:延迟单位为总线时钟 **使用场景**:用于处理不一致的I/O走线延迟 * - 保留 - 31:24 - / - 0x0 - / - **SPI_FIFO_NUM** - 地址偏移: ``0x30`` .. list-table:: SPI_FIFO_NUM格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_tx_num - 2:0 - RO - 0x0 - TX FIFO有效数据数量 **说明**:指示发送FIFO中当前有效的数据个数 * - 保留 - 15:3 - / - 0x0 - / * - spi_rx_num - 18:16 - RO - 0x0 - RX FIFO有效数据数量 **说明**:指示接收FIFO中当前有效的数据个数 * - 保留 - 31:19 - / - 0x0 - / - **SPI_TSIZE** - 地址偏移: ``0x34`` .. list-table:: SPI_TSIZE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_tsize - 31:0 - RW - 0xffffffff - TX SPI DMA数据大小配置寄存器 **使用场景**:在DMA模式下配置DMA要传输的数据量,单位是事务数,每个事务的长度由SPI len决定 - **SPI_RSIZE** - 地址偏移: ``0x38`` .. list-table:: SPI_RSIZE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_rsize - 31:0 - RW - 0xffffffff - RX SPI DMA大小配置寄存器 **使用场景**:在DMA模式下配置DMA要传输的数据量,单位是事务数,每个事务的长度由SPI len决定 - **SPI_FMT** - 地址偏移: ``0x40`` .. list-table:: SPI_FMT格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_proto - 1:0 - RW - 0x0 - SPI协议类型(用于普通模式,非XIP模式): - 2'b00:单线模式 - 2'b01:双线模式 - 2'b10:四线模式 - 2'b11:八线模式 - 2'b100:X16模式 - 2'b111:HDS模式(半双工SPI,3线模式:SS、SCK、双向SIO数据线) **注意**:八线模式或X16模式下,如果硬件不支持8线或X16模式,该值不可写,写入的值将保持原值。从机模式的8线不支持字节模式 * - spi_endian - 2 - RW - 0x0 - SPI位序(用于普通模式,非XIP模式): - 1'b0:大端模式(MSB first) - 1'b1:小端模式(LSB first) * - spi_dir - 3 - RW - 0x0 - SPI I/O方向(用于普通模式,非XIP模式): - 1'b0:Rx模式(双线和四线协议时DQ引脚为三态,单线协议时DQ0引脚正常驱动发送数据) - 1'b1:Tx模式(接收FIFO不填充) * - spi_proto_hi - 4 - RW - 0x0 - 用于扩展SPI_FMT.spi_proto寄存器到高位 * - spi_endian_byte - 5 - RW - 0x0 - SPI字节序(用于普通模式,非XIP模式): - 1'b0:字节高位优先 - 1'b1:字节低位优先 * - 保留 - 15:6 - / - 0x0 - / * - spi_len - 21:16 - RW - 0x8 - 每帧位数(用于普通模式,非XIP模式): - 6'b001000:8位/帧 - 6'b010000:16位/帧 - 6'b100000:32位/帧 **注意**:主模式支持4-32位,从模式仅支持8、16、32位 * - 保留 - 31:22 - / - 0x0 - / - **SPI_TXDATA** - 地址偏移: ``0x48`` .. list-table:: SPI_TXDATA格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_txdata - 31:0 - WO - 0x0 - 发送数据 - **SPI_RXDATA** - 地址偏移: ``0x4C`` .. list-table:: SPI_RXDATA格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_rxdata - 31:0 - RO - 0x0 - 接收数据 - **SPI_TX_MARK** - 地址偏移: ``0x50`` .. list-table:: SPI_TX_MARK格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_tx_mark - 2:0 - RW - 0x0 - Tx FIFO水线标记(主/从模式)(用于普通模式,非XIP模式) **注意**:可根据硬件具体配置 * - 保留 - 31:3 - / - 0x0 - / - **SPI_RX_MARK** - 地址偏移: ``0x54`` .. list-table:: SPI_RX_MARK格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_rx_mark - 2:0 - RW - 0x0 - Rx FIFO水线标记(主/从模式)(用于普通模式,非XIP模式) **注意**:可根据硬件具体配置 * - 保留 - 31:3 - / - 0x0 - / - **SPI_FCTRL** - 地址偏移: ``0x60`` .. list-table:: SPI_FCTRL格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_flash_en - 0 - RW - 0x1 - SPI XIP模式选择 - 1'b0:禁用 - 1'b1:启用 * - spi_flash_wmask_en - 1 - RW - 0x0 - SPI XIP数据掩码选择 - 1'b0:禁用 - 1'b1:启用 **注意**:如果启用此功能,总线写操作将查看总线的wmask信号,启用此功能会影响XIP写性能;如果禁用此功能,XIP写将忽略总线wmask信号 * - spi_flash_wen - 2 - RW - 0x0 - SPI XIP模式写使能 - 1'b0:禁用 - 1'b1:启用 * - spi_flash_burst_en - 3 - RW - 0x0 - SPI XIP突发使能 - 1'b0:禁用 - 1'b1:启用 * - spi_flash_wrap_en - 4 - RW - 0x0 - SPI XIP回绕使能 - 1'b0:禁用(从设备不支持回绕时) - 1'b1:启用(从设备支持回绕时) **工作模式说明**: - 1.突发使能和回绕使能都禁用:无论CPU发出突发还是单次读请求,QSPI-XIP控制器都会将这些请求分解为单独的读请求来访问外部存储器 - 2.突发使能和回绕使能都启用:如果CPU发出的突发请求适合回绕模式,QSPI-XIP控制器将根据CPU的突发回绕行为自动重新发送地址到外部存储器 - 3.仅启用突发使能且与外部存储器特性匹配:如果CPU发出的突发回绕类型与外部存储器支持的突发回绕特性匹配,则只需激活突发使能而不启用回绕使能 * - spi_boundary_en - 5 - RW - 0x0 - SPI XIP边界配置使能 - 1'b0:禁用 - 1'b1:启用 * - 保留 - 31:6 - / - 0x0 - / - **SPI_FFMT** - 地址偏移: ``0x64`` .. list-table:: SPI_FFMT格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_cmd_en - 0 - RW - 0x1 - 使能命令发送(XIP模式) - 1'b0: 禁用 - 1'b1: 启用 **注意**: 启用硬件发送 * - spi_addr_len - 3:1 - RW - 0x3 - 地址字节数(0到4)(XIP模式) * - spi_pad_cnt - 7:4 - RW - 0x0 - Dummy Cycle数(XIP模式) * - spi_cmd_proto - 9:8 - RW - 0x0 - 命令传输协议(XIP模式): - 2'b00: 单线模式 - 2'b01: 双线模式 - 2'b10: 四线模式 - 2'b11: 八线模式 **注意**: 对于八线模式,如果硬件不支持8线模式,该值不可写,写入的值将保持原值 * - spi_addr_proto - 11:10 - RW - 0x0 - 地址和填充传输协议(XIP模式): - 2'b00: 单线模式 - 2'b01: 双线模式 - 2'b10: 四线模式 - 2'b11: 八线模式 **注意**: 对于八线模式,如果硬件不支持8线模式,该值不可写,写入的值将保持原值 * - spi_data_proto - 13:12 - RW - 0x0 - 接收数据字节协议(XIP模式): - 3'b000: 单线模式 - 3'b001: 双线模式 - 3'b010: 四线模式 - 3'b011: 八线模式 - 3'b100: X16模式 - 3'b111: HDS模式(半双工SPI,3线模式: SS、SCK、双向SIO数据线) **注意**: 对于八线模式或X16模式,如果硬件不支持8线或X16模式,该值不可写,写入的值将保持原值 * - spi_endian - 14 - RW - 0x0 - SPI XIP字节序(XIP模式): - 1'b0: 大端模式(MSB first) - 1'b1: 小端模式(LSB first) * - spi_data_proto_hi - 15 - RW - 0x0 - 用于扩展SPI_FFMT.spi_data_proto寄存器到高位 * - spi_cmd_code - 23:16 - RW - 0x3 - 命令字节值(XIP模式) * - spi_pad_code - 31:24 - RW - 0x0 - Dummy Cycle期间传输的前8位(XIP模式) - **SPI_IE** - 地址偏移: ``0x70`` .. list-table:: SPI_IE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_tx_irq_en - 0 - RW - 0x0 - 发送水线使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_rx_irq_en - 1 - RW - 0x0 - 接收水线使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_tx_udr_en - 2 - RW - 0x0 - TX下溢错误中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_rx_ovr_en - 3 - RW - 0x0 - RX上溢错误中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_rx_udr_en - 4 - RW - 0x0 - RX下溢错误中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_t0_ovr_en - 5 - RW - 0x0 - TX上溢错误中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - 保留 - 6 - / - 0x0 - / * - spi_done_en - 7 - RW - 0x0 - SPI发送完成且TX FIFO为空中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - 保留 - 10:8 - / - 0x0 - / * - spi_tx_done_en - 11 - RW - 0x0 - SPI发送完成中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_rx_done_en - 12 - RW - 0x0 - SPI接收完成中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_tifer_en - 13 - RW - 0x0 - SPI TI从模式帧错误中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - spi_cfg_err_en - 14 - RW - 0x0 - SPI配置帧错误中断使能(正常模式非XIP) - 1'b0:禁用 - 1'b1:启用 * - 保留 - 31:15 - / - 0x0 - / - **SPI_IP** - 地址偏移: ``0x74`` .. list-table:: SPI_IP格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_tx_irq - 0 - RO - 0x0 - 发送水线中断挂起(正常模式非XIP) * - spi_rx_irq - 1 - RO - 0x0 - 接收水线中断挂起(正常模式非XIP) * - 保留 - 31:2 - / - 0x0 - / - **SPI_FFMT1** - 地址偏移: ``0x78`` .. list-table:: SPI_FFMT1格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_wcmd_code - 7:0 - RW - 0x2 - 命令值(XIP模式) * - spi_wpad_cnt - 12:8 - RW - 0x0 - Dummy Cycle数(XIP模式) * - spi_pad_cnt_h - 13 - RW - 0x0 - Dummy Cycle高位(XIP模式) * - spi_ddr_en - 17:14 - RW - 0x0 - DDR模式控制(XIP模式): - 位14:命令DDR模式使能 - 位15:地址DDR模式使能 - 位16:模式DDR模式使能 - 位17:数据DDR模式使能 * - spi_mode_proto - 19:18 - RW - 0x0 - SPI模式传输协议(XIP模式): - 2'b00:单线模式 - 2'b01:双线模式 - 2'b10:四线模式 - 2'b11:八线模式 * - spi_mode_code - 27:20 - RW - 0x0 - 模式字节值(XIP模式) * - spi_mode_cnt - 31:28 - RW - 0x0 - XIP模式位数(XIP模式) - **SPI_STATUS** - 地址偏移: ``0x7C`` .. list-table:: SPI_STATUS格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_busy - 0 - RO - 0x0 - SPI传输忙状态(主/从模式)(正常模式非XIP) * - 保留 - 1 - / - 0x0 - / * - spi_ovr - 2 - RW - 0x0 - SPI RX FIFO溢出标志位(正常模式非XIP): - 1'b0:无溢出 - 1'b1:溢出 **注意**:软件写1清0 * - spi_udr - 3 - RW - 0x0 - SPI TX FIFO下溢标志位(正常模式非XIP): - 1'b0:无下溢错误 - 1'b1:下溢错误 **注意**:软件写1清0 * - spi_tx_full - 4 - RO - 0x0 - TX FIFO满标志位(正常模式非XIP) * - spi_rx_empty - 5 - RO - 0x1 - RX FIFO空标志位(正常模式非XIP) * - 保留 - 8:6 - / - 0x0 - / * - spi_rx_udr_err - 9 - RW - 0x0 - SPI RX FIFO下溢标志位(正常模式非XIP): - 1'b0:无溢出 - 1'b1:溢出 **注意**:软件写1清0 * - spi_tx_ovr_err - 10 - RW - 0x0 - SPI TX FIFO溢出标志位(正常模式非XIP): - 1'b0:无下溢错误 - 1'b1:下溢错误 **注意**:软件写1清0 * - spi_tx_empty - 11 - RO - 0x1 - TX FIFO空标志位(正常模式非XIP) * - spi_rx_full - 12 - RO - 0x0 - RX FIFO满标志位(正常模式非XIP) * - spi_done - 13 - RW - 0x0 - SPI发送完成且TX FIFO为空(正常模式非XIP) **注意**:软件写1清0 * - 保留 - 16:14 - / - 0x0 - / * - spi_tx_done - 17 - RW - 0x0 - SPI发送完成(正常模式非XIP) **注意**:软件写1清0 * - spi_rx_done - 18 - RW - 0x0 - SPI接收完成(正常模式非XIP) **注意**:软件写1清0 * - spi_tifer - 19 - RW - 0x0 - SPI TI从模式帧错误(正常模式非XIP) **注意**:软件写1清0 * - spi_cfg_err - 20 - RW - 0x0 - SPI配置帧错误(正常模式或XIP模式) **注意**:软件写1清0 * - 保留 - 31:21 - / - 0x0 - / - **SPI_SDR_SCKSAMPLE** - 地址偏移: ``0x80`` .. list-table:: SPI_SDR_SCKSAMPLE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_sdr_scksample - 11:0 - RW - 0x0 - 串行时钟SDR模式的采样点样本,用于调整采样点寄存器。 **使用场景**:默认值为0,若配置为3,表示在SDR模式标准采样点基础上延迟3个时间单位,延迟单位为总线时钟的一半。 * - 保留 - 31:12 - / - 0x0 - / - **SPI_CR** - 地址偏移: ``0x84`` .. list-table:: SPI_CR格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_mster - 0 - RW - 0x1 - SPI主模式选择 - 1'b0:从模式 - 1'b1:主模式 * - spi_dma_en - 1 - RW - 0x0 - DMA模式使能 - 1'b0:禁用 - 1'b1:使能 * - spi_ddr_en - 2 - RW - 0x0 - 双倍数据率(DDR)模式使能,从模式不支持 - 1'b0:禁用 - 1'b1:使能 * - spi_csi - 3 - RW - 0x0 - 内部从选择(从模式有效) - 1'b0:开启 - 1'b1:关闭 * - spi_csoe - 4 - RW - 0x1 - CS输出使能 - 1'b0:禁用 - 1'b1:使能 * - spi_ssm - 5 - RW - 0x0 - 软件从模式管理 - 1'b0:硬件 - 1'b1:软件 * - 保留 - 7:6 - / - 0x0 - / * - spi_st_dma_tx_en - 8 - RW - 0x0 - DMA发送使能 - 1'b0:禁用 - 1'b1:使能 * - spi_st_dma_rx_en - 9 - RW - 0x0 - DMA接收使能 - 1'b0:禁用 - 1'b1:使能 * - spi_st_dma_rcontinous_mode - 10 - RW - 0x0 - DMA接收连续模式 - 1'b0:禁用 - 1'b1:使能 * - spi_st_dma_tcontinous_mode - 11 - RW - 0x0 - DMA发送连续模式 - 1'b0:禁用 - 1'b1:使能 * - spi_ti_mode - 12 - RW - 0x0 - TI模式 - 1'b0:禁用 - 1'b1:使能 * - spi_receive_fifo_enable - 13 - RW - 0x1 - RX FIFO接收数据使能 - 1'b0:禁用 - 1'b1:使能 * - spi_crc_enable - 14 - RW - 0x1 - CRC使能 - 1'b0:禁用 - 1'b1:使能 * - spi_crc_len - 20:15 - RW - 0x0 - CRC长度配置,支持4位-32位 * - spi_fdm_clk_mode - 21 - RW - 0x0 - SPI自由时钟模式 - 1'b0:禁用 - 1'b1:使能 * - spi_double_flash_mode - 22 - RW - 0x0 - SPI双 flash 模式 - 1'b0:禁用 - 1'b1:使能 * - spi_dqs_mode - 23 - RW - 0x0 - DQS模式配置 * - spi_st_ti_mode - 24 - RW - 0x0 - ST-TI模式配置 * - spi_dqs_dm_en - 25 - RW - 0x0 - DQS数据掩码使能 * - spi_rx_fifo_clr_r - 26 - RW - 0x0 - RX FIFO清除寄存器 * - spi_tx_fifo_clr_r - 27 - RW - 0x0 - TX FIFO清除寄存器 * - 保留 - 31:28 - / - 0x0 - / - **SPI_CRC_POLY** - 地址偏移: ``0xC0`` .. list-table:: SPI_CRC_POLY格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_crc_poly - 31:0 - RW - 0x0 - SPI CRC多项式配置寄存器 - **SPI_CRC_TX** - 地址偏移: ``0xC4`` .. list-table:: SPI_CRC_TX_VALUE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_crc_tx_value - 31:0 - RO - 0x0 - SPI发送CRC值寄存器 - **SPI_CRC_RX** - 地址偏移: ``0xC8`` .. list-table:: SPI_CRC_RX_VALUE格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_crc_rx_value - 31:0 - RO - 0x0 - SPI CRC接收值寄存器 - **SPI_CRC** - 地址偏移: ``0xCC`` .. list-table:: SPI_CRC_INIT格式 :widths: 15 10 15 15 45 :header-rows: 1 * - 字段 - 位域 - 读写属性 - 复位值 - 描述 * - spi_crc_init - 31:0 - RW - 0x0 - SPI CRC初始值配置寄存器