跳转至

存储器接口

DDR控制器

概述

DDRC(DDR SDRAM Controller)实现对动态存储器DDR2/3/3L SDRAM的存取控制。

说明:

  • 文中DDR2 SDRAM、DDR3 SDRAM和DDR3L SDRAM共用之处简写为DDR2/3/3L SDRAM。
  • 根据功能不同,将Hi3516CV610分为10B/00S/20S/00G/20G型号。

特点

DDRC的功能特点

Hi3516CV610-10B:

  • 支持最大存储空间为512Mb。
  • 仅支持小端存储模式。
  • 支持DDR2 SDRAM接口最高工作频率为666.5MHz,即数据速率为1.333Gbps。
  • 支持DDR2 SDRAM的Power Down低功耗模式。
  • 支持单通道。

Hi3516CV610-20S/20G:

  • 支持最大存储空间为1Gb。
  • 仅支持小端存储模式。
  • 支持DDR3/3L SDRAM接口最高工作频率为1066.5MHz,即数据速率为2.133Gbps。
  • 支持DDR3/3L SDRAM的Power Down低功耗模式。
  • 支持单通道。

Hi3516CV610-00S/00G:

  • 支持最大存储空间为4Gb。
  • 仅支持小端存储模式。
  • 支持DDR3/3L外接SDRAM数据总线位宽为16bit。
  • 支持DDR3/3L SDRAM接口最高工作频率为1066.5MHz,即数据速率为2.133Gbps。
  • 支持DDR3/3L SDRAM的Power Down低功耗模式。
  • 支持单通道。

功能描述

应用框图

DDRC实现了SoC系统中的CPU等主设备对DDR2/3/3L SDRAM的数据访问。通过CPU配置DDRC的时序参数寄存器,可以支持符合JEDEC标准DDR2/3/3L SDRAM器件。

DDRC为单通道16bit,连接示意图如图1和图2所示。

图 1 DDRC单通道模式下,通道与一片16bit 位宽DDR2 SDRAM的互联示意图

连接说明:

单通道模式下,16bit DDR2 SDRAM由一片数据总线宽度为16bit的存储器件组成。DDRC/DMC 对应的命令控制信号:DDR_CS_N、DDR_CK、DDR_CKB、DDR_CKE、DDR_RAS_N、DDR_CAS_N、DDR_WE_N、DDR_A[14:0]、DDR_BA[2:0],与DDR2 SDRAM颗粒的命令控制信号相连,DDRC的命令控制总线是1驱1的连接模式。

图 2 DDRC单通道模式下,通道与一片16bit 位宽DDR3/3L SDRAM的互联示意图

连接说明:

单通道模式下,16bit DDR3/3L SDRAM由一片数据总线宽度为16bit的存储器件组成。DDRC/DMC 对应的命令控制信号:DDR_CS_N、DDR_CK、DDR_CKB、DDR_CKE、DDR_RESET_N、DDR_RAS_N、DDR_CAS_N、DDR_WE_N、DDR_A[14:0]、DDR_BA[2:0],与DDR3/3L SDRAM颗粒的命令控制信号相连,DDRC的命令控制总线是1驱1的连接模式。

功能原理

DDRC接口时序满足JEDEC标准,通过发送DDR2/3/3L SDRAM的命令字,完成对DDR2/3/3L SDRAM的数据访问和状态控制。包括DDR2/3/3L SDRAM的读写访问、自动刷新、低功耗控制等功能。

命令真值表

DDRC支持DDR2 SDRAM的读写和控制命令字。

DDR2 SDRAM的真值表详细的信息请参阅JEDEC DDR2标准和器件手册。

DDR2 SDRAM的命令真值表如表1所示。更加详细的信息请参阅JEDEC标准和器件手册。

表 1 DDR2命令真值表

FUNCTION

CKE

CSN

RASN

CASN

WEN

ADDR

BA

12:11

AP(10)

9:0

DESELECT

H

H

X

X

X

X

X

X

X

ACTIVE

H

L

L

H

H

Row Address(RA)

BA

READ

H

L

H

L

H

V

V

V

BA

WRITE

H

L

H

L

L

V

V

V

BA

PRECHARGE

H

L

L

H

L

V

L

V

BA

PRECHARGE ALL

H

L

L

H

L

V

H

V

V

AUTO REFRESH

H

L

L

L

H

V

V

V

V

SELF REFRESH ENTRY

H->L

L

L

L

H

V

V

V

V

SELF REFRESH EXIT

L->H

L

H

H

H

V

V

V

V

MODE REGISTER SET

H

L

L

L

L

V

V

V

V

H:表示高电平;L:表示低电平;V:表示有效;X:表示不关心。

DDRC支持DDR3/3L SDRAM的读写和控制命令字。

DDR3/3L SDRAM的命令真值表如表2所示。更加详细的信息请参阅JEDEC标准和器件手册。

表 2 DDR3/3L命令真值表

FUNCTION

CKE

CSN

RASN

CASN

WEN

ADDR

BA

14:11

AP(10)

9:0

DESELECT

H

H

X

X

X

X

X

X

X

ACTIVE

H

L

L

H

H

Row address

BA

READ

H

L

H

L

H

V

V

V

BA

WRITE

H

L

H

L

L

V

V

V

BA

PRECHARGE

H

L

L

H

L

V

L

V

BA

PRECHARGE ALL

H

L

L

H

L

V

H

V

V

AUTO REFRESH

H

L

L

L

H

V

V

V

V

SELF REFRESH ENTRY

H->L

L

L

L

H

V

V

V

V

SELF REFRESH EXIT

L->H

L

H

H

H

V

V

V

V

MODE REGISTER SET

H

L

L

L

L

V

V

V

V

ZQCL

H

L

H

H

L

V

H

V

V

ZQCS

H

L

H

H

L

V

L

V

V

H:表示高电平;L:表示低电平;V:表示有效;X:表示不关心。

自动刷新

DDRC自动产生周期性AUTO REFRESH命令,完成对DDR2/3/3L SDRAM的刷新操作。常温下,DDR2/3/3L SDRAM自动刷新操作的周期为7.8us。实际值以器件手册为准。

不同温度下SDRAM器件对刷新周期要求可能不同,实际配置值请参见SDRAM器件手册。

低功耗管理

DDRC支持两种模式的低功耗管理:普通低功耗模式和自刷新低功耗模式。

使能SDRAM自动低功耗后,系统处于空闲状态时(DDRC总线接口一定时间内无读写DDR访问),自动控制DDR2/3/3L SDRAM进入到普通低功耗模式。

当系统需要进入到待机模式时,可控制DDR2/3/3L SDRAM进入到自刷新低功耗模式。该模式下可以将DDR2/3/3L SDRAM的功耗降至最低,同时保持DDR2/3/3L SDRAM中的数据,但是此时系统不能访问DDR2/3/3L SDRAM。

安全功能

DDRC支持安全功能,安全功能使能时,对于越权的读写访问总线会返回BUS ERROR,同时保护DDR数据不被改写/读出。

DDRC支持安全功能寄存器读写保护,只有安全CPU才可以读写寄存器,非安全CPU无法对安全相关寄存器进行读写。

详见软件文档《Hi35xxVxxx安全子系统使用说明》。

流量统计和命令latency统计功能

