USER GUIDE / MEMORY / SPI FLASH / SOFTWARE GUIDE

软件指南

软件指南

CDT 描述符

每个命令由 4 个字组成,并且每个命令可以链接下一个命令,也可以不链接下一个命令。

硬件每执行一个命令链,一个命令链中最多只能传输一次数据。

每个命令的结构如下所示:

Num313029282726252423222120191817161514131211109876543210
0LINKReservedENDIANWORD_UNITReservedTRAN_MODEReservedADDR_KIND
1CLK_MODEADDR_WIDTHPOLL_ENCMD_ENPHASE_FORMATDMY_BITSDATA_ENTRAN_CMD
2DEV_STA_EXP
3DEV_STA_MSK
名称描述
LINK1:不是链的最后一个命令
0:是链的最后一个命令
ADDR_KIND0:列地址(SFC_COL_ADDR)
1:行地址(SFC_ROW_ADDR)
2:状态地址 0(SFC_STA_ADDR0)
3:状态地址 1(SFC_STA_ADDR1)
others复位信号的定义与上述寄存器定义一致

DMA 描述符

每个描述符由 4 个字组成。硬件每次执行一个描述符链。

每个描述符链的结构如下:

名称描述
NEXT_DES_ADDR下一个描述符的物理地址
MEM_ADDR当前传输数据物理地址
TRAN_LEN当前传输数据长度
LINK1:这不是最后一个描述符
0:这是最后一个描述符
others其他信号的定义与上述寄存器定义一致

阶段描述

  • 每个阶段可以由四个部分组成:CMD、ADDR、DUMMY、DATA。

  • 每个阶段可以有一个或多个组成部分,最多四个。

  • 对于同一个部分,一个阶段最多只能有一个。

  • 在所有阶段中,只有一个阶段可以有 DATA 部分。(我们称这个阶段为数据阶段,其它为命令阶段)

  • 一个阶段的各个部分将采用两种顺序格式:

  • Format0CMDADDRDUMMYDATA
    Format1CMDDUMMYADDRDATA
  • 对于一个流程,最多有 6 个阶段,只支持一种传输方向。

多阶段流程

1 配置与器件相关的参数。例如 IO 端口的默认电平,时序参数等。相关寄存器:SFC_DEV_CONF

2 配置与该传输流程相关的参数。例如阶段数,命令格式,操作模式,源地址,目标地址,传输方向,传输长度等。相关寄存器:SFC_GLB、SFC_DEV_STA_EXP、SFC_DEV_STA_MSK、SFC_TRAN_CONF0-6、SFC_TRAN_LEN、SFC_DEV_ADDR0-6、SFC_MEM_ADDR。

3 打开 SFC。相关寄存器:SFC_TRIG

4 等待传输结束

5 对其它流程重复步骤 2

单阶段流程

流程也可以只有一个阶段执行。NAND 写操作流程如图 2 所示:

1 配置 NAND flash program load 操作相关参数,打开 SFC start,等待结束中断;

2 清除结束中断,配置 Write Enable 操作相关参数,打开 SFC start,等待结束中断;

3 清除结束中断,配置 Program execute 操作相关参数,打开 SFC start,等待结束中断;

4 清除结束中断,配置 Get Feature (检查 flash 状态) 操作,打开 SFC start,等待结束中断;

XIP 模式配置流程

以下为正常模式到 xip 模式,以及退出 xip 模式到正常模式的软件配置流程;以 quad spi 为例。

a) 配置时钟和 gpio;

b) 配置 flash 设备的相关参数 SFC_DEV_CONF 寄存器,sta_endian,sta_type,cmd_type,smp_delay,CPOL 以及 CPHA 等参数;

进入 XIP 模式相关配置流程

c) 配置 XIP 模式下的传输参数,以四线 quad spi 为例;

SFC_GLB0 寄存器:tran_dir=0,phase_num=1;

SFC_TRAN_CFG0(0),SFC_TRAN_CFG1(0) 寄存器:cmd_en/data_en=1,addr_width=4,dmy_bits=4,cmd=0xEB,tran_mode=6;

d) 配置进入 xip 模式的参数,SFC_GLB1:chip_sel=0,mode_bits=0xA0,xip_en=1;

e) 使能 sfc start,Cpu 开始发读 burst 请求。

f) 配置 xip_en=0,等待 xip_en=0 后,等待 sfc_end 并清除;

退出 XIP 模式相关配置流程

g) 配置退出 xip 模式到正常模式,SFC_GLB0:tran_dir=1,phase_num=1;

SFC_TRAN_CFG0(0) 和 SFC_TRAN_CFG1(0):cmd_en=1,cmd=0xFF,tran_mode=0;

h) 使能 sfc start,等待 sfc_end 并清除;

DMA 模式操作需要注意的参数

除了基本配置外,DMA 操作还需要注意的其它参数。

  • 配置 SFC_GLB(BURST_LEN、OP_MODE、DES_EN)

  • 配置 SFC_MEM_ADDR(内存地址)

