SD卡-详细讲解

结构

  1. 控制器:位于SD卡的表面,是卡的心脏,负责管理数据传输、命令解析和错误校验等功能。
  2. 存储单元:存储单元是实际存储数据的地方,通常由NAND型闪存组成。
  3. 接口:SD卡有一个9针的接口,用于与主机设备通信,包括数据线、命令线和电源线。
  4. 金手指:SD卡的一端有金属接触点,用于与设备进行物理连接。
  5. 封装:封装用于保护内部电路,通常由塑料或其他材料制成,以防水、防尘和防震。

硬件连接模式

SD卡(Secure Digital Card)通常通过一个串行接口与主机设备进行通信。SD卡接口支持两种主要的通信模式:SD模式和SPI模式。

  1. SD模式:这是SD卡的标准通信模式,使用专门的SD卡协议。在这种模式下,数据传输使用的是4线串行接口,包括时钟线(CLK)、数据线(CMD和DAT0-DAT3)。SD模式支持更高的数据传输速率,并且可以进行多线操作,即在多个数据线上同时传输数据。

  2. SPI模式:这是一种兼容模式,允许SD卡通过SPI(Serial Peripheral Interface)接口与主机设备通信。SPI是一种常见的串行通信协议,用于与许多类型的串行设备进行通信。在SPI模式下,SD卡使用四线接口:时钟(SCK)、数据输出(MISO)、数据输入(MOSI)和片选(CS)。SPI模式的数据传输速率通常低于SD模式,但它提供了一种简单的方式来与不支持SD模式的主机设备进行通信。

SDIO

SPI

 

生命周期阶段

初次连接    -->    卡识别模式   -->   数据模式   -->   连接断开

  1. 初次连接:当SD卡首次插入到主机设备(如数码相机、手机、读卡器等)时,主机设备会检测到新的存储介质,并开始与SD卡进行通信。

  2. 卡识别模式:主机设备通过发送特定的命令来初始化与SD卡的通信,并获取SD卡的信息,如制造商信息、存储容量、速度等级等。这个过程包括对SD卡的CID和CSD寄存器进行读取,以及可能的SCR寄存器读取(用于获取SD卡支持的SD规范和操作特性)。

  3. 数据模式:一旦卡识别模式完成,SD卡就会进入数据模式。在这个模式下,主机设备可以进行实际的数据读写操作,包括文件的存储、检索和删除等。

  4. 连接断开:当用户从主机设备中移除SD卡时,连接会断开。在断开连接之前,主机设备通常会执行一些清理操作,以确保数据的安全写入和卡的妥善关闭。

包结构概述

  1. 命令包(Command Packet)

    • 起始位(Start Bit):一个位,标志命令包的开始。
    • 传输方向位(Transmission Bit):一个位,指示命令包的方向,0表示主机到卡,1表示卡到主机(用于响应)。
    • Command Index(CMD IDX):6位,命令索引,指示具体的命令。
    • Argument(ARG):32位,命令参数,提供执行命令所需的额外信息。
    • CRC(CRC):7位,循环冗余校验码,用于检测命令包在传输过程中是否出现错误。
    • 停止位(Stop Bit):一个位,标志命令包的结束。
    • [起始位(0)][传输方向位(0)][命令索引(6位)][参数(32位)][CRC(7位)][停止位(1)]
  2. 响应包(Response Packet)

    • 起始位(Start Bit):一个位,标志响应包的开始。
    • 传输方向位(Transmission Bit):一个位,指示响应包的方向,1表示卡到主机。
    • 响应数据(Response Data):48位(对于R2类型响应)或32位(对于R3/R4类型响应),或者更少(对于R1/R5/R6/R7类型响应),具体取决于响应的类型。
    • 停止位(Stop Bit):一个位,标志响应包的结束。
    • [起始位(0)][传输方向位(1)][响应数据(32位或48位)][停止位(1)]
    • 注意:响应通常不包含CRC,但有些特定的响应类型可能会包含CRC。
  3. 数据包(Data Packet)

    • 起始位(Start Bit):一个位,标志数据包的开始。
    • 数据块(Data Block):一定长度的数据,通常是512字节,但也可以是其他大小,取决于卡的配置和传输模式。
    • CRC(CRC):16位,循环冗余校验码,用于检测数据块在传输过程中是否出现错误。
    • 停止位(Stop Bit):一个位,标志数据包的结束。
    • [起始位(0)][传输方向位(1)][数据位(512字节)][CRC(16位)][停止位(1)]

数据包的格式

  1. 常规数据包格式(Standard Data Packet Format)

    • 这种格式通常用于标准的SD卡操作,数据以8位宽度传输。每个数据包包含一个起始位、一个传输方向位、数据位、一个16位的CRC校验码和一个停止位。这种格式适用于大多数SD卡操作,包括单块和多块数据传输。

        