DDRC支持流量统计功能:可以统计接口读写流量。可以对指定ID访问读/写流量单独统计。可以对总体读/写流量统计。支持DDR接口利用率统计,统计计数器支持连续统计和单次统计,当为连续统计时计数器为非饱和计数器,计数器记到最大值后会卷绕,方便系统进行连续统计,所以需要系统在计数器未卷绕之前将计数器值读出。当为单次统计时,统计计数器在进行统计时间到达后停止统计,系统可以用此功能统计瞬时的流量以及latency。

工作方式

软复位

DDRC不能进行单独的复位操作。只有在全局软复位时,才能复位DDRC。复位之后,需要按照初始化流程进行重新初始化DDR2/3/3L SDRAM。

DDR初始化配置流程

系统上电之后,必须先完成DDR2/3/3L SDRAM的初始化操作,系统才能访问DDR SDRAM。在进行初始化之前需要注意以下几点:

  • 对DDR2/3/3L SDRAM进行上电操作时,需要遵循JEDEC 标准。
  • 该初始化过程需要在系统进入NORMAL模式后进行。

整个DDR子系统的初始化步骤如下:

  1. 配置DDR的地址区域映射,地址区域属性。
  2. 配置DMC的工作模式、时钟频率、时序参数等。
  3. 配置DDRPHY的工作模式,时序参数,DDRPHY IO驱动和ODT阻抗,读写命令通路 的delay参数等。
  4. 启动DDRPHY进行初始化。
  5. 等待DDRPHY初始化完成。
  6. 配置DMC使能auto refresh命令发送功能。

完成以上步骤以后,DDR2/3/3L SDRAM就可以正常工作。

说明:针对不同的DDR颗粒,所配置的寄存器的值可能会有部分不同,但配置过程需按上述步骤进行。

Flash Memory控制器

概述

FMC(Flash Memory Controller)提供存储控制器接口连接片外SPI NAND Flash或者SPI NOR Flash,从而完成数据的存取。

特点

FMC的主要特点如下:

  • 提供一个4KB+256Byte片内缓存,提高读取速度。
  • 支持外接双片选(外接器件SPI NAND Flash或者SPI NOR Flash)。
  • 支持SPI NOR Flash、SPI NAND Flash两种类型的器件。
  • 支持Standard SPI、Dual-Output/Dual-Input SPI、Quad-Output/Quad-Input SPI、Dual I/O SPI、Quad I/O SPI五种SPI接口类型。
  • 支持多种规格的SPI NOR Flash器件

    • 支持SPI NOR DTR /STR模式的读数据。
    • 支持器件最大容量32MB。
  • 支持多种规格的SPI NAND Flash器件。

    • 支持SPI NAND DTR /STR模式的读数据。
    • 支持页大小2K、4K的器件。
    • 支持块大小64 Pages/Block、128 Pages/Block的器件。
    • 支持器件最大容量512MB。
  • 支持SPI NOR Flash、SPI NAND Flash的CS0的BOOT功能;

    • 支持1MB的Boot空间。
    • 支持Boot模式下,控制器先自动发送器件的复位命令再进行读数据操作(仅在SPI NAND Flash模式下发送复位命令)。
    • 支持FAST READ命令,最高可提频至99MHz进行读操作。
    • 支持自动跳坏块功能(SPI NAND Flash),最大可以跳过连续4个坏块。
    • 支持自适应Boot功能(SPI NAND Flash),控制器自动找到正确的Page-size、ECC类型、Block-size配置。
    • 对SPI NAND Flash支持1线和4线Boot;对SPI NOR Flash仅支持1线Boot。
    • 对SPI NOR Flash支持3Byte地址器件和4Byte地址器件的Boot。
  • 支持SPI NOR Flash、SPI NAND Flash的DMA读写功能;

    • SPI NAND Flash支持内置DMA模式读写操作。写操作都是以整个page为单位进行;读操作则支持读整个page、只读控制信息(只读OOB)。
    • 对SPI NOR Flash支持DMA读写操作,读写长度可配置。
  • 支持寄存器操作方式手动配置命令组合,从而完成各种命令。(仅支持在ECC0模式下的手动配置操作)。

  • 支持ECC功能(仅对SPI NAND Flash)。
  • 支持7种中断:操作完成、编程操作失败、ECC校验可纠错、ECC校验告警、ECC校验不可纠错、总线操作错误、DMA传输错误。
  • 支持低功耗模式,自动时钟门控。

功能描述

接口描述

FMC可以支持五种SPI接口类型,五种类型分别为Standard SPI、Dual-Output/Dual-Input SPI、Quad-Output/Quad-Input SPI、Dual I/O SPI、Quad I/O SPI类型,Standard SPI、Dual I/O SPI、Quad I/O SPI类型支持STR、DTR模式。

Standard SPI模式

Standard SPI接口模式具有1bit数据输入线和1bit数据输出线。图1为Standard SPI接口模式写操作时序图。

图 1 Standard SPI接口模式写操作时序图

时序说明:

  • command/address/dummy cycles以单bit串行方式在sf_dio_0线上输出;
  • Data以单bit串行方式在sf_dio_0线上输出。

图2为Standard SPI接口模式读操作时序图。

图 2 Standard SPI接口模式读操作时序图

时序说明:

  • command/address/dummy cycles以单bit串行方式在sf_dio_0线上输出。
  • Data以单bit串行方式在sf_dio_1线上输入。
Dual-Output/Dual-Input SPI模式

Dual-Output/Dual-Input SPI接口时序图1所示。

图 1 Dual-Output/Dual-Input SPI接口时序图

时序说明:

  • command/address/dummy cycles以单bit串行方式在sf_dio_0线上输出。
  • Data以2bits方式在sf_dio_0/sf_dio_1线上输出(写)或输入(读)。
Dual I/O SPI模式

Dual I/O时序图为图1和图2所示。

图 1 Dual I/O SPI模式STR时序图

时序说明:

  • command以单Bit串行方式在sf_dio_0线上输出。
  • address/dummy cycles以2bits方式在sf_dio_0/sf_dio_1线上输出。
  • Data以2bits方式在sf_dio_0/sf_dio_1线上输出(写)或输入(读)。

图 2 Dual I/O SPI模式DTR时序图

时序说明:

  • command以单Bit串行方式在sf_dio_0线上输出。
  • address/dummy cycles以2bits 双沿有效方式在sf_dio_0/sf_dio_1线上输出。
  • Data以2bits双沿有效方式在sf_dio_0/sf_dio_1线上输入(读)。
  • DTR模式只支持读。
Quad-Output/Quad-Input SPI

Quad-Output/Quad-Input SPI时序图为图1所示。

图 1 Quad-Output/Quad-Input SPI模式时序图

时序说明:

  • command/address/dummy cycles以单bit串行方式在sf_dio_0线上输出。
  • Data以4bits方式在sf_dio_0/sf_dio_1/sf_dio_2/sf_dio_3线上输出(写)或输入(读)。
Quad I/O SPI模式

Quad I/O SPI模式时序图如图1和图2所示。

图 1 Quad-I/O SPI模式接口时序图

时序说明:

  • command以单Bit串行方式在sf_dio_0线上输出。
  • address/dummy cycles以4bits方式在sf_dio_0/sf_dio_1/sf_dio_2/sf_dio_3线上输出。
  • Data以4bits方式在sf_dio_0/sf_dio_1/sf_dio_2/sf_dio_3线上输出(写)或输入(读)。

图 2 Quad-I/O SPI模式DTR接口时序图

时序说明:

  • command以单Bit 单沿数据串行方式在sf_dio_0线上输出。
  • address/dummy cycles以4bits双沿方式在sf_dio_0/sf_dio_1/sf_dio_2/sf_dio_3线上输出。
  • Data以4bits双沿采样方式在sf_dio_0/sf_dio_1/sf_dio_2/sf_dio_3线上输入。

