1 SPI NOR
现在很多嵌入式系统使用了SPI NOR FLASH,而不选择CFI NOR FLASH,这样能够节省更多的I/O口。而现在SPI NOR FLASH的读取速度其实很快了,像最新的MXIC的OCTAL FLASH能够达到400MB/s的读取速率,而只需要12跟I/O线即可。
本文选择一种具体的SPI NOR FLASH以及NXP i.MX系列SOC上的FlexSPI控制器来讲解SPI NOR的一些概念以及软件的编写,这里选择MICRON的MT25系列的QuadSPI FLASH。
1.1 SPI 协议
最原始的SPI协议很简单,只有四根线,其通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。
- SDO 主设备数据输出,从设备数据输入
- SDI 主设备数据输入,从设备数据输出
- SCLK 时钟信号,由主设备产生
- SS 从设备使能信号,由主设备控制, 低电平选中
SPI有四种工作模式,各个工作模式的不同在于SCLK不同, 具体工作由CPOL,CPHA决定
CPOL: (Clock Polarity),时钟极性
当CPOL为0时,时钟空闲时电平为低;
当CPOL为1时,时钟空闲时电平为高;
CPHA:(Clock Phase),时钟相位
当CPHA为0时,时钟周期的上升沿采集数据,时钟周期的下降沿输出数据;
当CPHA为1时,时钟周期的下降沿采集数据,时钟周期的上升沿输出数据;
CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:
四种工作模式现如下:
1.2 SPI NOR FLASH
上面看到传统的SPI协议只有四根I/O线,而SPI NOR FLASH的厂商为了增加数据吞吐量,将SPI NOR FLASH的数据线进行扩展,因此产生了SPI FLASH,Dual SPI FLASH(两根data线),Quad SPI FLAHS(4根data线), Octal SPI FLASH(8根data线)。在clock一定的情况下, 理论上线数越多速度越快。而对于SPI NOR FLASH来说,似乎不需要全双工的操作,因为读写一般不会同时进行。
由于现在QSPI FLASH比较流行,所以QSPI的一些操作都已经比较标准化了,许多能从SPI NOR中的SFDP中读出,后面有一小节会介绍SPI NOR 的SFDP。而Octal FLASH在市场上时间比较短,并且价格昂贵,使用的系统还不是很多。所以Octal FLASH现在没有一个统一的标准,不同厂家Octal FLASH的Octal I/O的读写有很大的差异。
下面我们看一些主流的一些SPI NOR FLASH的一些信息。
1.2.1 主流设备
主流生产SPI NOR FLASH的厂商有MICRON,MXIC, CYPRESS,SPANSION,ADESTO等。
MT25QL512AB
这是MICRON的一款QSPI FLASH,它支持Single I/O,Dual I/O和Quad I/O。不过一般来说对于QSPI FLASH来说,只会用Single或者Quad I/O,很少会用Dual I/O。
对于STR传输,也就是单时钟边沿采样,最高采样频率能达到133MHz。对于DTR双边沿采样来说,最高采样频率能达到66MHz。所以SDR和DTR的采样数据的速度其实是一样的。
下图是MT25的I/O口描述
与传统的SPI 接口相比,多了W#/DQ2和DQ3/HOLD#,这两个I/O在Quad SPI情况下用作I/O口,在Dual和Single的情况下用作其他用处,这里不做阐述。
MT35XU02GCBA
这是MICRON的一款Octal FLASH,它支持Single I/O和Octal I/O。对于STR传输,也就是单时钟边沿采样,最高采样频率能达到166MHz。对于DTR双边沿采样来说,最高采样频率能达到200MHz,实际采样数据速率能到达400MB/s。所以Octal FLASH相比于QSPI FLASH性能提升是很大,但同时Octal FLASH相比于QSPI FLASH会贵很多。对于太部分嵌入式系统来说,成本比性能更重要,所以最主流的还是QSPI FLASH。
下图是MT35的I/O口描述
C是时钟信号,S#是片选,DQ[7:0]是数据线,DQS是读数据采样时钟,W#写保护信号。
DQS
因为Octal FLASH DTR 200MH的情况下,由于CLK的传输的时候有延迟,单纯使用SPI HOST传过来的时钟信号会导致采样不准确,所以FLASH提供了一根DQS信号要提供读数据采样时钟给HOST。而写数据就不会有这种问题,所以写数据没有DQS。
S26KL512S
这是CYPRESS的一款HyperFLASH。 HyperFLASH也是一种8根I/O的FLASH,但它的操作跟其他厂家的Octal FLASH又很不一样。这里贴上一篇当时学习HyperFLASH的小记,比较详细介绍了HyperFLASH的接口以及时序等。
HyperBus Nor Flash小记
1.2.2 SPI NOR 主要操作时序
简单起见,这里以MT25为例来讲解QSPI FLASH的一些主要的命令的时序:读,写,擦除,写使能,读寄存器等。
原因有2:QSPI FLASH现在使用的最多,QSPI相对于Octal FLASH来说使用起来简单一点。这里只讨论Extended SPI,Dual SPI和Qual SPI就不讨论了,这三种模式的差异仅仅体现在命令的传输上。Extended SPI命令传输使用DQ0,而Dual SPI使用两根线来传输命令, Quad SPI使用四根线来传输命令。
读命令13h
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
4-BYTE READ | 13h | 1-1-1 | 4 | 0 | 1 to ∞ |
这个读命令是最基本的SPI 模式,命令,地址和数据都采用一根DQ线来传输。地址使用4个byte。下来贴出改命令的时序图。
这个时序很简单,在0-7的时钟周期内,SPI HOST发出1个byte的命令13h。紧接着发出32位的地址,地址先发高位。最后FLASH以一个byte为单位送出数据,同样的数据先发高位。
读命令ECh
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
4-BYTE QUAD INPUT/OUTPUT FAST READ | ECh | 1-4-4 | 4 | 10 | 1 to ∞ |
ECh是STR的Quad I/O读命令,在Extended SPI模式下, 命令阶段HOST采用一个I/O口DQ0来发送8bit的ECh。
紧接着在8-16个时钟周期内HOST发出32位的地址,同样高位数据先发,比如在第八个Cycle时候,DQ3发送addr[31],DQ2发送addr[30],DQ1发送addr[29], DQ0发送addr[28]。
ECh需要dummy 的clock cycle,这段时间内FLASH内的控制器需要做一些操作将数据读出,并且送到SPI总线上。从MT25的RM中看到这里ECh的Dummy Cycle需要10个Clock Cycle。
最后Flash就会将数据送出,送出的数据格式与地址的格式一样,高位先发。因为STR模式,所以可以看到在数据采样阶段,一个Clock Cycle只有采样一个bit的数据。
读命令EEh
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
4-BYTE DTR QUAD INPUT/OUTPUT FAST READ | EEh | 1-4-4 | 4 | 8 | 1 to ∞ |
这里应该是EEh,估计是MT25的RM上写错了。这上面的EDh跟EEh的时序是一样的。EEh是DTR模式下的QUAD I/O,它基本跟ECh的时序是一样的。与ECh不同的点在于EEh的地址阶段和数据阶段都是双边沿采样,所以在Address和Data阶段中,一个Clock Cycle会采到两个bit。从上图中可以看出来
读FLASH ID 9Eh
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
READ ID | 9Eh | 1-0-1 | 0 | 0 | 1 to 20 |
9Eh时序非常简单,HOST送出8bit的命令,然后FLASH会依次送出8bit的Manufaturer ID,16bit的Device ID,以及不定长的UID。下图是MT25的Device ID数据结构
读Status Register 05h
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
READ STATUS REGISTER | 05h | 1-0-1 | 0 | 0 | 1 to ∞ |
这个图的时序是读register的操作,就是除了status register还有其他的register。所有的读register时序都是一样的,HOST在DQ0发出8bit的命令,然后FLASH给出register的值。这里status register一共是八位,一般用来查询读操作是否完成。
32KB SUBSECTOR擦除命令52h
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
32KB SUBSECTOR ERASE | 05h | 1-0-1 | 0 | 0 | 1 to ∞ |
我们知道对NOR FLASH来说,只能从1写到0,所以在对某一个word或者byte进行写操作的时候,需要对NOR FLASH进行擦除。但一般SPI NOR FLASH都没有字节擦除的命令,最小都是基于SUBSECTOR的擦除。比如52h就是32KB SUBSECTOR的擦除命令。擦除之后整个32KB的SUBSECTOR会被置为全1。
时序很简单,HOST先发出8bit的命令,然后发出32bit的地址就可以了。
写命令 12h
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
4-BYTE PAGE PROGRAM | 12h | 1-1-1 | 0 | 0 | 1 to 256 |
写命令一次只能写一个PAGE,也就是256个byte。这里只贴出了Single的写命令,其他的Quad和Dual的写命令的时序都查不到,类比于读命令。有兴趣的可以查FLASH的RM。
时序比较简单,基本跟读命令13h是一样的,只是在Data阶段,数据是由HOST发出,而不是FLASH发出。并且Single的SPI模式下,HOST发出的数据在DQ0上传输。
写使能 06h
不管是在擦除还是写数据之前,都需要进行写使能操作,才能操作SPI NOR FLASH。
Command | Code | Command-Addess-Data(Extended SPI) | Address Bytes | Dummy Clock Cycles(Extended SPI) | Data Bytes |
---|---|---|---|---|---|
WRITE ENABLE | 06h | 1-0-0 | 0 | 0 | 0 |
这种类型的命令只有Command阶段,也就是HOST发出8bit的命令就行。
1.2.3 JEDEC SFDP
随着串行Flash市场不断的扩张,串行Flash的指令、功能和特性也日趋增多,而且各个厂商在串行Flash器件上的功能和特性也无法完全一致。例如,在扇区擦除功能上,支持4kB、32kB、64kB的擦除操作虽然分别有相应的指令,但是不同厂商的器件还是会存在一些指令和功能的差异。为了准确地完成系统的兼容性测试或者是考虑到容量的升级,开发和设计人员需要详细阅读每一份串行Flash的产品规范,了解引脚的分布和定义是否一致,操作所需要用到的功能指令是否完全兼容,从而对底层设备驱动软件做相应的增补和修改,甚至改动到硬件,这无疑给项目的设计、维护和更新带来一些不便。因此,串行Flash器件迫切需要一个统一规范的功能参数表,可以让开发和设计人员明确地读取到每一个所使用串行Flash的功能和参数特性。JEDEC的新规范JESD216 SFDP就是在这样的一个市场环境下孕育而生的。摘自http://www.21ic.com/app/rf/201308/189076.htm
简而言之,SFDP就是存储在SPI NOR FLASH 内部的一个数据结构,通过这个数据结构能够得到一些SPI NOR FLASH的信息,比如说是否支持Quad I/O传输,Quad I/O的命令是什么,诸如此类,这样的话。在驱动初始化的时候先读出SFDP,然后根据SFDP解析出SPI NOR FLASH的信息去初始化HOST控制器。而不需要为每一个FLASH建立一堆配置。可惜的是现在SFDP仅支持QSPI FLASH。对于OCTAL FLASH,没办法读出相应的信息,在驱动程序中,如果要兼容不同厂家的OCTAL FLASH,还要去建立各种各样的配置。
SPI NOR JEDEC标准
分析一下MT25的SFDP长什么样,从中能够得到什么信息。
上图是SFDP主要的header。
- 前4个byte存的是SFDP签名,这个是SFDP标准固定。
- 04h和05h分别存放了SFDP的主版本号和次版本号。
- 06h记录了一共有多少个参数表,MT25只有一个parameter table。parameter table里面记录的就是QSPI的一些信息。
- 08h-0Fh记录了第一个paramter table的信息。如果有多个parameter table的话,在第一个parameter table后面会有多个这个的数据结构。