存储器接口
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器件。
图 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命令真值表
H:表示高电平;L:表示低电平;V:表示有效;X:表示不关心。
DDRC支持DDR3/3L SDRAM的读写和控制命令字。
DDR3/3L SDRAM的命令真值表如表2所示。更加详细的信息请参阅JEDEC标准和器件手册。
表 2 DDR3/3L命令真值表
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子系统的初始化步骤如下:
- 配置DDR的地址区域映射,地址区域属性。
- 配置DMC的工作模式、时钟频率、时序参数等。
- 配置DDRPHY的工作模式,时序参数,DDRPHY IO驱动和ODT阻抗,读写命令通路 的delay参数等。
- 启动DDRPHY进行初始化。
- 等待DDRPHY初始化完成。
- 配置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接口模式写操作时序图。

时序说明:
- command/address/dummy cycles以单bit串行方式在sf_dio_0线上输出;
- Data以单bit串行方式在sf_dio_0线上输出。
图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模式

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

时序说明:
- 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模式

时序说明:
- 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线上输出(写)或输入(读)。

时序说明:
- 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所示。

注:时序配置对应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地址分配表
说明:
- 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]中断。
工作流程
初始化流程
初始化流程如下:
- (如果需要调整Timing参数)根据器件配置寄存器TIMING_SPI_CFG(SPI NAND Flash或者SPI NOR Flash)。
- 根据对接的FLASH器件手册,配置FMC配置寄存器(FMC_CFG)。主要配置有器件接口类型,ecc_type、page_size等。
- 对于SPI NOR Flash,如果器件是4Byte地址器件,而默认是3Byte地址模式,则参考“SPI NOR Flash地址模式切换流程”完成4Byte地址模式切换。
- 初始化完成,可根据具体的操作配置寄存器下发操作。
FMC_OP操作流程(寄存器操作方式)
对器件的寄存器操作(如读ID或者配置器件寄存器)使用配置FMC_OP下发操作的方式完成。操作步骤如下:
- 配置FMC_CFG的ecc_type为0。
- 如果是写寄存器操作(如配置FLASH的配置寄存器),先从Buffer访问起始地址开始写入期望的操作数据。
- 根据器件操作需要,配置操作命令FMC_CMD,器件操作地址FMC_ADDRL,读写数据个数FMC_DATA_NUM等操作类寄存器。
- 根据下发的器件操作,匹配FMC_OP配置FMC_OP_CFG寄存器。
- 配置FMC_OP寄存器下发操作,具体配置值参考FMC_OP寄存器描述。
- 如果使用查询方式,查询FMC_OP[reg_op_start]位为0表示操作完成;如果使用中断方式,检测到FMC_INT[op_done_init],表示操作完成。
- 对于读寄存器操作(如读ID操作),在步骤 6完成后读出的寄存器存放在buffer中,软件可以从中读出器件寄存器值。
读器件状态寄存器操作
如果想要读取器件的状态寄存器,提供一种简易操作方法。具体如下:
- 配置FMC_OP寄存器下发操作(配置FMC_OP [read_status_en]和FMC_OP [reg_op_start]为1)。
- 读出的状态寄存器存放在FMC_FLASH_INFO寄存器中。
SPI NOR Flash地址模式切换流程
对于SPI NOR Flash器件,支持3Byte与4Byte两种Flash地址模式,可通过将管脚上下拉来选择初始默认地址模式,也可以在芯片启动起来之后通过配置寄存器动态切换地址模式。
如果默认是3Byte模式启动,但器件是4Byte地址模式器件,在芯片启动起来之后切换Flash地址模式的步骤如下:
- 确保无Flash操作或之前的Flash操作已完成。
- 根据器件要求,用寄存器操作方式配置器件的相关寄存器发送特定命令配置Flash进入4B模式。
- 配置FMC的FMC_CFG [spi_nor_addr_mode]设置为4B模式,完成3Byte模式到4Byte模式切换。
说明:
具体SPI NOR Flash地址模式切换的命令,请查找相关器件手册。
擦除操作流程(SPI NAND Flash和SPI NOR Flash)
对于flash操作,在编程操作前,都必须进行擦除,在擦除操作前还必须完成WREN操作。擦除操作参考流程(查询方式)如图1所示。