SPI接口时序说明

SPI接口时序以及参数说明如图1所示。

图 1 SPI输出时序图

注:时序配置对应TIMING_SPI_CFG寄存器。

tcsh:sf_cs_n hold time。

tcss:sf_cs_nsetup time。

tshsl:sf_cs_n deselect time。

SPI NAND Flash地址说明

对于SPI NAND Flash器件地址,如表1。其中1st Byte和2nd Byte为列地址,3rd Byte,4th Byte和5th Byte为行地址。

表 1 FLASH地址分配表

Byte数

Bit0

Bit1

Bit2

Bit3

Bit4

Bit5

Bit6

Bit7

1st Byte

A0

A1

A2

A3

A4

A5

A6

A7

2nd Byte

A8

A9

A10

A11

A12*

A13*

0

0

3rd Byte

A12

A13

A14

A15

A16

A17

A18

A19

4th Byte

A20

A21

A22

A23

A24

A25

A26

A27

5th Byte*

A28*

A29*

0

0

0

0

0

0

说明:

  • A0-A11位对2KB page_size配置为有效列地址,A0-A12对4KB page_size配置为有效列地址。
  • A12位(2KB page_size),A13位(4KB page_size),对于XXX器件为plane地址,但对于其他厂家没有plane地址的概念。
  • A28和A29位,需要根据具体器件看是否需要,如果没有的话,输出为0。

在下发SPI NAND Flash的读写操作时,操作时根据具体的操作下发行列地址。

  • 写操作在LOAD操作时配置列地址,在PROGRAM操作时配置行地址;
  • 读操作在PAGE READ TO CACHE操作时配置行地址,在READ操作时配置列地址;

内置DMA操作,地址下发由控制器完成,软件需要根据操作地址配置FMC_ADDRL和FMC_ADDRH。其中FMC_ADDRL配置值为1st Byte-4th Byte,FMC_ADDRH配置值为5th Byte。

说明:

  • 对于2KB page_size配置,A12位当成plane地址,不支持A12有其他含义,影响器件的读写结果。
  • 对于4KB page_size配置,A13位当成plane地址,不支持A13有其他含义,影响器件的读写结果。

Boot功能

FMC默认处于Boot模式,可支持直接从Flash中读取数据进行启动。CPU可以直接读取0x00_0000~0x0F_FFFF地址范围的数据,整个空间大小为1MB。

SPI NOR Flash的Boot功能

由于SPI NOR Flash的地址空间是连续的,因此1MB的Boot数据直接映射到SPI NOR Flash的地址空间0x00_0000~0x0F_FFFF。

开始Boot之前,当CPU第一次读取Boot空间数据时。FMC会通过Read Status 命令获取器件的WIP,若WIP为1,则FMC会继续获取,直到WIP返回值为0。FMC才开始向Flash发送读操作。

SPI NAND Flash的Boot功能

对于SPI NAND Flash,由于其地址空间不连续且存在坏块的可能,因此1M的Boot数据并不能直接映射到Flash中,并且Boot还需要page_size、block_size信息进行地址译码。

FMC支持自适应Boot功能,能够根据Block0的数据自动适配器件的ecc_type、page_size、block_size信息。控制器要求物理Block0必须为好块,其他块为坏块则可以自动跳过。

FMC在Boot时,遇到坏块之后能够自动跳过坏块去寻找好块并读取Boot信息。每次跳坏块过程最大可以连续跳过4个坏块,若在一次跳坏块的过程中连续出现5个物理坏块,则Boot失败。整个Boot过程可以出现若干次跳坏块过程,当遇到好块时,此次跳坏块过程结束,若再次遇到坏块,则开始一次新的跳坏块过程。

FMC逻辑对坏块的判定条件有三个:

  • 当前物理块的第一个页和最后一个页坏块标记为0xff。
  • 当前物理块的第一个页和最后一个页空块标记为0x00。
  • 当前物理块的第一个页和最后一个页的OOB所在纠错单元ECC可纠错。

只有以上三个条件同时满足,FMC逻辑才能判定这个块为好块,否则判定为坏块。

寄存器方式操作

软件配置操作相关寄存器,如操作命令、地址等,最后配置FMC_OP寄存器下发操作,控制器根据软件配置值,下发操作给器件。如果还需要向器件传输数据,那会使用内部的buffer来传输数据。

read id,set feature,erase等操作都是通过此种方式下发操作。

寄存器操作方式可以组合出所有的器件操作,可以单独下发指令、地址、传输数据等。

内置DMA操作方式

FMC支持使用内置DMA模式进行读写操作以提高访问速度。通过此种方式,FMC可以通过总线直接访问DDR。

  • DMA写操作:SPI NOR Flash支持从DDR的任意地址搬运任意长度的数据写到器件的任意地址,对于SPI NAND Flash,只支持按page的写操作。
  • DMA读操作:和写操作相同,SPI NOR Flash支持从器件的任意地址搬运任意长度的数据读取到DDR的任意地址。对于SPI NAND Flash支持读整个page,只读OOB操作。
  • 只读OOB操作:当软件只需要软件管理信息(如坏块标记,空块标记等)时,不需要读取整个page的数据出来,只需要读取控制信息部分,使用只读OOB方式就能完成此目的。

ECC校验功能

对于SPI NAND Flash,FMC支持ECC校验纠错功能。支持的最大纠错能力有3种分别为:8bit /1KB、16bit /1KB和24bit /1KB。以8bit ECC为例,表示的含义为1KB1数据中最大能纠正8bit错误。

说明:

1:1KB纠错单元包括ECC保护数据、OOB信息以及ECC码。纠错算法按纠错单元进行计算。可以认为DATA+OOB为计算ECC的数据,对于2KB page_size,每个纠错单元数据大小为(DATA+OOB)/2,对于4KB page_size,每个纠错单元数据大小为(DATA+OOB)/4。因此纠错单元实际大小大于1KB。

  • OOB为软件管理信息部分,具体见数据结构描述。
  • DATA为真实数据,2KB page_size为2048Byte,4KB page_size为4096Byte。

当超过最大纠错能力时,可以上报不可纠错中断。FMC提供告警中断,当一次纠错过程错误位数等于或大于配置的错误阈值(FMC_ERR_THD[fmc_err_thd]),则会上报错误告警,提示软件此次操作错误位数已经达到预设值。若有一个或多个纠错单元出现错误bit,并且所有纠错单元的错误bit数均未达到错误阈值和不可纠错值,则可纠错中断标志FMC_INT[err_val_int]会变成1。

当读取一个page数据时,若所有纠错单元中存在某个纠错单元出现不可纠错,则上报不可纠错中断状态;否则如果存在错误告警纠错单元,则上报纠错告警状态;如果有纠错,但纠错位数没有达到错误阈值,则可以上报可纠错中断状态。

工作在SPI NOR Flash模式下,不使能ECC校验功能。当配置FMC_CFG[ecc_type]为零,对于SPI NAND Flash工作在无ECC校验功能模式,控制器搬运数据不做数据结构处理,直接进行flash数据的搬运。

TIMEOUT功能

FMC为DMA写操作提供TIMEOUT机制,控制器在等待DMA写操作结束期间,会不断地发送GET FEATURE操作来查询写操作是否结束;对于SPI NOR Flash,控制器则会在等待器件发送RDSR操作来查询操作是否结束。FMC等待的时间若超过寄存器FMC_TIMEOUT_WR[timeout_wr]的配置值,则结束DMA写操作,并上报FMC_INT[op_fail]中断。

