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架构

spi arch

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的每个下降沿和上升沿各发送一位数据。

spi ddr mode

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)数据位为基准,通过脉冲方式同步整个协议流程,如图所示:

spi ti mode

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(时钟相位)两位的组合决定了数据捕获所用的时钟边沿。

spi clk timing

spi极性相位图

nor-flash通信命令序列

NUQSPI通过命令与nor-flash进行通信。每个命令可包含5个阶段:指令(instruction)、地址(address)、模式(mode)、空闲周期(dummy)和数据(data)。这些阶段中的任一阶段均可配置为跳过,但至少需包含指令、地址、备用字节或数据阶段中的一个。nCS信号在每个命令开始前拉低,并在每个命令执行完毕后重新置高。

spi read flash timing

spi四线读nor-flash时序图

spi write flash timing

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

SPI_SCKDIV格式

字段

位域

读写属性

复位值

描述

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

SPI_SCKMODE格式

字段

位域

读写属性

复位值

描述

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

SPI_DDR_SCKSAMPLE格式

字段

位域

读写属性

复位值

描述

spi_ddr_scksample

11:0

R/W

0x0

串行时钟DDR模式的采样点样本,用于调整采样点寄存器。

使用场景:值为2时,表示在DDR模式标准采样点基础上延迟3个时间单位,延迟单位为总线时钟的一半。

保留

31:12

/

0x0

/

  • SPI_FORCE

  • 地址偏移: 0x0C

SPI_FORCE格式

字段

位域

读写属性

复位值

描述

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

SPI_CSID格式

字段

位域

读写属性

复位值

描述

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

SPI_CSDEF格式

字段

位域

读写属性

复位值

描述

spi_csdef

3:0

R/W

0xf

此寄存器确定空闲状态下cs的值
  • 当寄存器为0xf时,cs0-cs3在空闲状态的值均为1

  • 当寄存器为0x0时,cs0-cs3在空闲状态的值均为0

注意:此寄存器仅在普通模式下有效

保留

31:4

/

0x0

/

  • SPI_CSMODE

  • 地址偏移: 0x18

SPI_CSMODE格式

字段

位域

读写属性

复位值

描述

spi_csmode

1:0

R/W

0x0

片选模式:
  • 2’b00:在每个帧的开始/结束处,由硬件控制cs的置位和复位

  • 2’b10:在初始帧后保持CS持续置位

  • 2’b11:在初始帧后复位CS状态

使用场景:用于配置SPI片选信号的工作模式

保留

31:2

/

0x0

/

  • SPI_VERSION

  • 地址偏移: 0x1C

SPI_VERSION格式

字段

位域

读写属性

复位值

描述

spi_version

31:0

RO

0x00020201

指示版本号2.2.1

说明:此寄存器为只读寄存器,用于标识SPI控制器的版本信息

  • SPI_ADDR_WRAP

  • 地址偏移: 0x20

SPI_ADDR_WRAP格式

字段

位域

读写属性

复位值

描述

spi_offset_addr

31:0

R/W

0x0

SPI flash 偏移地址

使用场景:在XIP模式下,此寄存器可设置偏移地址,通过更改偏移地址可在总线访问期间添加到 flash 访问中

  • SPI_BOUNDARY_CFG

  • 地址偏移: 0x24

SPI_BOUNDARY_CFG格式

字段

位域

读写属性

复位值

描述

spi_boundary_cfg

31:0

RW

0x3ff

边界地址配置规则:边界地址必须是2的幂次方(如16、32、64等)减去1

此寄存器在spi_boundary_en寄存器的控制下进行修改

使用场景:在SPI XIP突发模式下,当突发长度较长时,由于flash采用自动递增模式,某些flash的自动递增大小由边界决定。因此,软件需要告知硬件该边界大小,以便硬件在边界处重新发送地址,从而避免数据溢出。SPI XIP通过将连续地址分割成多个小型突发操作来实现这一机制。

  • SPI_DELAY0

  • 地址偏移: 0x28

SPI_DELAY0格式

字段

位域

读写属性

复位值

描述

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

SPI_DELAY1格式

字段

位域

读写属性

复位值

描述

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

SPI_FIFO_NUM格式

