USER GUIDE / MEMORY / SPI FLASH / SOFTWARE GUIDE
软件指南
软件指南
CDT 描述符
每个命令由 4 个字组成,并且每个命令可以链接下一个命令,也可以不链接下一个命令。
硬件每执行一个命令链,一个命令链中最多只能传输一次数据。
每个命令的结构如下所示:
| 名称 | 描述 |
|---|---|
| LINK | 1:不是链的最后一个命令 0:是链的最后一个命令 |
| ADDR_KIND | 0:列地址(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 | 当前传输数据长度 |
| LINK | 1:这不是最后一个描述符 0:这是最后一个描述符 |
| others | 其他信号的定义与上述寄存器定义一致 |
阶段描述
每个阶段可以由四个部分组成:CMD、ADDR、DUMMY、DATA。
每个阶段可以有一个或多个组成部分,最多四个。
对于同一个部分,一个阶段最多只能有一个。
在所有阶段中,只有一个阶段可以有 DATA 部分。(我们称这个阶段为数据阶段,其它为命令阶段)
一个阶段的各个部分将采用两种顺序格式:
对于一个流程,最多有 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)

配置 PL 参数到阶段 0 对应的寄存器:
配置 SFC_TRAN_CONF0(TRAN_MODE, CMD_EN, ADDR_WIDTH, DMY_NUM, 等)
配置 SFC_DEV_ADDR0
配置 SFC_TRAN_LEN
c) 写使能
配置 WE(write enable) 参数到阶段 1 对应的寄存器:
配置 SFC_TRAN_CONF1(TRAN_MODE, CMD_EN, CMD 等)
d) 程序执行
配置 PE(Program execute) 参数到阶段 2 对应的寄存器:
配置 SFC_TRAN_CONF2(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD 等)
配置 SFC_DEV_ADDR2
e) 读取状态的 get features 命令
配置 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) 程序加载

配置 PL 参数到阶段 0 相应的寄存器:
配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,ADDR_WIDTH,DMY_NUM 等)
配置 SFC_DEV_ADDR0
d) 写使能
配置 WE 参数到阶段 1 相应的寄存器:
配置 SFC_TRAN_CONF1(TRAN_MODE,CMD_EN,CMD 等)
e) 程序执行
配置 PE 参数到阶段 2 相应寄存器:
配置 SFC_TRAN_CONF2(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD 等)
配置 SFC_DEV_ADDR2
f) 读取状态的 get features 命令
配置 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) 程序加载

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) 写使能
i. 配置 WE 参数到阶段 0 相应的寄存器:
配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,CMD,等)
ii. 开始
iii. 等待结束并清除
d) 程序执行
i. 配置 PE 参数到阶段 0 相应的寄存器:
配置 SFC_TRAN_CONF0(TRAN_MODE,CMD_EN,ADDR_WIDTH,CMD,等)
配置 SFC_DEV_ADDR0
ii. 开始
iii. 等待结束并清除
e) 读取状态的 get features 命令
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. 等待结束并清除