工作流程

初始化流程

初始化流程如下:

  1. (如果需要调整Timing参数)根据器件配置寄存器TIMING_SPI_CFG(SPI NAND Flash或者SPI NOR Flash)。
  2. 根据对接的FLASH器件手册,配置FMC配置寄存器(FMC_CFG)。主要配置有器件接口类型,ecc_type、page_size等。
  3. 对于SPI NOR Flash,如果器件是4Byte地址器件,而默认是3Byte地址模式,则参考“SPI NOR Flash地址模式切换流程”完成4Byte地址模式切换。
  4. 初始化完成,可根据具体的操作配置寄存器下发操作。

FMC_OP操作流程(寄存器操作方式)

对器件的寄存器操作(如读ID或者配置器件寄存器)使用配置FMC_OP下发操作的方式完成。操作步骤如下:

  1. 配置FMC_CFG的ecc_type为0。
  2. 如果是写寄存器操作(如配置FLASH的配置寄存器),先从Buffer访问起始地址开始写入期望的操作数据。
  3. 根据器件操作需要,配置操作命令FMC_CMD,器件操作地址FMC_ADDRL,读写数据个数FMC_DATA_NUM等操作类寄存器。
  4. 根据下发的器件操作,匹配FMC_OP配置FMC_OP_CFG寄存器。
  5. 配置FMC_OP寄存器下发操作,具体配置值参考FMC_OP寄存器描述。
  6. 如果使用查询方式,查询FMC_OP[reg_op_start]位为0表示操作完成;如果使用中断方式,检测到FMC_INT[op_done_init],表示操作完成。
  7. 对于读寄存器操作(如读ID操作),在步骤 6完成后读出的寄存器存放在buffer中,软件可以从中读出器件寄存器值。

读器件状态寄存器操作

如果想要读取器件的状态寄存器,提供一种简易操作方法。具体如下:

  1. 配置FMC_OP寄存器下发操作(配置FMC_OP [read_status_en]和FMC_OP [reg_op_start]为1)。
  2. 读出的状态寄存器存放在FMC_FLASH_INFO寄存器中。

SPI NOR Flash地址模式切换流程

对于SPI NOR Flash器件,支持3Byte与4Byte两种Flash地址模式,可通过将管脚上下拉来选择初始默认地址模式,也可以在芯片启动起来之后通过配置寄存器动态切换地址模式。

如果默认是3Byte模式启动,但器件是4Byte地址模式器件,在芯片启动起来之后切换Flash地址模式的步骤如下:

  1. 确保无Flash操作或之前的Flash操作已完成。
  2. 根据器件要求,用寄存器操作方式配置器件的相关寄存器发送特定命令配置Flash进入4B模式。
  3. 配置FMC的FMC_CFG [spi_nor_addr_mode]设置为4B模式,完成3Byte模式到4Byte模式切换。

说明:

具体SPI NOR Flash地址模式切换的命令,请查找相关器件手册。

擦除操作流程(SPI NAND Flash和SPI NOR Flash)

对于flash操作,在编程操作前,都必须进行擦除,在擦除操作前还必须完成WREN操作。擦除操作参考流程(查询方式)如图1所示。

图 1 擦除操作流程图

说明:

  • 上图中为查询方式,如果使用中断方式,查询FMC_OP [reg_op_start]操作变成中断处理方式,检测到FMC_INT [op_done_init],表示操作完成。
  • ERASE操作过程,配置的擦除指令及操作地址需要根据具体器件手册进行配置。

内置DMA读操作流程(FMC_OP_CTRL读操作)

使用内置DMA方式进行读数据的操作流程如下:

  1. 配置寄存器FMC_CFG [op_mode]为1,确保控制器处于NORMAL模式。
  2. 配置FMC_ADDRL和FMC_ADDRH,配置器件操作地址。对于SPI NOR Flash只需要配置FMC_ADDRL。

    须知:

    对于SPI NOR Flash,DMA操作时地址周期数由FMC_CFG[spi_nor_addr_mode]决定:支持3Byte地址模式和4Byte地址模式选择。对于SPI NAND Flash,控制器默认为5Byte地址模式,且不可配置。

  3. 配置FMC_DMA_SADDR_OOB寄存器,配置在DDR中存放数据的起始地址。

    须知:

    • 对于SPI NAND Flash,配置DDR地址时,要求4Byte地址对齐。
    • 对于SPI NAND Flash的ECC0模式,FMC_DMA_LEN需要4Byte对齐。
  4. 配置FMC_DMA_LEN寄存器。在SPI NOR Flash模式下,需要配置FMC_DMA_LEN为读取数据的长度;在SPI NAND Flash的ECC0模式下,则需要配置Spare区数据长度;其他操作中则不需要配置此寄存器。

  5. 配置FMC_OP_CFG寄存器,根据下发的读操作要求进行配置。

    • 对于SPI NAND Flash和SPI NOR Flash,要根据器件读操作时序中dummy周期数以及SPI接口类型,配置FMC_OP_CFG[dummy_num] 和FMC_OP_CFG[mem_if_type]。
    • 配置FMC_OP_CFG[fm_cs],选择操作片选。
  6. 配置FMC_OP_CTRL寄存器,配置FMC_OP_CTRL[dma_op_ready]为1,下发FMC读FLASH操作。

    • 配置FMC_OP_CTRL[rw_op]为零,表示DMA读操作。
    • 对于SPI NAND Flash的只读OOB操作,需配置FMC_OP_CTRL [rd_op_sel]。
    • 对于SPI NAND Flash和SPI NOR Flash,需要配置FMC_OP_CTRL[rd_opcode],根据器件READ指令进行配置。
  7. 使用查询方式,检测到FMC_OP_CTRL[0]变低,表示读操作已经完成,数据已经写入DDR中;使用中断方式,检测到FMC_INT [op_done_int]变高,表示读操作已经完成,数据已经写入DDR中。

内置DMA写操作流程(FMC_OP_CTRL写操作)

使用内置DMA方式进行写FLASH的操作,流程如下:

  1. 配置寄存器FMC_CFG [op_mode]为1,确保控制器处于NORMAL模式。
  2. 配置FMC_ADDRL和FMC_ADDRH,配置器件操作地址。对于SPI NOR Flash只需要配置FMC_ADDRL。

    须知:

    对于SPI NOR Flash,DMA操作时地址周期数由FMC_CFG[spi_nor_addr_mode]决定:支持3Byte地址模式和4Byte地址模式选择。对于SPI NAND Flash,控制器默认为5Byte地址模式,且不可配置。

  3. 配置FMC_DMA_SADDR_D0和FMC_DMA_SADDR_OOB寄存器,配置从DDR中搬运数据的起始地址。SPI NOR Flash不需要配置FMC_DMA_SADDR_OOB寄存器。

    须知:

    对于SPI NAND Flash,配置DDR地址时,要求4Byte地址对齐。 对于SPI NAND Flash的ECC0模式,FMC_DMA_LEN需要4Byte对齐。

  4. 配置FMC_DMA_LEN寄存器。在SPI NOR Flash模式下,需要配置FMC_DMA_LEN为写入数据的长度;在SPI NAND Flash的ECC0模式下,则需要配置Spare区数据长度;其他操作中则不需要配置此寄存器。

  5. 配置FMC_OP_CFG寄存器,根据下发的写操作要求配置

    • 对于SPI NAND Flash和SPI NOR Flash,根据所需写操作SPI接口选择,配置FMC_OP_CFG[mem_if_type]。
    • FMC_OP_CFG [fm_cs],选择操作片选。
  6. 配置FMC_OP_CTRL寄存器下发操作。

    • 配置rw_op信息为写(配置为1),表示DMA写操作。
    • 对于SPI NAND Flash和SPI NOR Flash,需要配置FMC_OP_CTRL[wr_opcode],根据器件PROGRAM操作指令进行配置。
  7. 使用查询方式,检测到FMC_OP_CTRL [0]变低,表示一次DMA写操作已经完成,数据已经写入FLASH中;使用中断方式,检测到FMC_INT [op_done_int]变高,表示数据已经写入FLASH中。

