Serial Flash Discoverable Parameters (SFDP) 是由JEDEC定义的一套适用于串行Flash(NOR Flash、NAND Flash)的标准,即JESD216标准。JESD216文档篇幅不长,主要定义了一些用于描述Flash参数与能力的表格,Flash驱动通过读取这些表格即可获取Flash的基本信息。本文以名词“JESD216”专指JEDEC发布的标准JESD216,以名词“SFDP”专指JESD216标准中定义的串行Flash可发现参数表。
JEDEC会不断发布新版本的JESD216规范,最新版本可在JEDEC官网下载(需注册账户)。本博客文档是基于JESD216E编写的。JESD216各版本信息如下:
版本 | 地址(官方下载需登录) | 备注 |
---|---|---|
JESD216 | 官方下载,三方下载 | 发布于2011年,是JESD216规范的第一版 |
JESD216A | 官方下载,三方下载 | 发布于2013年。 |
JESD216B | 发布于2014年 | |
JESD216C | 发布于2018年 | |
JESD216D | 发布于2018年 | |
JESD216D.01 | 发布于2019年 | |
JESD216E | 发布于2021年 | |
JESD216F | 官方下载,三方下载 | 发布于2021年 |
JESD216F.01 | 官方下载,三方下载 | 发布于2022年 |
JESD216F.02 | 官方下载,三方下载 | 发布于2022年 |
1. 访问SFDP表
JESD216文档定义了 0x5A
、0x5B
两条指令用于访问SFDP表。
0x5A
:将SFDP表由Flash读取至主机。0x5B
:将SFDP表由Flash储存区拷贝至Flash缓冲区。该指令适用于NVM设备。
对于Serial NOR Flash设备,仅使用0x5A
即可读取SFDP表至主机。对于Serial NAND Flash设备,需先使用指令0x5B
,之后再使用0x5A
将SFDP表读取至主机。
系统初始化阶段,Flash驱动可能并不了解Flash默认的访问模式(SPI、QPI模式),按照JESD216规范描述,驱动应当先使用QPI模式探测SFDP表存在与否,若探测失败则再使用SPI模式探测。具体的探测顺序为:
- 使用4_4_4(命令占用的总线宽度为4,地址占用的总线宽度为4,数据占用的总线宽度为4,下同)模式尝试读取SFDP表。若探测成功,则Flash默认访问模式为QPI,否则进行下一步。
- 使用2_2_2模式尝试读取SFDP表。若探测成功,则Flash默认访问模式为SPI,否则进行下一步。
- 使用1_1_1模式尝试读取SFDP表。若探测成功,则Flash默认访问模式为SPI,否则可认为该Flash不符合JESD216标准。
注意事项:
虽然JESD216标准定义了主机向Flash发送0x5A
命令的格式:1字节命令+3字节地址+8个时钟周期dummy+数据,但并不是所有符合JESD216标准的Flash芯片实现此命令时都支持的8个周期的dummy,这意味着Flash驱动在探测阶段发送0x5A
命令时需要尝试性的发送不同dummy周期数的0x5A
命令,以探测Flash实际支持的dummy周期数。例如,Flash芯片IS25LP064A
在SPI模式下0x5A
命令格式同JESD216标准定义的一致,为1字节命令+3字节地址+8个时钟周期dummy+数据,但在QPI模式下,支持的0x5A
命令格式可能是如下几种之一:
- 1字节命令+3字节地址+4个时钟周期dummy+数据
- 1字节命令+3字节地址+6个时钟周期dummy+数据
- 1字节命令+3字节地址+8个时钟周期dummy+数据
- 1字节命令+3字节地址+10个时钟周期dummy+数据
虽然
IS25LP064A
允许软件去配置QPI模式下0x5A
命令的dummy周期数4、6、8、10,但这个寄存器并没有被JESD216标准定义。鉴于此,Flash驱动在探测阶段发送0x5A
命令时需要尝试性的发送不同dummy周期数的0x5A
命令,以探测Flash实际支持的dummy周期数。
2. SFDP 标题
SFDP由“标题”和“参数表”组成。标题描述参数表的版本、类型、大小等。参数表用于记录具体的参数与能力。与纸质书籍组织数据的方式相仿:SFDP表的标题类似于书籍的目录项、参数表类似于书籍正文的章节。软件读取参数表时需要先读取标题,之后依据标题中对参数表位置的索引,继而去读取参数表。
2.1 SFDP标题类型
SFDP相关的标题共两大类:SFDP标题、SFDP参数标题。SFDP标题用于描述Flash支持的JESD216版本信息以及SFDP参数标题的基本信息。SFDP参数标题用于描述参数表的位置、版本等基本信息,一个SFDP参数标题与一个参数表相对应。
SFDP使用ID来标识不同的SFDP参数标题指向的参数表的格式,这个ID记录在SFDP参数标题中,可使用的ID种类主要是(但不限于)JESD216文档的“Function Specific parameter table ID assignments”章节中描述的那些,各Flash制造商亦可向JEDEC申请新的ID用于标识该制造商特有的或未标准化的参数。
一些Flash设备会提供同ID但版本号不同的多个SFDP参数标题。例如,下图是
S25FL512SAGMFI011
数据手册中SFDP参数标题列表的部分内容,图中左侧两条竖向线条分别对应一个SFDP参数标题,右侧的两种颜色的横向线条勾选的内容展示了12SAGMFI011
提供的ID相同但版本号不同的多个SFDP参数标题。
3 SFDP 参数表
3.1 基本的Flash参数(ID:0xFF00)
该表存放的参数是Flash基本的SPI参数。JESD216要求所有符合规范的Flash设备均要提供该参数表。
Flash的基本操作是读、写、擦除。基本的Flash参数表中展示了擦除操作使用的指令但并未展示单线模式下读和写的指令。缘于此,个人暂且认为默认的单线模式下读指令和写指令分别是
。
0x03
和
0x02
3.2 4字节地址指令表(ID:0xFF84)
该表描述了一些Flash工作在4字节地址模式时的读写擦擦指令。这些指令只适用于4字节地址模式而不适用于3字节地址模式。
附录
附录用于记录杂项内容。
附-1 驱动软件读取SFDP的一般流程
- 探测SFDP标题(验证Flash是否支持JESD216规范),探测的同时亦可获取到Flash默认的工作模式:SPI、QPI模式。
- 读取SFDP标题,检查头中的签名、版本、访问协议
- 根据SFDP标题中标识的参数标题的个数,将这些参数标题一并读取到内存
- 遍历参数标题,检查参数标题中的版本、依据参数标题中的ID逐个解析参数标题指向的参数表。
- 将步骤4中解析到的参数整理到一个结构体中。
- Flash驱动使用步骤5中结构体的参数。
附-2 JESD216对Serial NAND Flash的支持情况
通过比较JESD216规范文档的不同版本,发现较新的规范不仅适用于Serial NOR Flash,也适用于Serial NAND Flash,但截至目前(2022年3月)还没有发现支持JESD216的Serial NAND Flash产品。
文章评论