在上一篇博客中,我写了NANDFLASH的相关操作,书接上文。由于不同厂家生产的NANDFLASH在接口时序、内部组织架构等方面的不同,导致其在移植时比较麻烦。
与之相比,MMC卡/SD卡有统一的接口,统一的协议,并且将NANDFLASH卡片化。而eMMC(embedded MMC)是将MMC卡做成嵌入式芯片的形式,满足了现代嵌入式对芯片体积的要求,而且eMMC与SD卡的各种操作基本一致。
iNAND则是eMMC的代表之一。
1. iNAND与SD卡接口
有以下几点需要注意:
- SD卡与iNAND都由数根数据线,一根命令线,一根时钟线组成。
- iNand的IO线有8根,支持1、4、8线并行传输模式;SD卡IO线有4根,支持1、4线并行传输模式。
- SD/iNAND的控制是有时钟线的,Soc会给SD/iNAND一个时钟信号,跟NANDFLASH使用各种使能线来控制的方式不同。
2. SD/iNAND的控制——命令+响应
2.1 命令
对于SD卡/iNAND的控制都是依赖于发送命令与接收响应的。下图是从SanDisk的资料“SD卡的官方资料”中截出来的部分指令。
注意,除了CMD命令之外,还有ACMD指令,ACMD指令是由两个CMD指令组合而成,可以认为ACMDx = CMDy+CMDz(y一般是55)。
2.2 响应
有的指令需要响应,有的指令不需要响应。
同样从上面的文档中摘取一种响应,如下。
响应类型R3长度为48位,是ACMD41指令的回复,其主要内容是将SD卡的OCR寄存器的内容发送到Soc,数据格式如图所示。
2.3 卡状态
SD/iNAND有不同的状态,如空闲状态、数据发送状态、断开连接状态等,**在不同的状态下能处理的命令是有差别的。**SD卡本身的控制器相当于一个状态机,从下图可以看出。
对图中内容稍作解释:SD卡在初始化之后将进入”Stand-by State”状态,接收到CMD7后,将进入”Transfer State”,做好了数据传输的准备,这时如果接收到的是”CMD 6,17,18,30,56/ACMD 13,22,51”中的一个将进入”Sending data State”开始发送数据,发送完成或是接收到CMD12命令将会回到”Transfer State”状态。
3. SD/iNAND的初始化操作
初始化过程包括:配置响应的IO口,设置Soc控制器和SD的操作时钟,确定接在Soc上的卡种类(SD V1/SD V2/SD HC/MMC)。其中,确定卡种类的流程图如下所示。
包括读写SD卡以及上述初始化过程,根据现成的程序查询数据手册慢慢看就好了。