其他注意事项

其他注意事项如下:

  • 对于SPI NAND Flash器件,在使用之前或者异常复位后必须先进行器件的Reset操作。
  • 在FMC_OP_CTRL [dma_op_ready]或者FMC_OP[reg_op_start]为1过程中(控制器操作进行中),不进行相关操作寄存器的配置,否则可能导致操作不正常。
  • 软件配置需要保证在正确合理的原则下进行,否则乱配置寄存器可能会导致FMC挂死。

数据结构(SPI NAND Flash)

FMC的数据结构分成两种,一种是用户原始数据,另一种是在非ECC0模式下,经过FMC转化,存放在SPI NAND Flash上的数据结构。在非ECC0模式下,原始用户数据和经过FMC转化的数据都具有固定的数据结构,各个数据成员的长度和位置均严格固定。而在ECC0模式下,用户数据原封不动的写入/读出,FMC不对用户数据做任何改变。

对于ECC0模式,FMC对数据进行透传处理:写操作时,控制器将Buffer中的数据不作处理直接写入Flash;读操作时,控制器把从Flash中读取的数据不作处理直接写入到Buffer。

在非ECC0模式下,对Flash进行写操作时,FMC对用户数据进行两次处理:生成ECC码和重组。控制器在内部Buffer进行ECC编码,并生成ECC码,然后将Buffer中的数据进行重组之后再写入Flash。对Flash进行读操作时,FMC同样要进行两次处理:重组Flash数据和ECC纠错。FMC把从Flash中读到的数据重组后写入内部Buffer,然后在Buffer中对数据进行ECC纠错。

在非ECC0模式下,Buffer中的数据和Flash中的数据被划分成不同的结构。不同的配置下,各数据段的长度参考表1。

表 1 非ECC0模式数据结构长度

ECCa(bit)

ecc_lenb(Byte)

page_size(Byte)

oob_lenc(Byte)

sec_lend(Byte)

4/512B

(8/1K)

14

2048

30+2

1040

4096

1032

8/512B

(16/1K)

28

2048

6+2

1028

4096

14+2

24/1K

42

2048

30+2

1040

4096

1032

说明:

a:4bit/512B等价于8bit/1K,8bit/512B等价于16bit/1K。 b:ecc_len表示每个纠错单元生成的ECC码的长度。 c:oob_len表示上层软件可见的冗余区长度,由CTRL+BB组成。 d:sec_len表示每个纠错单元的数据区长度,sec_len=1024+(oob_len*1024)/page_size e:ECC的每个纠错单元为1K,此处1K并不是严格意义上的1024Byte,而是指长度处于1K这一数量级。例如表中纠错单元长度sec_len从1026-1040不等,统称为1K。

下面结合写操作的过程说明各个数据段的构成。

FMC将数据写入到Flash中时,会按照DATA+ECC的格式交替连续存放,但OOB区数据需要进行特殊处理:

  • BB标识需要放在Flash页中page_size的地方,即对于2K、4K的配置,BB数据将被放置到2048、4096 Byte开始的两个字节。这样会打断原有的DATA或ECC数据。
  • CTRL数据需要放置在有效数据的末尾,这样最后一个数据段在Flash中的存放形式为:DATA(不含BB和CTRL)+ECC+CTRL。
  • EB作为标记空块的标记位,固定放置在CTRL最后2Byte。

  • 4bit ECC模式(纠错8bit/1KB)

  • 8bit ECC模式(纠错16bit/1KB)

  • 24bit ECC模式(纠错24bit/1KB)

4bit ECC模式(纠错8bit/1KB)

2KB page_size

对2KB page_size的配置,软件可用的冗余区大小为32Byte。数据在Buffer和Flash中的结构如图1所示。

图 1 4bit ECC模式2KB page_size的数据结构

4KB page_size

对4KB page_size的配置,软件可用的冗余区大小为32Byte。数据在Buffer和Flash中的结构如图1所示。

图 1 4bit ECC模式4KB page_size的数据结构

8bit ECC模式(纠错16bit/1KB)

2KB page_size

对2KB page_size的配置,软件可用的冗余区大小为8Byte。数据在Buffer和Flash中的结构如图1所示。

图 1 8bit ECC模式2KB page_size的数据结构

4KB page_size

对4KB page_size的配置,软件可用的冗余区大小为16Byte。数据在Buffer和Flash中的结构如图1所示。

图 1 8bit ECC模式4KB page_size的数据结构

24bit ECC模式(纠错24bit/1KB)

2KB page-size

对2KB page-size的配置,软件可用的冗余区大小为32Byte。数据在Buffer和Flash中的结构如图1所示。

图 1 24bit ECC模式2KB page-size的数据结构

4KB page_size

对4KB page_size的配置,软件可用的冗余区大小为32Byte。数据在Buffer和Flash中的结构如图1所示。

图 1 24bit ECC模式4KB page_size的数据结构

ECC模式选择说明

因为控制器使用的“ECC纠错IP”在处理数据时是“基于1KB的数据块”进行处理的,所以描述控制器的ECC纠错性能时是这么写的:8bit/1KByte、24bit/1KByte等。为了可靠地使用器件,器件datasheet往往会给出建议的ECC纠错性能,如1bit/512Byte、4bit/512Byte、8bit/512Byte等。8bit/1KByte 与 4bit/512Byte 描述的纠错性能其实是一样的。使用控制器时,ECC模式选择需遵循以下2条准则:

  • 控制器的ECC纠错性能 >= 器件建议的ECC纠错性能

    如果器件建议1bit/512Byte或者4bit/512Byte,那么控制器可以选择8bit/1KByte纠错性能的ECC模式。

  • 器件的页大小 >= 控制器ECC模式所需的存储大小

    如果器件页大小是2K+64Byte,那么控制器不能选择24bit/1KByte纠错性能的ECC模式,因为这种ECC模式所需的存储大小为2K+116Byte,ECC模式所需的存储大小请参考“数据结构(SPI NAND Flash)”这一章节。

FMC寄存器概览

FMC寄存器概览如表1所示。

表 1 FMC寄存器概览(基址是0x0_1000_0000)

偏移地址

名称

描述

0x0000

FMC_CFG

器件配置寄存器

0x0004

GLOBAL_CFG

全局配置寄存器

0x0008

TIMING_SPI_CFG

SPI Timing配置寄存器

0x0018

FMC_INT

中断状态寄存器

0x001C

FMC_INT_EN

中断使能寄存器

0x0020

FMC_INT_CLR

中断清除寄存器

0x0024

FMC_CMD

命令字配置寄存器

0x0028

FMC_ADDRH

器件地址配置寄存器高byte

0x002C

FMC_ADDRL

