SD卡学习笔记五
来源:互联网 发布:mysql 查询数据表字段 编辑:程序博客网 时间:2024/04/29 21:39
转自:http://www.tuicool.com/articles/aimqQ3
SD卡为移动设备提供了安全的,大容量存储解决方法。它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式。一些廉价,低端的MCU,通过硬件(或软件)SPI就能和SD卡进行通信,实现大容量存储的要求,这也是SD卡的魅力所在。
一、引脚定义
SD BUS模式下,信号包括4根数据线DAT3~DAT0,一根命令传输线CMD和一根时钟同步线;而在SPI模式下,只需要4跟信号线,分别为一根SD卡数据输出,一根SD卡数据输入,一根时钟同步和一根片选线。右图所示是SD卡的引脚定义,左边为标准SD卡,右边为Micro SD卡(也叫TF卡)。二、SPI模式
在SPI模式下,数据都是以字节(Byte)为单位进行传输的。此时SD卡作为从机设备,一般的操作是MCU发送带有参数的命令,SD卡接收到命令和参数后进行操作,并且返回响应,MCU根据返回的响应进行下一步操作。命令
SD卡的命令有6个字节(48位),由以下几部分组成:第一字节的最高位b7为起始位,始终为0,接下来为传输位,始终为1,b5-b0为命令代码;第2~5字节为命令的参数,共4个字节;最后一个字节的前7为CRC7校验位,最后一位为停止位,始终为1。
每一条命令都是从片选信号(CS)的下降沿开始,SD卡接收到指令以后,都需要有一个指令响应时间(N CR ),一般需要8个到64个时钟周期。SPI的指令简记为CMD<n>,<n>表示指令内容的十进制值,对于没有参数的指令,参数为内容要用0来填充。下表列出了SPI模式下常用的指令
命令参数响应类型简写描述CMD00R1GO_IDLE_STATE软件复位CMD8(*1)R7SEND_IF_COND发送MCU的电压范围,检测SD卡是否满足MCU的电压范围ACMD41(*2)(*3)R1SD_SEND_OP_COND开始SD卡初始化和检测SD卡是否完成初始化CMD90R1SEND_CSD读取CSD寄存器的值CMD100R1SEND_CID读取CID寄存器的值CMD120R1bSTOP_TRANSMISSION停止读取操作CMD16数据块长度[31:0]R1SET_BLOCKLEN设置数据块长度(*4)CMD17地址[31:0]R1READ_SINGLE_BLOCK读取单个数据块CMD18地址[31:0]R1READ_MULTIPLE_BLOCK读取多个块数据CMD24地址[31:0]R1WRITE_BLOCK写单个块数据CMD25地址[31:0]R1WRITE_MULTIPLE_BLOCK写多个块数据CMD550R1APP_CMD定义下一条命令为ACMD<n>命令CMD580R3READ_OCR读取OCR寄存器*1 : [31:12]为0,[11:8]为VHS值,[7:0]Check Pattern,可以为任意值,用于检测SD卡通信是否正确的。若该命令的返回值最后一字节和Check pattern值相同,说明SPI通信成功。
*2 : 发送ACMD<n>之前需要先发送CMD55命令。
*3 : [31],[29:0]为0,[30]位为HCS,若MCU支持SDHC或者SDXC卡类型,HCS为0,支持则为1。
*4 : 对于SDSC卡类型,块长度有CMD16来设定。而对于SDHC和SDXC卡类型,数据块长度始终为512字节,此命令不会影响数据块长度。
响应
不同的命令,响应的格式和长度也不同。
R1是一个1字节长的的响应,最高位始终为0,其余各位为状态位(如右图所示)。R3响应的格式是R1+OCR寄存器,OCR是一个32位的寄存器,存放的是SD卡的操作电压范围。R7响应也是由R1+32位长的数据组成。
另一个响应是R1b响应,他是在R1的基础上增加了一个忙碌(Busy)状态指示:当R1的值为0时,表示SD卡处于忙碌状态,而当R1为任何不为0的值时,SD卡才能开始接收下一条命令。
三、初始化操作
SPI模式下的初始化操作有:上电->进入SPI模式(CMD0)->检测当前MCU电压是否符合SD卡的要求(CMD8)->开始初始化(ACMD41)->读取卡类型(CMD58)
初始化过程中,SD卡时钟信号周期需为100KHz~400KHz之间,不能大于400KHz。
上电
当电压达到SD卡的最小工作电压的后,MCU必须使CS,DI为高电平,输出最少74个时钟脉冲后,才能开始发送第一个命令。
初始化过程
SD卡上电后处于SD Bus模式,使CS保持为0,并且发送CMD0命令,SD卡就会进入到SPI模式。在SPI模式下,命令的CRC校验功能默认是禁止的(CMD8命令
除外),但是发送第一个CMD0命令时,SD卡是处于SD Bus模式,该模式下CRC校验功能是启动的,因此第一个CMD0命令必须要有正确的CRC校验。正确的CMD0命
令应为:0x40, 0x00, 0x00, 0x00, 0x00, 0x95。
CMD8用于检测SD卡接口电压是否满足要求,该命令的参数包括当前MCU接口的电压范围VHS([11:8]),以及用于检测通信的Check Pattern([7:0])。如果SD
卡能满足当前MCU的接口电压,它就会返回VHS和Check Pattern的值。需要注意的是,CMD8的CRC校验值必须正确,假如CRC校验不对,SD卡返回的R1值中的
CRC错误位就会置1。
ACMD41命令用于开始初始化SD卡及检测其是否完成初始化。该命令的参数HCS([30])表示MCU是否支持SDHC和SDXC,若支持HCS置1,反之置0。如果
ACDM41命令返回R1的值为0x01,说明SD卡正在初始化,MCU需要重复发送ACMD41,直到返回值R1为0。
初始化完成后,通过发送CMD58指令读取卡的类型(OCR寄存器的CCS位[30]), CCS为1表示当前卡的类型为SDXC或者SDHC,为0表示卡的类型为SDSC。
四、数据读写操作
MCU和SD卡间的数据交换都是以数据包为单位进行的。一个完整的数据包包括数据标识符(Token),数据块内容,CRC校验值。根据不同的命令,数据的起
始标识符会不一样,如右图所示。写入数据后,SD卡会立即返回一个数据响应(区别于命令响应),MCU可根据该响应来判断数据是否传输正确。
对于SDSC卡类型,数据块的长度(字节为单位)可以通过CMD16来设定,最小1个字节,最大2048个字节。对于SDXC和SDHC卡,数据块长度始终为512字节,CMD16不会影响数据块的长度。SPI模式下,CRC校验功能是关闭的,因此CRC校验值可以为任意值。
读取单个数据块
MCU发出读取单个数据块命令CMD17,若SD卡返回响应无错误(返回0),则开始等待数据块起始标识符0xFE, 然后开始读取数据块和CRC校验。
读取多个数据块
读取多个数据块操作和读取单个数据块的相似,先发送命令CMD18,然后开始等待数据块的起始标识符。需要停止读取操作时,发送CMD12命令,返回响应为0表示
SD卡处于忙碌状态,只有返回任何不为0的值后,MCU才能发送下一条命令。
写入单个数据块
当SD卡接收到写入单个数据块的命令CMD24后,首先发送数据块起始标识(0xFE),然后发送发送数据块内容和CRC校验,如果未启用CRC校验功能,CRC可以为
任意值。SD卡在接收到数据包后回返回数据响应,若无错误,则SD卡就开始写入数据,此时DO信号将被拉低,表示SD卡正处于忙碌状态,不能接收命令。只有当
DO不为0时,MCU才能发送下一条命令。
写入多个数据块
和写入单个数据块不同的是,当SD卡接收到写入多个数据块命令CMD25后,发送数据包起始符为(0xFC), 只有当DO不为0时,才能继续发送第二个数据包。如果要
结束写入操作,则发送停止发送标识符(0xFD)。
读取CID和CSD
读取CID和CSD寄存器的操作和读取单个数据块的操作相似,仅仅是命令和数据块长度不同。CID和CSD寄存器的定义请参照SD卡协议。
四、链接
1. How to Use MMC/SDC
2. [PDF]SD卡协议
3. SD/MMC时序图
- SD卡学习笔记五
- SD卡学习笔记
- SD卡学习笔记
- SD卡学习笔记二
- SD卡学习笔记三
- SD卡学习笔记四
- SD卡学习笔记六
- SD卡驱动学习笔记
- SD卡FAT16文件系统的学习笔记
- SD卡FAT16文件系统的学习笔记
- 【android学习笔记】读取SD卡
- SD学习笔记
- SD学习笔记一
- android学习笔记9--------------SD卡读写文件
- Android学习笔记之SD卡驱动(1)
- 基于STM32的SD卡FATFS文件系统学习笔记
- (Android学习笔记)读写SD卡文件
- 树莓派B+新手学习笔记---【使用SD卡剩余空间】
- EasyUI Droppable 可放置
- 编译android源码时用到的几个命令m、mm、mmm
- android 教您打造属于自己的注解(@interface) 优雅与便捷并行(二)
- linux 命令系列之 ACL设置(30)
- oracle用控制文件旧备份恢复后数据库恢复总结
- SD卡学习笔记五
- Dollar Dayz (大数dp fuck!不是多组数据!!)
- SQL 基础--> 视图(CREATE VIEW)
- 实习的感受
- oracle查看允许的最大连接数和当前连接数等信息
- linux 命令系列之 ACL最大权限,删除,递归(31)
- iOS 真机器调试步骤
- MyEclipse WebSphere概述(下)
- Android 最火的快速开发框架XUtils