它先发低字节再发高字节,而每个字节则是先发高位再发低位,4线传输示意如 

图 35‑6 8位宽数据包传输

图 35‑6 8位宽数据包传输

4线同步发送,每根线发送一个字节的其中两个位,数据位在四线顺序排列发送,DAT3数据线发较高位,DAT0数据线发较低位。

        

  1. 宽位数据包格式(Wide Bus Data Packet Format)

    • 这种格式用于SDHC(Secure Digital High Capacity)和SDXC(Secure Digital Extended Capacity)卡,以及在某些高速模式下。它允许数据以更宽的宽度(4位或8位)传输,从而提高数据传输速率。宽位数据包格式同样包含起始位、传输方向位、数据位、CRC校验码和停止位,但是数据位的宽度更大,因此可以在单个时钟周期内传输更多的数据。

对SD卡而言宽位数据包发送方式是针对SD卡SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512bit,在 主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发送给主机。宽位数据包格式示意见 图35_7

图 35‑7 宽位数据包传输

图 35‑7 宽位数据包传输

指令1

主-->卡

命令序号

类型

参数

响应

缩写

描述

基本命令(Class

CMD0

bc

[31:0]填充位

GO_IDLE_STATE

复位所有的卡到idle状态。

CMD2

bcr

[31:0]填充位

R2

ALL_SEND_CID

通知所有卡通过CMD线返回CID值。

CMD3

bcr

[31:0]填充位

R6

SEND_RELATIVE_ADDR

通知所有卡发布新RCA。

CMD4

bc

[31:16]DSR[15:0]填充位

SET_DSR

编程所有卡的DSR。

CMD7

ac

[31:16]RCA[15:0]填充位

R1b

SELECT/DESELECT_CARD

选择/取消选择RCA地址卡。

CMD8

bcr

[31:12]保留位[11:8]VHS[7:0]检查模式

R7

SEND_IF_COND

发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。

CMD9

ac

[31:16]RCA[15:0]填充位

R2

SEND_CSD

选定卡通过CMD线发送CSD内容

CMD10

ac

[31:16]RCA[15:0]填充位

R2

SEND_CID

选定卡通过CMD线发送CID内容

CMD12

ac

[31:0]填充位

R1b

STOP_TRANSMISSION

强制卡停止传输

CMD13

ac

[31:16]RCA[15:0]填充位

R1

SEND_STATUS

选定卡通过CMD线发送它状态寄存器

CMD15

ac

[31:16]RCA[15:0]填充位

GO_INACTIVE_STATE

使选定卡进入“inactive”状态

面向块的读操作(Class

CMD16

ac

[31:0]块长度

R1

SET_BLOCK_LEN

对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。

CMD17

adtc

[31:0]数据地址

R1

READ_SINGLE_BLOCK

对于标准卡,读取SEL_BLOCK_LEN长度字节的块;对于SDHC卡,读取512字节的块。

CMD18

adtc

[31:0]数据地址

R1

READ_MULTIPLE_BLOCK

连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。

面向块的写操作(Class

CMD24

adtc

[31:0]数据地址

R1

WRITE_BLOCK

对于标准卡,写入SEL_BLOCK_LEN长度字节的块;对于SDHC卡,写入512字节的块。

CMD25

adtc

[31:0]数据地址

R1

WRITE_MILTIPLE_BLOCK

连续向SD卡写入数据块,直到被CMD12中断。每块长度同CMD17。

CMD27

adtc

[31:0]填充位

R1

PROGRAM_CSD

对CSD的可编程位进行编程

擦除命令(Class

CMD32

ac

[31:0]数据地址

R1

ERASE_WR_BLK_START

设置擦除的起始块地址

CMD33

ac

[31:0]数据地址

R1

ERASE_WR_BLK_END

设置擦除的结束块地址

CMD38

ac

[31:0]填充位

R1b

ERASE

擦除预先选定的块

加锁命令(Class

CMD42

adtc

[31:0]保留

R1

LOCK_UNLOCK

加锁/解锁SD卡

特定应用命令(Class

CMD55

ac

[31:16]RCA[15:0]填充位

R1

APP_CMD

指定下个命令为特定应用命令,不是标准命令

CMD56

adtc

[31:1]填充位[0]读/写

R1

GEN_CMD

通用命令,或者特定应用命令中,用于传输一个数据块,最低位为1表示读数据,为0表示写数据

SD卡特定应用命令

ACMD6

ac

[31:2]填充位[1:0]总线宽度

R1

SET_BUS_WIDTH

定义数据总线宽度(‘00’=1bit,’10’=4bit)。

ACMD13

adtc

[31:0]填充位

R1

SD_STATUS

发送SD状态

ACMD41

Bcr

[32]保留位[30]HCS(OCR[30])

[29:24]保留位[23:0]VDD电压(OCR[23:0])

R3

SD_SEND_OP_COND

主机要求卡发送它的支持信息(HCS)和OCR寄存器内容。

ACMD51

adtc

[31:0]填充位

R1

SEND_SCR

读取配置寄存器SCR

 

CMD后面的数字就是指令的值

  1. CMD0 (GO_IDLE_STATE): 使SD卡进入空闲状态。
  2. CMD1 (SEND_OP_COND): 查询或设置SD卡的供电电压和操作条件。
  3. CMD2 (ALL_SEND_CID): 读取SD卡的CID(卡识别数据)。
  4. CMD3 (SEND_RELATIVE_ADDR): 发送相对地址(RCA)。
  5. CMD4 (SET_RELATIVE_ADDR): 设置相对地址。
  6. CMD5 (SEND_IF_COND): 发送接口条件。
  7. CMD6 (SWITCH_FUNC): 切换功能。
  8. CMD7 (SELECT_CARD): 选择卡。
  9. CMD8 (SEND_IF_RCA): 发送RCA(相对卡地址)。
  10. CMD9 (SEND_CSD): 读取CSD(卡特定数据)。
  11. CMD10 (SEND_CID): 再次读取CID。
  12. CMD11 (SEND_STATUS): 读取状态。
  13. CMD12 (CRC_ON_OFF): 启用或禁用CRC。
  14. CMD13 (SEND_NUM_WRITE_BLOCKS): 发送写块的数量。
  15. CMD14 (SET_WRITE_BLK_ERASE_COUNT): 设置写块/擦除计数。
  16. CMD15 (READ_SINGLE_BLOCK): 读取单块数据。
  17. CMD16 (READ_MULTIPLE_BLOCK): 读取多块数据。
  18. CMD17 (WRITE_SINGLE_BLOCK): 写入单块数据。
  19. CMD18 (WRITE_MULTIPLE_BLOCK): 写入多块数据。
  20. CMD19 (PROGRAM_CSD): 编程CSD。
  21. CMD20 (SET_BLOCKLEN): 设置块长度。
  22. CMD21 (READ_OCR): 读取OCR(操作条件寄存器)。
  23. CMD22 (CRC_ON_OFF): 启用或禁用CRC。
  24. CMD23 (SEND_SCR): 发送SCR(SD卡规范寄存器)。
  25. CMD24 (SEND_EXT_CSD): 发送扩展CSD(对于SDHC和SDXC卡)。
  26. CMD25 (SEND_CID): 再次读取CID。
  27. CMD26 (SEND_STATUS): 再次读取状态。
  28. CMD27 (SEND_NUM_WRITE_BLOCKS): 再次发送写块的数量。
  29. CMD28 (SET_WRITE_BLK_ERASE_COUNT): 再次设置写块/擦除计数。
  30. CMD29 (READ_SINGLE_BLOCK): 再次读取单块数据。
  31. CMD30 (READ_MULTIPLE_BLOCK): 再次读取多块数据。
  32. CMD31 (WRITE_SINGLE_BLOCK): 再次写入单块数据。
  33. CMD32 (WRITE_MULTIPLE_BLOCK): 再次写入多块数据。
  34. CMD33 (PROGRAM_CSD): 再次编程CSD。
  35. CMD34 (SET_BLOCKLEN): 再次设置块长度。
  36. CMD35 (READ_OCR): 再次读取OCR。 3

实例

命令包(主机设备发送)

[起始位(0)][传输方向位(0)][CMD2(000001)][参数(0)][CRC(7位)][停止位(1)]

响应包(SD卡发送)

[起始位(0)][传输方向位(1)][CID数据(512字节)][CRC(16位)][停止位(1)]

 

响应指令

卡-->主机

  1. R1响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 剩余的29位是状态位,用于表示SD卡的状态。
    • 最后一个字节(8位)是CRC校验码,用于验证响应数据的完整性。
  2. R2响应

    • 返回一个48位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的32位是状态位。
    • 最后的16位是CRC校验码。
  3. R3响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的31位是状态位。
    • 最后的1位是CRC校验码。
  4. R4响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的31位是状态位。
    • 最后的1位是CRC校验码。
  5. R5响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的31位是状态位。
    • 最后的1位是CRC校验码。
  6. R6响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的31位是状态位。
    • 最后的1位是CRC校验码。
  7. R7响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的31位是状态位。
    • 最后的1位是CRC校验码。
  8. R1b响应

    • 返回一个32位的二进制数。
    • 第一个字节(8位)是响应类型,其中0x00表示正常响应,0x01表示错误响应。
    • 接下来的29位是状态位。
    • 最后的3位是CRC校验码。

状态位

  • 0x00000001:表示命令被拒绝(Command Rejected)。
  • 0x00000002:表示命令序列错误(Command Sequence Error)。
  • 0x00000004:表示命令参数错误(Command Parameter Error)。
  • 0x00000008:表示命令错误(Command Error)。
  • 0x00000010:表示命令完成(Command Complete)。
  • 0x00000020:表示数据传输开始(Data Transfer Start)。
  • 0x00000040:表示数据传输结束(Data Transfer End)。
  • 0x00000080:表示数据传输异常(Data Transfer Aborted)。
  • 0x00000100:表示数据传输结束(Data Transfer End)。
  • 0x00000200:表示数据传输异常(Data Transfer Aborted)。
  • 0x00000400:表示数据传输结束(Data Transfer End)。
  • 0x00000800:表示数据传输异常(Data Transfer Aborted)。
  • 0x00001000:表示数据传输结束(Data Transfer End)。
  • 0x00002000:表示数据传输异常(Data Transfer Aborted)。
  • 0x00004000:表示数据传输结束(Data Transfer End)。
  • 0x00008000:表示数据传输异常(Data Transfer Aborted)。
  • 0x00010000:表示数据传输结束(Data Transfer End)。
  • 0x00020000:表示数据传输异常(Data Transfer Aborted)。
  • 0x00040000:表示数据传输结束(Data Transfer End)。
  • 0x00080000:表示数据传输异常(Data Transfer Aborted)。
  • 0x00100000:表示数据传输结束(Data Transfer End)。
  • 0x00200000:表示数据传输异常(Data Transfer Aborted)。
  • 0x00400000:表示数据传输结束(Data Transfer End)。
  • 0x00800000:表示数据传输异常(Data Transfer Aborted)。
  • 0x01000000:表示数据传输结束(Data Transfer End)。
  • 0x02000000:表示数据传输异常(Data Transfer Aborted)。
  • 0x04000000:表示数据传输结束(Data Transfer End)。
  • 0x08000000:表示数据传输异常(Data Transfer Aborted)。
  • 0x10000000:表示数据传输结束(Data Transfer End)。
  • 0x20000000:表示数据传输异常(Data Transfer Aborted)。
  • 0x40000000:表示数据传输结束(Data Transfer End)。
  • 0x80000000:表示数据传输异常(Data Transfer Aborted)。

结构

[起始位(0)][传输方向位(1)][响应类型(2位)][状态位(32位或29位)][CRC(16位或8位)][停止位(1)]
  • 起始位(Start Bit):一个位,总是为0,表示响应的开始。
  • 传输方向位(Transmission Bit):一个位,对于响应总是1,表示响应是从卡到主机的。
  • 响应类型(Response Type):两个位,其中00表示正常响应,01表示错误响应,10表示扩展响应,11保留。
  • 状态位(Status Bits):接下来的32位或29位,包含执行命令后的状态信息。
  • CRC(Cyclic Redundancy Check):接下来的16位或8位,是CRC校验码,用于验证响应数据的完整性。
  • 停止位(Stop Bit):一个位,总是为1,表示响应的结束。

默认时钟

SD卡和模式的默认时钟频率的一般指南:

  1. 标准SD卡

    • 默认时钟频率通常为100 kHz(千赫兹)。
  2. SDHC卡

    • 默认时钟频率通常为25 MHz(兆赫兹)。
  3. SDXC卡

    • 默认时钟频率通常为50 MHz。
  4. UHS-I卡

    • 默认时钟频率通常为100 MHz。
  5. UHS-II卡

    • 默认时钟频率通常为300 MHz。

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在FPGA的设计开发中,使用SD卡作为外部存储设备是很常见的。SD卡是一种方便、经济且实用的选择,特别适用于那些需要存储大量数据的系统。SD卡有不同的存储容量级别,包括SD卡、SDHC卡(高容量安全数字卡)和SDXC卡(容量扩大化的安全存储卡)\[2\]。SD卡具有体积小、传输速度快、支持热插拨等特点,它是在MMC(多媒体卡)的基础上发展而来,增加了更高的安全性和更快的读写速度\[3\]。在FPGA中使用SD卡,可以通过相应的协议规范和命令来进行存储操作\[1\]\[3\]。 #### 引用[.reference_title] - *1* [提高面试技能——FPGA中SD卡的应用](https://blog.csdn.net/2301_78484069/article/details/131588195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [学习笔记——基于FPGA的SD卡学习(1)](https://blog.csdn.net/qq_43489868/article/details/125659658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SD卡相关应用](https://blog.csdn.net/gemengxia/article/details/115492703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值