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卡接收到指令以后,都需要有一个指令响应时间(NCR),一般需要8个到64个时钟周期。SPI的指令简记为CMD<n>,<n>表示指令内容的十进制值,对于没有参数的指令,参数为内容要用0来填充。下表列出了SPI模式下常用的指令

命令 参数 响应类型 简写 描述
CMD0 0 R1 GO_IDLE_STATE 软件复位
CMD8 (*1) R7 SEND_IF_COND 发送MCU的电压范围,检测SD卡是否满足MCU的电压范围
ACMD41(*2) (*3) R1 SD_SEND_OP_COND 开始SD卡初始化和检测SD卡是否完成初始化
CMD9 0 R1 SEND_CSD 读取CSD寄存器的值
CMD10 0 R1 SEND_CID 读取CID寄存器的值
CMD12 0 R1b STOP_TRANSMISSION 停止读取操作
CMD16 数据块长度[31:0] R1 SET_BLOCKLEN 设置数据块长度(*4)
CMD17 地址[31:0] R1 READ_SINGLE_BLOCK 读取单个数据块
CMD18 地址[31:0] R1 READ_MULTIPLE_BLOCK 读取多个块数据
CMD24 地址[31:0] R1 WRITE_BLOCK 写单个块数据
CMD25 地址[31:0] R1 WRITE_MULTIPLE_BLOCK 写多个块数据
CMD55 0 R1 APP_CMD 定义下一条命令为ACMD<n>命令
CMD58 0 R3 READ_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时序图

[FatFs 学习] SD卡总结-SPI模式的更多相关文章

  1. SD卡的SPI模式的初始化顺序(转)

    为了使SD卡初始化进入SPI模式,我们需要使用的命令有3个:CMD0,ACMD41,CMD55(使用ACMD类的指令前应先发CMD55,CMD55起到一个切换到ACMD类命令的作用). 为什么在使用C ...

  2. MicroSD卡(TF卡)SPI模式实现方法

    现在我们手机的内存卡多为Micro SD卡,又叫TF卡,所以Micro SD卡比SD卡常见.自己曾经也想写写SD卡的读取程序,但又不想特地再去买个SD卡,这时想起手机内存卡不是和SD卡很像吗?在网上查 ...

  3. 用FATFS在SD卡里写一串数字

    用FATFS写SD卡,如写入数组 s[] ={1,2,3,4,5,6} 想要在txt中显示“123456” 就要把 s[0]=1+'0'    或 s[0]=1+48   或 s[0]=1+0x30  ...

  4. SD卡 模拟SPI总线控制流程

    SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...

  5. FATFS在SD卡里,写入多行数据出的问题

    串口接收的数据存入数组,然后把数组截取有效部分,存入SD卡里的一行没有问题 但是从SD卡读出这一行之后,重新写入SD卡就有了问题,经过调试发现,错误在于  \n 一直是这一串数据,为什么会出错呢??? ...

  6. [笔记]SD卡相关资料

    ESD静电放电模块 我知道的flash分为两种NOR flash和NAND flash,NOR falsh容量一般为1~16M用于单片机代码存储,NAND flash最小的是8M最大的现在听说有90G ...

  7. SD卡在单片机上的应用

    (1)SD卡的引脚定义:  SD卡SPI模式下与单片机的连接图: 注意:SPI模式时,这些信号需要在主机端用10~100K欧的电阻上拉.      SD卡支持两种总线方式:SD方式与SPI方式.    ...

  8. SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的 ...

  9. SD卡

    一.SD卡接口 SD 卡的接口可以支持两种操作模式:主机系统可以选择以上其中任一模式, SD 卡模式允许 4 线的高速数据传输. SPI 模式允许简单通用的 SPI 通道接口, 这种模式相对于 SD ...

随机推荐

  1. LuoguB2028 反向输出一个三位数 题解

    Content 给定一个三位数,请反向输出它. 数据范围:数值在 \(100\) 到 \(999\) 之间. Solution 如果我们把它当做是一个字符串来读入的话,这道题目就很简单了.STL 当中 ...

  2. Mysql中不能update自身的解决方法

    不能执行:update bi_data.order_all_detailset err_msg='同时存在于wx,zfb平台',proc_time=now()where order_no in( se ...

  3. 10分钟快速上车短视频风口:基于uniapp框架创建自己的仿抖音短视APP

    在今年也就是第48次发布的<中国互联网络发展状况统计报告>有这样一个数据,21年的上半年以来,我国我国网民规模达10.11亿,其中短视频用户达8.88亿.碎片化的生活场景下,短视频成为人们 ...

  4. xcode使用spdlog(1.7)总结

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 注意️ 请选择对c++11支持完善的编译器, 因为spdlog一直更新. 本文演示环境: m ...

  5. 【LeetCode】1007. Minimum Domino Rotations For Equal Row 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历一遍 日期 题目地址:https://leetc ...

  6. codeforces B. Island Puzzle

    B. Island Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. 震撼,java面试题整合(良心制作)11万多字拿去。持续更新【可以收藏】

    一.javaSE面试题整合 Java部分 JDK中哪些类是不能继承的?[信雅达面试题] [参考答案] 不能继承的是类是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的 ...

  8. 【JAVA今法修真】 第七章 洞天风云起,索引混乱平

    您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...

  9. Django项目部署到Apache服务器上

    之前写了把Django部署到XAMPP上,但是有bug,翻apache日志的时候发现会无法import _ssl,然后我就怒而直接装apache2了 配置方法大约和这篇文章差不多 安装必要的包 sud ...

  10. Electron 使用 Tray设置图标的路径问题

    问题报错信息如图 上面的代码在dev模式下不报错,但是在build后,安装后,运行会提示错误,错误信息的大意是参数错误,原因应该是安装后的图片文件路径有问题,这块没有详细研究解决上面的问题的方法,是使 ...