器件地址配置寄存器低4byte

0x0030

FMC_OP_CFG

操作配置寄存器

0x0034

SPI_OP_ADDR

操作地址配置寄存器

0x0038

FMC_DATA_NUM

数据长度寄存器

0x003C

FMC_OP

操作寄存器

0x0040

FMC_DMA_LEN

DMA操作长度寄存器

0x0048

FMC_DMA_AHB_CTRL

DMA AHB总线操作控制寄存器

0x004C

FMC_DMA_SADDR_D0

DMA操作DDR起始地址寄存器

0x005C

FMC_DMA_SADDR_OOB

DMA操作DDR存放OOB信息起始地址寄存器

0x0068

FMC_OP_CTRL

操作控制寄存器

0x006C

FMC_TIMEOUT_WR

写操作TIMEOUT时间寄存器

0x0070

FMC_OP_PARA

OP操作参数选择寄存器

0x0074

FMC_BOOT_SET

Boot设定寄存器

0x0078

FMC_LP_CTRL

低功耗控制寄存器

0x00A8

FMC_ERR_THD

ECC告警阈值寄存器

0x00AC

FMC_FLASH_INFO

器件状态寄存器值

0x00BC

FMC_VERSION

版本寄存器

0x00C0

FMC_ERR_NUM0_BUF0

SPI NAND Flash第一次buffer纠错信息0统计寄存器

0x00D0

FMC_ERR_ALARM_ADDRH

ECC告警Flash地址高byte寄存器

0x00D4

FMC_ERR_ALARM_ADDRL

ECC告警Flash地址低byte寄存器

0x00D8

FMC_ECC_INVALID_ADDRH

ECC不可纠错地址高byte寄存器

0x00DC

FMC_ECC_INVALID_ADDRL

ECC不可纠错地址低4byte寄存器

0x0037C

FMC_BOOT_CMD

BOOT启动读操作命令配置寄存器

FMC寄存器描述

FMC_CFG

FMC_CFG为器件配置寄存器。

Offset Address:0x0000 Total Reset Value:0x0000_1820

Bits

Access

Name

Description

Reset

[31:13]

-

reserved

保留。

0x00000

[12:11]

RW

spi_nand_plane_en

Plane bit功能使能(发送地址时,附带发送Plane地址位信息,SPI NAND模式下有效)

11:使能;

其他:不使能。

0x3

[10]

RW

spi_nor_addr_mode

SPI地址模式 (只对 SPI NOR 有效)

0:3Bytes address mode (default);

1:4Bytes address mode。

复位值由管脚决定。

0x0

[9:8]

RW

block_size

SPI NAND Flash的块大小。

00:64 page;

01:128 page;

其他:保留。

0x0

[7:5]

RW

ecc_type

配置控制器的ECC类型。

000:无ECC;

001:8bit ECC;

010:16bit ECC;

011:24bit ECC;

其他:保留。

0x1

[4:3]

RW

page_size

SPI NAND Flash的页大小。

00:2KB page_size;

01:4KB page_size;

其他:保留。

0x0

[2:1]

RW

flash_sel

Flash类型选择。

00:SPI NOR Flash;

01:SPI NAND Flash;

其他:保留。

复位值由管脚决定。

0x0

[0]

RW

op_mode

FMC操作模式选择。

0:Boot模式;

1:Normal模式。

0x0

GLOBAL_CFG

GLOBAL_CFG为全局配置寄存器。

Offset Address:0x0004 Total Reset Value:0x0001_00C4

Bits

Access

Name

Description

Reset

[31:21]

-

reserved

保留。

0x0000

[20]

RW

ddr_mode_byp

SPI NAND DDR功能bypass,为了保证之前所有功能的正确性。

1:使能bypass功能;

0:不使能bypass功能。

注:该位域只针对SPI NAND DDR模式。

0x0

[19:16]

-

reserved

保留。

0x1

[15:12]

RW

sample_point

DDR模式时根据不同器件不同延时参数选择采样点。采样时钟频率4倍于接口读写时钟。

0x0延时最小,0xB延时最大;

0x0:采样点在有效沿后2个采样时钟周期;

0x1:采样点在有效沿后2.5个采样时钟周期;

0x2:采样点在有效沿后3个采样时钟周期;

0x3:采样点在有效沿后3.5个采样时钟周期;

0x4:采样点在有效沿后4个采样时钟周期;

0x5:采样点在有效沿后4.5个采样时钟周期;

0x6:采样点在有效沿后5个采样时钟周期;

0x7:采样点在有效沿后5.5个采样时钟周期;

0x8:采样点在有效沿后6个采样时钟周期;

0x9:采样点在有效沿后6.5个采样时钟周期;

0xA:采样点在有效沿后7个采样时钟周期;

0xB:采样点在有效沿后7.5个采样时钟周期;

其他:保留。

0x0

[11]

RW

ddr_mode

DDR模式使能控制。

0:正常SDR模式;

1:DDR模式。

0x0

[10:7]

-

reserved

保留。

0x1

[6]

RW

wp_en

写保护使能(WP管脚)。当使能时,芯片对WP管脚输出为0。

0:不使能;

1:使能。

0x1

[5:3]

RW

rd_delay

SPI读出数据延迟周期个数。(SDR模式下)

000:读数据延迟0个时钟周期;(default)

001:读数据延迟0.5个器件工作时钟周期;

010:读数据延迟1个器件工作时钟周期;

011:读数据延迟1.5个器件工作时钟周期;

100:读数据延迟2个器件工作时钟周期;

101:读数据延迟2.5个器件工作时钟周期;

110:读数据延迟3个器件工作时钟周期;

111:读数据延迟3.5个器件工作时钟周期。

0x0

[2]

-

reserved

保留。

0x1

[1:0]

-

reserved

保留。

0x0

TIMING_SPI_CFG

TIMING_SPI_CFG为SPI Timing配置寄存器。

Offset Address:0x0008 Total Reset Value:0x0000_006F

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:4]

RW

tcss

CS setup time。

000~111:n+1个接口时钟周期。n为0、1、2、……、7。

0x6

[3:0]

RW

tshsl

设置片选的Deselect time,相当于两次Flash操作之间的时间间隔。

0000~1111:n+1个接口时钟周期。n为0、1、2、……、15。

0xF

FMC_INT

FMC_INT为中断状态寄存器。

Offset Address:0x0018 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7]

RO

ahb_op_int

FMC对Flash进行数据操作期间,CPU读写内部Buffer。

0:无中断;

1:有中断。

0x0

[6]

-

reserved

保留。

0x0

[5]

RO

dma_err_int

DMA传输总线出现错误中断。

0:无中断;

1:有中断。

0x0

[4]

RO

err_alarm_int

ECC校验告警中断。当错误的bit达到设定的阈值,产生中断。

0:无中断;

1:有中断。

0x0

[3]

RO

err_inval_int

ECC校验不可纠正的错误。

8bit纠错模式下,校验1024byte数据中出现8bit以上错误,产生中断。

16bit纠错模式下,校验1024byte数据中出现16bit以上错误,产生中断。

24bit纠错模式下,校验1024byte数据中出现24bit以上错误,产生中断。

0:无中断;

1:有中断。

0x0

[2]

RO

err_val_int

ECC校验可纠正的错误。

8bit纠错模式下,校验1024byte数据中出现1-8bit错误,产生中断。

16bit纠错模式下,校验1024byte数据中出现1—16bit错误,产生中断。

24bit纠错模式下,校验1024byte数据中出现1-24bit错误,产生中断。

