嵌入式存储(SPI NOR, SD, EMMC/基于NXP i.MX SOC)(未完)

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后面会有多个这个的数据结构。

1.3 i.MX FlexSPI控制器简介

1.4 SPI NOR 驱动程序实例

1.5常见问题

2 SD卡

3 EMMC卡

猜你喜欢

转载自blog.csdn.net/u011280717/article/details/81408874