说明:
内置DMA读操作流程(FMC_OP_CTRL读操作)
使用内置DMA方式进行读数据的操作流程如下:
- 配置寄存器FMC_CFG [op_mode]为1,确保控制器处于NORMAL模式。
-
配置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地址模式,且不可配置。
-
配置FMC_DMA_SADDR_OOB寄存器,配置在DDR中存放数据的起始地址。
- 对于SPI NOR Flash不需要配置FMC_DMA_SADDR_OOB寄存器;
- 对于SPI NAND Flash的只读OOB操作,只需配置FMC_DMA_SADDR_OOB寄存器。
须知: - 对于SPI NAND Flash,配置DDR地址时,要求4Byte地址对齐。
- 对于SPI NAND Flash的ECC0模式,FMC_DMA_LEN需要4Byte对齐。
-
配置FMC_DMA_LEN寄存器。在SPI NOR Flash模式下,需要配置FMC_DMA_LEN为读取数据的长度;在SPI NAND Flash的ECC0模式下,则需要配置Spare区数据长度;其他操作中则不需要配置此寄存器。
-
配置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],选择操作片选。
-
配置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指令进行配置。
-
使用查询方式,检测到FMC_OP_CTRL[0]变低,表示读操作已经完成,数据已经写入DDR中;使用中断方式,检测到FMC_INT [op_done_int]变高,表示读操作已经完成,数据已经写入DDR中。
内置DMA写操作流程(FMC_OP_CTRL写操作)
使用内置DMA方式进行写FLASH的操作,流程如下:
- 配置寄存器FMC_CFG [op_mode]为1,确保控制器处于NORMAL模式。
-
配置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地址模式,且不可配置。
-
配置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对齐。
-
配置FMC_DMA_LEN寄存器。在SPI NOR Flash模式下,需要配置FMC_DMA_LEN为写入数据的长度;在SPI NAND Flash的ECC0模式下,则需要配置Spare区数据长度;其他操作中则不需要配置此寄存器。
-
配置FMC_OP_CFG寄存器,根据下发的写操作要求配置
- 对于SPI NAND Flash和SPI NOR Flash,根据所需写操作SPI接口选择,配置FMC_OP_CFG[mem_if_type]。
- FMC_OP_CFG [fm_cs],选择操作片选。
-
配置FMC_OP_CTRL寄存器下发操作。
- 配置rw_op信息为写(配置为1),表示DMA写操作。
- 对于SPI NAND Flash和SPI NOR Flash,需要配置FMC_OP_CTRL[wr_opcode],根据器件PROGRAM操作指令进行配置。
-
使用查询方式,检测到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模式数据结构长度
说明:
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)
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)
FMC寄存器描述
FMC_CFG
FMC_CFG为器件配置寄存器。
Offset Address:0x0000 Total Reset Value:0x0000_1820
GLOBAL_CFG
GLOBAL_CFG为全局配置寄存器。
Offset Address:0x0004 Total Reset Value:0x0001_00C4
TIMING_SPI_CFG
TIMING_SPI_CFG为SPI Timing配置寄存器。
Offset Address:0x0008 Total Reset Value:0x0000_006F
FMC_INT
FMC_INT为中断状态寄存器。
Offset Address:0x0018 Total Reset Value:0x0000_0000
|
8bit纠错模式下,校验1024byte数据中出现8bit以上错误,产生中断。 16bit纠错模式下,校验1024byte数据中出现16bit以上错误,产生中断。 |
||||
|
8bit纠错模式下,校验1024byte数据中出现1-8bit错误,产生中断。 16bit纠错模式下,校验1024byte数据中出现1—16bit错误,产生中断。 |
||||
FMC_INT_EN
FMC_INT_EN为中断使能寄存器。
Offset Address:0x001C Total Reset Value:0x0000_0000
FMC_INT_CLR
FMC_INT_CLR为中断清除寄存器。
Offset Address:0x0020 Total Reset Value:0x0000_0000
FMC_CMD
FMC_CMD为命令字配置寄存器。
Offset Address:0x0024 Total Reset Value:0x0000_3000
FMC_ADDRH
FMC_ADDRH为器件地址配置寄存器高byte。
Offset Address:0x0028 Total Reset Value:0x0000_0000
FMC_ADDRL
FMC_ADDRL为器件地址配置寄存器低4byte。
Offset Address:0x002C Total Reset Value:0x0000_0000
FMC_OP_CFG
FMC_OP_CFG为操作配置寄存器。
Offset Address:0x0030 Total Reset Value:0x0000_0000
|
001:Dual-Input/Dual-Output SPI |
||||
SPI_OP_ADDR
SPI_OP_ADDR为操作地址配置寄存器。
Offset Address:0x0034 Total Reset Value:0x0000_0000
配置SPI NOR/NAND Flash的操作地址。每次操作下发器件的操作地址。不同于FMC_ADDRL和FMC_ADDRH。 |
FMC_DATA_NUM
FMC_DATA_NUM为数据长度寄存器。
Offset Address:0x0038 Total Reset Value:0x0000_0000
一次操作所需要处理的数据长度。在有数据传输的操作时需要配置,对于DMA操作或AHB总线直接访问时不需要配置。仅对于ECC0有效。 |
FMC_OP
FMC_OP为操作寄存器。
Offset Address:0x003C Total Reset Value:0x0000_0000
|
该标志为1时,控制器读器件状态寄存器值存放在FMC_FLASH_INFO的flash_status域中(而不写入内部buffer)。 |
||||
FMC_DMA_LEN
FMC_DMA_LEN为DMA操作长度寄存器。
Offset Address:0x0040 Total Reset Value:0x0000_0000
FMC_DMA_AHB_CTRL
FMC_DMA_AHB_CTRL为DMA AHB总线操作控制寄存器。
Offset Address:0x0048 Total Reset Value:0x0000_0007
FMC_DMA_SADDR_D0
FMC_DMA_SADDR_D0为DMA操作DDR起始地址寄存器。
Offset Address:0x004C Total Reset Value:0x0000_0000
FMC_DMA_SADDR_OOB
FMC_DMA_SADDR_OOB为DMA操作DDR存放OOB信息起始地址寄存器。
Offset Address:0x005C Total Reset Value:0x0000_0000
FMC_OP_CTRL
FMC_OP_CTRL为操作控制寄存器。
Offset Address:0x0068 Total Reset Value:0x0003_0200
SPI NAND/NOR Flash,非总线方式,DMA 读操作命令。(FAST_READ/READ/DUAL_READ) |
||||
FMC_TIMEOUT_WR
FMC_TIMEOUT_WR为写操作TIMEOUT时间寄存器。
Offset Address:0x006C Total Reset Value:0x00FF_FFFF
FMC_OP_PARA
FMC_OP_PARA为OP操作参数选择寄存器。
Offset Address:0x0070 Total Reset Value:0x0000_0000
FMC_BOOT_SET
FMC_BOOT_SET为boot设定寄存器。
Offset Address:0x0074 Total Reset Value:0x0000_0005
器件配置信息,使用OTP直接配置FMC_CFG寄存器的方式。 |
||||
FMC_LP_CTRL
FMC_LP_CTRL为低功耗控制寄存器。
Offset Address:0x0078 Total Reset Value:0x0000_0000
FMC_ERR_THD
FMC_ERR_THD为ECC告警阈值寄存器。
Offset Address:0x00A8 Total Reset Value:0x0000_00FF
ECC校验告警阈值配置寄存器。当错误bit达到此阈值时,触发ECC校验告警中断。 |
FMC_FLASH_INFO
FMC_FLASH_INFO为器件状态寄存器值。
Offset Address:0x00AC Total Reset Value:0x0000_0000
FMC_VERSION
FMC_VERSION为版本寄存器。
Offset Address:0x00BC Total Reset Value:0x0000_0100
FMC_ERR_NUM0_BUF0
FMC_ERR_NUM0_BUF0为SPI NAND Flash第一次buffer纠错信息0统计寄存器。
Offset Address:0x00C0 Total Reset Value:0x0000_0000
对于2KB,4KB,8KB及16KB page_size第一次buffer操作,前4KB数据错误统计寄存器。 bit[31:24]:第四KB数据纠错,错误数据统计寄存器。 |
FMC_ERR_ALARM_ADDRH
FMC_ERR_ALARM_ADDRH为ECC告警Flash地址高byte寄存器。
Offset Address:0x00D0 Total Reset Value:0x0000_0000
FMC_ERR_ALARM_ADDRL
FMC_ERR_ALARM_ADDRL为ECC告警flash地址低byte寄存器。
Offset Address:0x00D4 Total Reset Value:0x0000_0000
FMC_ECC_INVALID_ADDRH
FMC_ECC_INVALID_ADDRH为ECC不可纠错地址高byte寄存器。
Offset Address:0x00D8 Total Reset Value:0x0000_0000
FMC_ECC_INVALID_ADDRL
FMC_ECC_INVALID_ADDRL为ECC不可纠错地址低4byte寄存器。
Offset Address:0x00DC Total Reset Value:0x0000_0000
FMC_BOOT_CMD
FMC_BOOT_CMD为BOOT启动读操作命令配置寄存器
Offset Address: 0x0037C Total Reset Value: 0x0000_0003