0:无中断;

1:有中断。

0x0

[1]

RO

op_fail_int

编程操作失败,上报中断。

0:无中断;

1:有中断。

0x0

[0]

RO

op_done_int

controller本次操作结束中断。

写operation寄存器后,该标志自动清零。

0:无中断;

1:有中断。

0x0

FMC_INT_EN

FMC_INT_EN为中断使能寄存器。

Offset Address:0x001C Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7]

RW

ahb_op_int_en

FMC读写Flash数据期间,cpu读写内部buffer错误中断使能。

0:禁止;

1:使能。

0x0

[6]

-

reserved

保留。

0x0

[5]

RW

dma_err_int_en

DMA传输总线出现错误中断使能。

0:禁止;

1:使能。

0x0

[4]

RW

err_alarm_int_en

ECC校验告警中断。当错误的bit达到设定的阈值,产生中断。

0:禁止;

1:使能。

0x0

[3]

RW

err_inval_int_en

ECC校验不可纠正错误,产生中断。

0:禁止;

1:使能。

0x0

[2]

RW

err_val_int_en

ECC校验可纠正的错误,产生中断。

0:禁止;

1:使能。

0x0

[1]

RW

op_fail_int_en

编程操作失败中断使能。

0:禁止;

1:使能。

0x0

[0]

RW

op_done_int_en

FMC本次操作结束中断。

0:禁止;

1:使能。

0x0

FMC_INT_CLR

FMC_INT_CLR为中断清除寄存器。

Offset Address:0x0020 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7]

WO

ahb_op_int_clr

清除ahb_op_err 中断,写1清除。

0x0

[6]

-

reserved

保留。

0x0

[5]

WO

dma_err_int_clr

清除DMA传输总线错误中断,写1清除。

0x0

[4]

WO

err_alarm_int_clr

清除err_alarm中断,写1清除。

0x0

[3]

WO

err_inval_int_clr

清除err_invalid中断,写1清除。

0x0

[2]

WO

err_val_int_clr

清除err_valid中断,写1清除。

0x0

[1]

WO

op_fail_int_clr

清除op_fail中断,写1清除。

0x0

[0]

WO

op_done_int_clr

清除op_done中断,写1清除。

0x0

FMC_CMD

FMC_CMD为命令字配置寄存器。

Offset Address:0x0024 Total Reset Value:0x0000_3000

Bits

Access

Name

Description

Reset

[31:16]

-

reserved

保留。

0x0000

[15:8]

-

reserved

保留。

0x30

[7:0]

RW

cmd1

Controller发给 SPI NOR/NAND Flash的操作命令。

0x00

FMC_ADDRH

FMC_ADDRH为器件地址配置寄存器高byte。

Offset Address:0x0028 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RW

addrh

对于SPI NAND Flash,配置Flash的操作高byte地址。

0x00

FMC_ADDRL

FMC_ADDRL为器件地址配置寄存器低4byte。

Offset Address:0x002C Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

addrl

配置Flash器件的操作地址的低4byte。对于SPI NOR Flash,配置器件地址。

0x00000000

FMC_OP_CFG

FMC_OP_CFG为操作配置寄存器。

Offset Address:0x0030 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:14]

-

reserved

保留。

0x00000

[13]

RW

multi_cycle_en

SPI 接口冗余周期使能。

0:不使能;

1:使能。

输出时钟超过50MHz时必须配置为1。

0x0

[12:11]

RW

fm_cs

选择操作的Flash器件。

00:cs0;

01:cs1。

其他:保留。

0x0

[10]

RW

force_cs_en

cs片选强制使能选择。

0:不使能;

1:使能。

0x0

[9:7]

RW

mem_if_type

读操作,SPI Flash接口类型选择。

000:Standard SPI接口类型

001:Dual-Input/Dual-Output SPI

010:Dual-I/O SPI

011:Quad-Input/Quad-Output SPI

100:Quad-I/O SPI

101-111:保留。

0x0

[6:4]

RW

addr_num

发给Flash的地址Byte数。

0x0

[3:0]

RW

dummy_num

对于dummy_en的操作Byte个数。

(1Byte=4线2时钟周期=2线4时钟周期=1线8时钟周期)

0x0

SPI_OP_ADDR

SPI_OP_ADDR为操作地址配置寄存器。

Offset Address:0x0034 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

spi_op_addr

配置SPI NOR/NAND Flash的操作地址。每次操作下发器件的操作地址。不同于FMC_ADDRL和FMC_ADDRH。

0x0000_0000

FMC_DATA_NUM

FMC_DATA_NUM为数据长度寄存器。

Offset Address:0x0038 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:14]

-

reserved

保留。

0x00000

[13:0]

RW

op_data_num

一次操作所需要处理的数据长度。在有数据传输的操作时需要配置,对于DMA操作或AHB总线直接访问时不需要配置。仅对于ECC0有效。

0x0000

FMC_OP

FMC_OP为操作寄存器。

Offset Address:0x003C Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:9]

-

reserved

保留。

0x000000

[8]

RW

dummy_en

传输dummy byte使能。

0:禁止;

1:使能。

同时使能dummy byte和地址时,dummy 在地址操作后发出。

0x0

[7]

RW

cmd1_en

向Flash发送command1命令使能。

0:禁止;

1:使能。

0x0

[6]

RW

addr_en

向Flash写操作地址使能。

0:禁止;

1:使能。

0x0

[5]

RW

write_data_en

向Flash写数据使能。

read_data_en和write_data_en 不能同时为1。

0:禁止;

1:使能。

0x0

[4:3]

-

reserved

保留。

0x0

[2]

RW

read_data_en

从Flash读数据使能。

read_data_en和write_data_en不能同时为1。

0:禁止;

1:使能。

0x0

[1]

RW

read_status_en

读器件状态寄存器使能。

0:禁止;

1:使能。

该标志为1时,控制器读器件状态寄存器值存放在FMC_FLASH_INFO的flash_status域中(而不写入内部buffer)。

0x0

[0]

RWSC

reg_op_start

下发OP操作控制器状态。

0:控制器就绪(软件下发操作时只能将该位域配置为1,使能逻辑);

1:控制器忙(控制器操作完成后会自动将这个bit设置为0,表示逻辑完成)。

0x0

FMC_DMA_LEN

FMC_DMA_LEN为DMA操作长度寄存器。

Offset Address:0x0040 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:28]

-

reserved

保留。

0x0

[27:0]

RW

dma_len

DMA操作数据搬运长度,以byte为单位。

用于SPI NAND ecc0时,配置为Spare区域数据长度。

用于SPI NOR的DMA读写操作时,配置为DMA所需数据长度。

0x0000000

FMC_DMA_AHB_CTRL

FMC_DMA_AHB_CTRL为DMA AHB总线操作控制寄存器。

Offset Address:0x0048 Total Reset Value:0x0000_0007

Bits

Access

Name

Description

Reset

[31:3]

-

reserved

保留。

0x00000000

[2]

RW

burst16_en

BURST16使能。

0:禁止;

1:使能。

0x1

[1]

RW

burst8_en

BURST8使能。

0:禁止;

1:使能。

0x1

[0]

RW

burst4_en

BURST4使能。

0:禁止;

1:使能。

0x1

FMC_DMA_SADDR_D0

FMC_DMA_SADDR_D0为DMA操作DDR起始地址寄存器。

Offset Address:0x004C Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

dma_mem_saddr_d0

FMC的DMA操作访问DDR的起始地址。