字段

位域

读写属性

复位值

描述

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

SPI_TSIZE格式

字段

位域

读写属性

复位值

描述

spi_tsize

31:0

RW

0xffffffff

TX SPI DMA数据大小配置寄存器

使用场景:在DMA模式下配置DMA要传输的数据量,单位是事务数,每个事务的长度由SPI len决定

  • SPI_RSIZE

  • 地址偏移: 0x38

SPI_RSIZE格式

字段

位域

读写属性

复位值

描述

spi_rsize

31:0

RW

0xffffffff

RX SPI DMA大小配置寄存器

使用场景:在DMA模式下配置DMA要传输的数据量,单位是事务数,每个事务的长度由SPI len决定

  • SPI_FMT

  • 地址偏移: 0x40

SPI_FMT格式

字段

位域

读写属性

复位值

描述

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

SPI_TXDATA格式

字段

位域

读写属性

复位值

描述

spi_txdata

31:0

WO

0x0

发送数据

  • SPI_RXDATA

  • 地址偏移: 0x4C

SPI_RXDATA格式

字段

位域

读写属性

复位值

描述

spi_rxdata

31:0

RO

0x0

接收数据

  • SPI_TX_MARK

  • 地址偏移: 0x50

SPI_TX_MARK格式

字段

位域

读写属性

复位值

描述

spi_tx_mark

2:0

RW

0x0

Tx FIFO水线标记(主/从模式)(用于普通模式,非XIP模式)

注意:可根据硬件具体配置

保留

31:3

/

0x0

/

  • SPI_RX_MARK

  • 地址偏移: 0x54

SPI_RX_MARK格式

字段

位域

读写属性

复位值

描述

spi_rx_mark

2:0

RW

0x0

Rx FIFO水线标记(主/从模式)(用于普通模式,非XIP模式)

注意:可根据硬件具体配置

保留

31:3

/

0x0

/

  • SPI_FCTRL

  • 地址偏移: 0x60

SPI_FCTRL格式

字段

位域

读写属性

复位值

描述

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

SPI_FFMT格式

字段

位域

读写属性

复位值

描述

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

SPI_IE格式

字段

位域

读写属性

复位值

描述

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

SPI_IP格式

字段

位域

读写属性

复位值

描述

spi_tx_irq

0

RO

0x0

发送水线中断挂起(正常模式非XIP)

spi_rx_irq

1

RO

0x0

接收水线中断挂起(正常模式非XIP)

保留

31:2

/

0x0

/

  • SPI_FFMT1

  • 地址偏移: 0x78

SPI_FFMT1格式

字段

位域

读写属性

复位值

描述

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

SPI_STATUS格式

字段

位域

读写属性

复位值

描述

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

SPI_SDR_SCKSAMPLE格式

字段

位域

读写属性

复位值

描述

spi_sdr_scksample

11:0

RW

0x0

串行时钟SDR模式的采样点样本,用于调整采样点寄存器。

使用场景:默认值为0,若配置为3,表示在SDR模式标准采样点基础上延迟3个时间单位,延迟单位为总线时钟的一半。

保留

31:12

/

0x0

/

  • SPI_CR

  • 地址偏移: 0x84

SPI_CR格式

字段

位域

读写属性

复位值

描述

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

SPI_CRC_POLY格式

字段

位域

读写属性

复位值

描述

spi_crc_poly

31:0

RW

0x0

SPI CRC多项式配置寄存器

  • SPI_CRC_TX

  • 地址偏移: 0xC4

SPI_CRC_TX_VALUE格式

字段

位域

读写属性

复位值

描述

spi_crc_tx_value

31:0

RO

0x0

SPI发送CRC值寄存器

  • SPI_CRC_RX

  • 地址偏移: 0xC8

SPI_CRC_RX_VALUE格式

字段

位域

读写属性

复位值

描述

spi_crc_rx_value

31:0

RO

0x0

SPI CRC接收值寄存器

  • SPI_CRC

  • 地址偏移: 0xCC

SPI_CRC_INIT格式

字段

位域

读写属性

复位值

描述

spi_crc_init

31:0

RW

0x0

SPI CRC初始值配置寄存器