SD总线模式简介

一、SD 存储卡基本介绍

1、存储容量

capacity.png

2、电压范围
* 高电压SD存储卡,电压范围为:2.7 ~ 3.6 V

3、SD 存储卡可以用密码保护(CMD42 - LOCK_UNLOCK)
4、标准 SD 存储卡的厚度是 2.1mm 或者 1.4 mm
5、SD 存储卡传输速度分类

speed.png

大容量和超大容量 SD 存储卡至少应该为 class-2

6、SD 存储卡结构图
引脚说明如下图所示:

structure.png

引脚的差异:

pin.png
  1. 写入速度
  • AU:分配单元 ;RU:记录单元
AU/RU.png

注:向AU写入数据,已经被使用的RU需要跳过,used_RU的rate越高,速度越慢

diff std.png
  • RU被使用的比例与写入速度的关系:
    r=0 —— 记录单元均未使用,可连续写入;r=1 —— 单元均被使用,写入速度为0
speed_curve.png
  • 不同容量的SD卡对应 AU和RU的size
AU/RU of diff SD.png

8.总线速度

  • SDR一个周期采样一次,传输 1 bit数据,DDR上升沿 下降沿分别采样一次,传输 2 bit数据
  • 通过CMD11来完成电压切换,以进入不同的访问模式
  • ACMD41和CMD6中的limit func 来设置current
bus_speed.png

9.寄存器register

register.png
  • OCR 寄存器:OCR (操作条件)寄存器中存储了卡片的电压信息以及部分状态信息:其中一个状态位(bit 31)指示卡片的上电操作是否完成,另外一个状态位(bit 30)指示卡片的容量状态(0代表SDSC、1代表SDHC或者SDXC);
  • CID 寄存器:CID (识别信息)寄存器总共 128 bits,包含了卡片的识别信息,每个独立的卡片都应该有一组独一无二的识别信息;
  • CSD 寄存器:CSD(具体信息)寄存器也是 128 bits,提供了访问卡片内容的一些信息如:传输速率、数据格式、错误类型、最大是数据访问时间、DSR 寄存器是否启用的。其中 bit[126:127] 记录了 CSD 的版本号,CSD version 1.0 为标准容量卡所用,CSD version 2.0 为大容量或超大容量卡所用;
  • SCR 寄存器:SCR(SD 配置)寄存器总共 64 bits,定义了卡片的一些特殊功能;
  • CSR 寄存器:CSR(卡片状态)寄存器总共 32bits,代表了执行一个命令的错误和状态信息,其信息包含在 R1 格式的应答中返回给主机;
  • SD Status 寄存器:SD Status 寄存器包含了 SD 存储卡的的专有属性并为以后的功能扩展保留了足够的空间,其大小为 512bits 即一个块大小,这个寄存器作为ACMD13命令的执行结果,通过DATA线发送到主机;
    10.CMD简介
    CMD:在CMD线上传输,由主机host给到card
    常见CMD-----
    CMD0:重置所有sd卡状态至 idle state
    ACMD6:切换数据传输模式(1bit <>4bit)
    CMD11:切换电压
    CMD55:设置sd卡的地址为默认0x0000
    ACMD41:根据SD卡初始化
    CMD2:获取SD卡的ID
    CMD3: 返回新的相对地址给host
    CMD16: 定义块长度
    CMD17:读取单块数据
    CMD18:读取多块数据
    CMD24:写入单块数据
    CMD25:写入多块数据
    CMD12:终止读写操作
    CMD7:切换card , 将SD 卡的状态变为stand-by
    ACMD23-CMD23-CMD33-CMD38: 数据擦除
    CMD42:给SD卡加锁解锁
  1. response响应
    Response:应答是卡片发回数据的令牌,响应主机之前发送的命令。应答的编码格式如下图所示:每个令牌都有一个起始位和结束位,总长度为48 bits 或者136 bits,有相应的 CRC 校验码。应答信号也只在 CMD 线上传输,并且 MSB 为先,方向从card到host。
    • R1/R1b(48bit) 为通常命令的应答格式,如下图所示


      R1_res.png
    • R2 (136Bit) >> CID(CMD2,CMD10) & CSD (CMD9)
    • R3 (48Bit) >> OCR(ACMD41)
    • R6 (48Bit) >> RCA(CMD3)
    • R7 (48Bit) >> Card interface condition(CMD8)