CPU 模式操作需要注意的参数

  • 对于每个数据传输阶段,在阶段开始之前必须进行复位 FIFO 操作。

  • SFC 将会根据阈值产生请求。当 CPU 轮询 SFC_SR 寄存器或等待中断时,AHB 总线每次传输的数据量必须与阈值匹配。

示例(DMA 模式下阶段 NAND 闪存写入)

a) 配置 SFC_DEV_CONF 和 SFC_GLB 寄存器

b) 程序加载(PL)

多阶段流程
图 1 多阶段流程

配置 PL 参数到阶段 0 对应的寄存器:

  • 配置 SFC_TRAN_CONF0(TRAN_MODE, CMD_EN, ADDR_WIDTH, DMY_NUM, 等)

  • 配置 SFC_DEV_ADDR0

  • 配置 SFC_TRAN_LEN

c) 写使能image.png

配置 WE(write enable) 参数到阶段 1 对应的寄存器:

  • 配置 SFC_TRAN_CONF1(TRAN_MODE, CMD_EN, CMD 等)

d) 程序执行image.png

配置 PE(Program execute) 参数到阶段 2 对应的寄存器:

  • 配置 SFC_TRAN_CONF2(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD 等)

  • 配置 SFC_DEV_ADDR2

e) 读取状态的 get features 命令image.png

配置 GF 参数到阶段 3 相关寄存器:

  • 配置 SFC_TRAN_CONF3(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD,POLL_EN,等)

  • 配置 SFC_DEV_ADDR3

  • 配置 SFC_DEV_STA_EXP

  • 配置 SFC_DEV_STA_MSK

f) 开始

g) 等待 END 中断

h) 清除 END 位

示例(DMA 描述符模式下的多阶段 NAND 闪存写入)

a) 配置 SFC_DEV_CONF 和 SFC_GLB 寄存器

b) 配置 DMA 描述符

  • 在系统内存中创建 DMA 描述符

  • 配置 SFC_DES_ADDR(描述符链接的第一个描述符 phy 地址)

c) 程序加载

单阶段流程
图 2 单阶段流程

配置 PL 参数到阶段 0 相应的寄存器:

  • 配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,ADDR_WIDTH,DMY_NUM 等)

  • 配置 SFC_DEV_ADDR0

d) 写使能image.png

配置 WE 参数到阶段 1 相应的寄存器:

  • 配置 SFC_TRAN_CONF1(TRAN_MODE,CMD_EN,CMD 等)

e) 程序执行image.png

配置 PE 参数到阶段 2 相应寄存器:

  • 配置 SFC_TRAN_CONF2(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD 等)

  • 配置 SFC_DEV_ADDR2

f) 读取状态的 get features 命令image.png

配置 GF 参数到阶段 3 相应寄存器:

  • 配置 SFC_TRAN_CONF3(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD,POLL_EN 等)

  • 配置 SFC_DEV_ADDR3

  • 配置 SFC_DEV_STA_EXP

  • 配置 SFC_DEV_STA_MSK

g) 开始 Start

h) 等待 END 中断

i) 清除 END 位

示例(CDT 模式下多阶段 NAND 闪存写入)

a) 配置 SFC_DEV_CONF 和 SFC_GLB 寄存器

b) 配置 CDT 寄存器

c) 通过 CDT ADDR_KIND 来配置地址寄存器(SFC_COL_ADDR,SFC_ROW_ADDR,SFC_STA_ADDR0,SFC_STA_ADDR1)

d) 配置 CDT 索引寄存器 SFC_CMD_IDX

e) 开始 Start

f) 等待 END 并清除 END 位

示例(CPU 模式下一个阶段 NAND 闪存写入)

a) 配置 SFC_DEV_CONF 和 SFC_GLB 寄存器

b) 程序加载

XIP模式配置流程
图 3 XIP模式配置流程

i. 使能 SFC_CTRL.FLUSH

ii. 配置 PL 参数到阶段 0 相应的寄存器:

  • 配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,ADDR_WIDTH,DMY_NUM,等)

  • 配置 SFC_DEV_ADDR0

  • 配置 SFC_TRAN_LEN

  • 配置 SFC_GLB.TRANS_DIR

iii. 开始

iv. 等待 SFC_SR.TREQ 并清除,然后根据阈值将数据放置到 FIFO。循环直到所有数据传输结束

v. 等待结束并清除

c) 写使能image.png

i. 配置 WE 参数到阶段 0 相应的寄存器:

  • 配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,CMD,等)

ii. 开始

iii. 等待结束并清除

d) 程序执行image.png

i. 配置 PE 参数到阶段 0 相应的寄存器:

  • 配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD,等)

  • 配置 SFC_DEV_ADDR0

ii. 开始

iii. 等待结束并清除

e) 读取状态的 get features 命令image.png

i. 配置 GF 参数阶段 0 相应的寄存器:

  • 配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD 等)

  • 配置 SFC_DEV_ADDR0

  • 配置 SFC_TRANS_LEN

  • 配置 SFC_GLB.TRANS_DIR

ii. 开始

iii. 等待 SFC_SR.RREQ 并清除,然后根据阈值从 FIFO 获取数据,循环直到所有数据传输结束

iv. 等待结束并清除