0x0000_0000

FMC_DMA_SADDR_OOB

FMC_DMA_SADDR_OOB为DMA操作DDR存放OOB信息起始地址寄存器。

Offset Address:0x005C Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RW

dma_mem_saddr_oob

读写OOB区数据的DDR基地址。

0x0000_0000

FMC_OP_CTRL

FMC_OP_CTRL为操作控制寄存器。

Offset Address:0x0068 Total Reset Value:0x0003_0200

Bits

Access

Name

Description

Reset

[31:24]

-

reserved

保留。

0x00

[23:16]

RW

rd_opcode

SPI NAND/NOR Flash,非总线方式,DMA 读操作命令。(FAST_READ/READ/DUAL_READ)

0x03

[15:8]

RW

wr_opcode

对于SPI NAND/NOR Flash,非总线方式,DMA 写操作命令。

0x02

[7:6]

-

reserved

保留。

0x0

[5:4]

RW

rd_op_sel

读操作时,读数据区域选择。

00:读整个page;

01:只读OOB操作;

其他:保留。

0x0

[3:2]

-

reserved

保留。

0x0

[1]

RW

rw_op

DMA读写模式选择。

0:DMA读;

1:DMA写。

0x0

[0]

RWSC

dma_op_ready

下发操作控制器状态。

0:控制器就绪;(软件只能配置为1,使能逻辑)

1:控制器忙。(逻辑只能配置为0,表示逻辑完成)

0x0

FMC_TIMEOUT_WR

FMC_TIMEOUT_WR为写操作TIMEOUT时间寄存器。

Offset Address:0x006C Total Reset Value:0x00FF_FFFF

Bits

Access

Name

Description

Reset

[31:24]

-

reserved

保留。

0x00

[23:0]

RW

timeout_wr

编程操作busy等待期间,timeout时间长度。(器件响应超时时间)其单位为1个接口时钟周期。

(SPI NAND/SPI NOR Flash)

0x000000

FMC_OP_PARA

FMC_OP_PARA为OP操作参数选择寄存器。

Offset Address:0x0070 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:2]

-

reserved

保留。

0x00000000

[1]

RW

rd_oob_only

OP下发寄存器读flash操作时,只读OOB相关的sector。

0:读page;

1:只读OOB。

0x0

[0]

-

reserved

保留。

0x0

FMC_BOOT_SET

FMC_BOOT_SET为boot设定寄存器。

Offset Address:0x0074 Total Reset Value:0x0000_0005

Bits

Access

Name

Description

Reset

[31:5]

-

reserved

保留。

0x0000000

[4]

RW

boot_otp_cfg

器件配置信息,使用OTP直接配置FMC_CFG寄存器的方式。

0:使用自适应Boot模式;

1:使用OTP模式。

0x0

[3]

-

reserved

保留。

0x0

[2]

-

reserved

保留。

0x1

[1]

RW

boot_quad_mode

对于SPI NAND Flash,BOOT是否使用四线模式启动。复位值由管脚决定。

0:不使用,使用单线模式启动;

1:使用。

0x0

[0]

RW

boot_page0_cfg

Boot模式选择(SPI NAND Flash)。

0:默认启动方式;

1:省管脚启动方式。

0x1

FMC_LP_CTRL

FMC_LP_CTRL为低功耗控制寄存器。

Offset Address:0x0078 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:2]

-

reserved

保留。

0x00000000

[1]

RW

mem_gate_en

SRAM时钟关断选择

0:不关闭;

1:关闭。

0x0

[0]

RW

clk_gate_en

时钟门控选择。打开此功能,使用低功耗设计,逻辑选择关闭模块工作时钟。

0:时钟全部使能;

1:根据低功耗设计,关闭时钟。

0x0

FMC_ERR_THD

FMC_ERR_THD为ECC告警阈值寄存器。

Offset Address:0x00A8 Total Reset Value:0x0000_00FF

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RW

fmc_err_thd

ECC校验告警阈值配置寄存器。当错误bit达到此阈值时,触发ECC校验告警中断。

注:

1.不可纠错时,无论此寄存器值是多少,都上报为不可纠错中断;

2.设置为0和1等价,即只要有错误发生,都上报为告警中断;

3.设置值大于可纠错范围时,不论出现多少bit错误,告警中断均不上报,只有可纠错和不可纠错中断产生。

0xFF

FMC_FLASH_INFO

FMC_FLASH_INFO为器件状态寄存器值。

Offset Address:0x00AC Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

RO

exp_bb_flag

扩展操作下发的只读OOB或者读page时,当前页坏块标志对应的未纠错数据

0x00

[23:16]

RO

bb_flag

只读OOB或者读page时,当前页坏块标志对应的未纠错数据

0x00

[15:8]

RO

exp_flash_status

扩展操作,控制器从器件读状态寄存器值。

0x00

[7:0]

RO

flash_status

器件读状态寄存器值。(比特含义详见各flash器件手册)

0x00

FMC_VERSION

FMC_VERSION为版本寄存器。

Offset Address:0x00BC Total Reset Value:0x0000_0100

Bits

Access

Name

Description

Reset

[31:0]

RO

version

FMC版本V100。

0x0000_0100

FMC_ERR_NUM0_BUF0

FMC_ERR_NUM0_BUF0为SPI NAND Flash第一次buffer纠错信息0统计寄存器。

Offset Address:0x00C0 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

err_num0_buf0

对于2KB,4KB,8KB及16KB page_size第一次buffer操作,前4KB数据错误统计寄存器。

bit[31:24]:第四KB数据纠错,错误数据统计寄存器。

bit[23:16]:第三KB数据纠错,错误数据统计寄存器。

bit[15:8]:第二KB数据纠错,错误数据统计寄存器。

bit[7:0]:第一KB数据纠错,错误数据统计寄存器。

0x0000_0000

FMC_ERR_ALARM_ADDRH

FMC_ERR_ALARM_ADDRH为ECC告警Flash地址高byte寄存器。

Offset Address:0x00D0 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RO

fmc_err_alarm_addrh

当出现ECC告警中断时,最后一次触发中断的Flash操作地址高byte寄存器。

0x00

FMC_ERR_ALARM_ADDRL

FMC_ERR_ALARM_ADDRL为ECC告警flash地址低byte寄存器。

Offset Address:0x00D4 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

fmc_err_alarm_addrl

当出现ECC告警中断时,最后一次触发中断的Flash操作地址低4byte寄存器。

0x0000_0000

FMC_ECC_INVALID_ADDRH

FMC_ECC_INVALID_ADDRH为ECC不可纠错地址高byte寄存器。

Offset Address:0x00D8 Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RO

fmc_ecc_invalid_addrh

当出现ECC不可纠错时,最后一次触发中断的Flash操作地址高byte寄存器。

0x00

FMC_ECC_INVALID_ADDRL

FMC_ECC_INVALID_ADDRL为ECC不可纠错地址低4byte寄存器。

Offset Address:0x00DC Total Reset Value:0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

fmc_ecc_invalid_addrl

当出现ECC不可纠错时,最后一次触发中断的Flash操作地址低4byte寄存器。

0x0000_0000

FMC_BOOT_CMD

FMC_BOOT_CMD为BOOT启动读操作命令配置寄存器

Offset Address: 0x0037C Total Reset Value: 0x0000_0003

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RW

rd_cmd

BOOT启动读操作命令。

0x03:读取(默认);

0x0B:快速读取,最高可提频至99MHz,需同步配置dummy_num;

其他:保留。

0x03