12.其他注意事项

  • 若多个sd卡连在bus上,host会独立的与不同sd卡进行通信
  • 在CMD线上传输 command(host>card) 和 response(card>host) ;
  • 当wide bus的选项开启的时候,各条数据线同时传输; busy signaling 和 CRC status 只会在data0数据线上传输
  • SPI协议定义的是物理层连接,而不是完整的传输协议
  • 执行write操作,数据保护机制(寄存器CSD),SDHC不支持;
  • SD在执行read操作时,移除卡,不会损失数据;
  • 在data transfer 过程中,传输模式均为 点对点 (host to single card)
  • 当处于programming state,是无法进行read操作 和 参数设置,如:set block length (CMD16), erase block start (CMD32) erase block end (CMD33);
  • CMD0 | 15 能够终止programming 操作,可能会造成数据损坏
  • 写入时,采用预擦除策略(ACMD23)提前定义将要写入的块数,能够让写操作更快
  • 上锁解锁的CMD仅在 transfer state来进行
  • SD卡数据传输的单元大小是一个字节,所有的数据大小均为字节的整数倍:
  • 关于块大小等信息均存储在CSD中
  • Block :块面向数据读写的单元,大小是字节的倍数
  • AU是SD卡存储容量的边界
  • 可擦除块的大小是不同于读写块的大小
  • WP-Group:是写保护的最小单元{用于可擦除 的设备}
WP-group.png

二、SD 存储卡功能描述

SD 卡有两种操作模式:1、卡片识别模式,2、数据传输模式。所有的通信都是由主机控制的,即通过编址命令或者广播命令。卡片在两种模式之间的状态转换如下图所示:


mode.png

1、卡片识别模式

  • SD卡上电后,卡处于空闲状态
  • 主机发送CMD0复位SD卡,首先判断该card属于哪个版本的协议,然后通过CMD8判断当前电压是否在卡的工作范围内,若不支持该电压,不会给出返回值;
  • 默认是1bit bus,可通过ACMD6设置为4bit bus传输(不加锁时);
  • 确认后每隔1s发送一次ACMD41命令,来初始化卡片;
  • ACMD41参数中有HCS(容量)和voltage的判断条件,根据card和host是否支持1.8V的电压,可CMD11来切换其工作电压至1.8V(default 3.3V);
  • 主机可以继续通过CMD2读取SD卡的CID寄存器(确认容量信息,相对地址);
  • 通过CMD3让SD卡将相对地址发送给host,然后SD卡就进入等待状态;
  • Host通过CMD7可通过RCA地址的选择来释放当前连接而选择RCA对应的SD卡进入transfer state,当RCA地址为0x0000,释放所有连接均进入等待状态;
  • 从CSD寄存器中,主机可以获知卡容量,支持的命令集等重要参数;
  • SD卡以进入了传输状态,主机就可以通过CMD17/18和CMD24/25对卡进行读写


    flow.png
card identification mode.png
card identification and initial flow.png

2、数据传输模式

CMD7 用于选择一个卡片进入传输模式,在同一时间只能有一个卡片处于传输模式。如果当前卡片与主机处于数据传输模式的连接状态,新的 CMD7 命令中的RCA [bit16 - bit31] 不是当前卡片的,则会释放连接并且当前卡片进入等待状态,然后连接新 RCA 的卡片。如果主机发送 CMD7 时,RCA = 0x0000,则所有的卡片都进入等待状态。数据传输模式下的状态转换如下图所示:

a、所有读取数据的命令在任何时间都能被 CMD12 终止。读取数据的命令包括:CMD17(读取单块数据)、CMD18(读取多块数据)、CMD30(读取写保护状态位)、ACMD51(读取 CSR 寄存器)、ACMD56。
b、所有写入数据的命令在任何时间都能被 CMD12 终止。写入数据的命令包括:CMD24(写入单块数据)、CMD25(写入多块数据)、CMD27(设置 CSD 寄存器)、CMD42(加锁解锁)、ACMD56。、
c、一旦数据传输完成,卡片将会马上退出数据写状态并且切换到编程状态(数据传输成功就写入存储介质)或者传输状态(数据传输失败)。
d、如果写操作停止,块长度和最后一块的 CRC 校验码是有效的,数据将会被写入存储介质。
e、卡片支持写缓存,这就意味着当前块在进行编程操作时下一块也可以进行传输。如果写缓存满了,卡片还是处在编程状态,则卡片会将DATA0一直拉低(忙状态)。
f、设置 CSD 寄存器时不提供缓存,也就是如果正在进行 CSD 设置,任何的数据传输命令都将被拒绝执行,DATA0 也会被一直拉低。
g、当卡片处于编程状态时,读命令和参数设置命令将不被执行。参数设置命令包括:CMD16(设置块长度)、CMD32(设置擦除的起始块数)、CMD33(设置擦除的结束块数)。
h、CMD7 命令不会终止擦除和编程操作。
i、通过 CMD0 或者 CMD15 重置卡片时将会结束所有挂起或者正在进行的操作,这有可能会破坏卡片的数据,所以需要主机来保证安全。
j、CMD class10 的命令之间的状态转换由厂家自己定义。

data transfer.png

3、数据读写流程

在卡片上电以及执行 CMD0 后为 1bit bus,宽总线(4bit bus)模式可以通过 ACMD6 命令设置,在设置时卡片必须处理传输模式而且没有加锁。容量大于 2GB 的卡片最大块长度可能为 1024 字节,但是 CMD16 命令最大只支持 512 字节。

a.读取数据(CMD16设置数据块大小)

  • 当总线上没有数据传输时总线保持高电平;
  • CMD17命令将会读取一个块的数据,块地址在命令的参数中列出
  • CMD18命令将会连续的读取多块数据
  • CMD23 命令可以指定读取的块数。
    传输以低电平开始并以高电平结束,数据流包括有效数据和ECC值,
    CRC 校验码将会被加入到每块数据的末尾以确保传输的完整性;

b.写入数据(CMD16设置数据块大小)

  • 单块写入命令为 CMD24
  • ACMD23预擦除,多块写入命令为 CMD25。

c.擦除数据(CMD16设置数据块大小)

  • CMD32 命令指定擦除的开始块,
  • CMD33 命令指定擦除的结束块,
  • CMD38命令启动擦除,
    如果将要擦除的块是写保护的则跳过。
    在擦除过程中DATA0保持低电平。
    在写或者擦除的过程中可以通过CMD7命令去操作别的卡片

4、加锁解锁

SD 存储卡支持加锁功能,密码以及长度保存在 128bits 的 PWD 和 8bits 的 PWD_LEN 寄存器。被加锁的卡片可以响应 class0 、CMD16、ACMD41、LOCK CARD(class7)命令,但是不能访问数据。如果卡片被加锁,则 PWD_LEN不为 0,卡片在上电后就会进入锁定状态。加锁解锁的命令为CMD42,该命令的数据块格式如下图所示:

lock.png
  • ERASE:强制擦除操作,第 0 byte 的 bit3 需要置 1,并且其他位置 0。
  • LOCK_UNLOCK:1 = Lock the card,0 = Unlock the card。这个 bit 的操作需要和 SET_PWD 相同。
  • CLR_PWD:1 = 清除密码。
  • SET_PWD:1 = 设置新密码。
  • PWDS_LEN:定义了密码的长度(bytes),如果改变密码,则是新密码和旧密码的长度。
  • PWD:如果是新密码,则保存的是新密码。如果改变密码,则保存的是新密码和旧密码。
    应当在发送 CMD42 之前通过 CMD16 设置数据块长度,而且数据块长度应该不小于 CMD42 数据块的长度。

5.SD卡插拔

  • 向SD卡写入数据,clk和data的方向一致,可不考虑延迟;
  • 从SD卡读取数据,clk和data的方向相反,延迟较为严重,在Host上需要 时钟发生器
in/out.png

你可能感兴趣的:(SD总线模式简介)