https://www.cnblogs.com/mr-bike/p/3546228.html

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,表示指令内容的十进制值,对于没有参数的指令,参数为内容要用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命令

CMD58

0

R3

READ_OCR

读取OCR寄存器

*1 : [31:12]为0,[11:8]为VHS值,[7:0]Check

Pattern,可以为任意值,用于检测SD卡通信是否正确的。若该命令的返回值最后一字 节和Check pattern值相同,说明SPI通信成功。 *2 : 发送ACMD之前需要先发送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卡协议。

四、链接

android sd卡 spi,SD卡总结-SPI模式相关推荐

  1. SD卡学习(SDIO和SPI模式)

    SD卡学习(SDIO和SPI模式) ** SD卡的操作模式:SD卡模式(SDIO).SPI模式(默认为SD模式). 其中SD卡模式的信号线有:CLK.CMD.DAT0-DAT3,6根线. SPI模式的 ...

  2. Micro SD 卡(TF卡) spi 模式实现方法

    首先贴上一写SD卡SPI模式下的参考电路,以及一些比较不错的帖子的连接: 1:http://www.go-gddq.com/html/s733/2009-12/477854.htm 2:http:// ...

  3. STC15单片机读写大容量SD卡(IO口模拟SPI模式)

    使用的芯片是STC15系列的IAP15F2K61S2,开发板是51的xl2000.把芯片座上的51芯片拔掉换成STC的,混合模式.(配置够低吧) 源码由51开发板例程的实验26修改而来. 浏览了网上的 ...

  4. STM32F407 SPI SD卡驱动的验证

    试验原因 网上靠谱的STM32F4的SPI方式SD卡驱动不多. 包括ST官方板子,都不用SPI_SD的驱动方式,而是用SDIO. 如果没有官方资料加持,出问题时真头疼, 相当于一个人在玩. 自己板子上 ...

  5. SD nand 与 SD卡的SPI模式驱动

    文章目录 SD nand 与 SD卡的SPI模式驱动 1. 概述 2. SPI接口模式与SD接口模式区别 2.1 接口模式区别 2.2 硬件引脚 2.3 注意事项 3. SD接口协议 3.1 命令 3 ...

  6. SD nand与SD卡 SPI模式驱动

    SD nand 与 SD卡的SPI模式驱动 文章目录 SD nand 与 SD卡的SPI模式驱动 1. 概述 2. SPI接口模式与SD接口模式区别 2.1 接口模式区别 2.2 硬件引脚 2.3 注 ...

  7. STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

    前言 很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写. 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘.只能利用业余时间慢慢更新,也不知 ...

  8. Android模拟器环境下SD卡内容的管理[转]

    Android模拟器环境下SD卡内容的管理 2010-11-30 22:03 by ·风信子·, 2305 阅读, 0 评论, 收藏, 编辑 本文旨在介绍一些Android模拟器下如何对SD卡内容进行 ...

  9. Android数据存储之SD卡

    为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...

  10. android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?

    我使用名为scanlibrary的库来扫描照片,然后将它传递给tess-two来执行OCR过程.问题是,在目录"ScanDemoExample"不被创建因此tessdata文件不会 ...

最新文章

  1. [deviceone开发]-组件功能演示示例
  2. 输入法按照选字频率排序的C语言程序算法,算法与数据结构之选择排序(C语言)...
  3. php和python哪个用了开发web好-php web与python web哪个好
  4. Protocol Buffer搭建及示例
  5. 5月23日任务 LAMP架构介绍、MySQL、MariaDB介绍、 MySQL安装
  6. 2021年东港二中高考成绩查询,辽宁省东港二中2021届英语高考模拟试卷1(新课改原创2020版,供2021年课改省份考生使用)...
  7. java netty swap高_Netty 超时机制及心跳程序实现
  8. JavaScript中的String substring()方法和示例
  9. html5 ocr图片识别,OCR识别控件LEADTOOLS HTML5案例:整页OCR识别
  10. 为何现在好多饭店熬汤不用骨头也能熬出来浓白色的汤?
  11. 1076. Wifi密码 (15)-PAT乙级真题
  12. iPhone应用中APNS推送通知流程代码实现案例
  13. 【修订版】C#/ASP.Net 面试题及答案(1)
  14. 数字图像处理与分析_第一章
  15. 4月28日Java笔记109p
  16. 计算机文化(20版)答案
  17. 对学生创业的重新认识
  18. uniapp实现canvas制作微信小程序海报,线上图片
  19. 基于python+pyqt+深度学习实现图像转素描【附部分源码】
  20. MyBatis xml动态sql insert批量插入 报错Operand should contain 1 column(s)

热门文章

  1. Photoshop 快速选择工具抠图
  2. led显示屏属于计算机类吗,计算机显示IPS和LED屏幕的优缺点是什么?
  3. 【数学与统计基础】常用统计检验方法的Python实现
  4. 利用Tukey方法识别离群值
  5. 卸载office 2016 报错:错误1321
  6. android 4.0.3固件,OPPO Find3 android 4.0固件正式发布
  7. Word修改标题样式缩进不起作用原因
  8. uni-app创建并运行微信小程序项目
  9. Python调用图灵机器人
  10. Arduino UNO数据手册(新手入门)