SD卡学习笔记

每个sector为512B,与IDE磁盘一样。通过读写命令读取一个多个sector。主控程序不需要关注SD具体是怎么实现读写与擦写的。

每个sector可以耐受100,000次写操作,无限次读操作。

每当sector被用命令erase命令擦除了,那么写操作将会更快。

1 功能概述

1.1 SD模式

1.1.1 Card ID

    CID是用于存放SD卡识别码的寄存器。在SD出厂之前,CID都被写入了唯一的值。

    通过READ_CID命令读取,只能读取,不能修改。

1.1.2 状态

    Card_Status存放在一个32位的状态寄存器中,作为卡中的一个数据域,返给主机。
    用SEND_STATUS命令读取。

    SD_Status存放在512位的数据块中,当收到主机的SD_STATUS(ACMD13)命令时发出。SD_STATUS包括扩展的与BUS_WIDTH相关的状态位。

1.1.3 存储分区

    SD卡存储的基本单元是BYTE,所有的数据操作都是通过BLOCK为单元进行。

        <1> BLOCK, 块。读写操作的最基本单元。块大小可以设置或固定。关于一块大小的数据存放在CSD寄存器中。
        <2> SECTOR,扇区。擦除操作的基本单元。扇区的大小是固定的。CSD中有相应说明。
        <3> WP Group,写保护组。它指可以用一位保护的组。大小在每都设备中都是固定的。CSD中有说明。

1.1.4 读写操作

    两种模式:单块,多块。

1.1.5 传送速率

    单线(DATA0):25Mbit/s
    四线(DATA0~3):100Mbit/s(12MB)

1.1.6 数据除错

    ECC,Error Correction Code。在数据写入时就会为每个扇区计算一个ECC。在读该扇区数据时,如果出现错误SD会在传给主机前纠正数据。

1.1.7 擦除

    sector是擦除的最小单元,一次性擦除多个扇所需的时间相同。第一个命令是擦除的start address,紧跟着是擦除的end address,那么这个区间的所有扇区都将会被擦除。

1.1.8 写保护

   

1.1.9 Copy bit

    在CSD寄存器的copy bit用于标志SD卡中,哪些内容是原始的,哪些是复制的。
    一旦某位被置1,那么不能清0了。
 

1.1.10 CSD寄存器

    SD卡中的所有配置信息都存储在CSD卡中。
    主机可以通过SEND_CSD命令读取CSD寄存器的值,也可以通过PROGRAM_CSD命令修改。
 

1.2 SPI 模式

1.2.1 工作条件

    OCR是operating condition寄存器。指定了SD卡在哪些状态下可以正常工作,哪些状态下进入非激活状态。

    READ_OCR(CMD58)命令。可以发送GO_INACTIVE命令进入非激活状态。

1.2.2 状态

    只有16位从32位的状态寄存器读出。该寄存器可以通过ACMD13读取。


2 接口特性

2.1 寄存器

 

寄存器列表
寄存器名 位长 说明
CID 128 SD卡唯一的识别码
RCA 16 相对地址(SPI不可见)
CSD 128 卡功能数据
SCR 64 SD卡配置寄存器
OCR 32 操作条件

 

     默认下,上电SD卡自动进入空闲状态。主机也可以发送GO_IDLE(CMD0)重位SD卡。

 

2.1.1 OCR

    指定SD卡的工作电压范围。(CMD1)

2.1.2 CID

    CID寄存器长16B,包含了唯一的卡识别码。其中的值在出产时已固定,不能被修改。
    注:SD卡与MMC卡的结构有所不同。

2.1.3 CSD

    CSD包含配置信息。
    注:SD卡与MMC卡的结构有所不同。

2.1.4 SCR

    SCR是CSD的扩展。也包含了部分配置信息。

2.1.5 状态寄存器

    SD卡支持两种卡状态域:

        <1> Card Status----(32bit)兼容MMC(MultiMediaCard)卡。
        <2> SD_Status----(512bit),在传给主机时附带CRC16。当SD卡收到ACMD13(CMD55+CMD13)命令后会发送该寄存器的值。


2.2 电气特性

2.2.1 上电

    上电或热插拔后,SD卡自动进入IDLE状态。在接收到ACMD41(ACMD类型命令发送之前要发送CMD55命令)之前,SD卡忽略所有指令。
    ACMD41是一种特殊的同步命令,用于判断是否在电压范围。如果不在操作电压范围,ACMD41的应答中包含busy位,以示SD卡还未准备好。主机必须等待busy位清0了才能进行下一步操作。busy位的等待时间不会超出1秒。

    在启动后,主机要在CMD线上发送初始化序列。不要超过1ms,74个时钟;再加上10同步时钟。

    主机都能够通过执行CMD1与ACMD41。CMD1用于询问MMC(MultiMediaCards)的操作条件。

 

3 总线协议

3.1 SD总线

    (略)

3.2 SPI总线

    与SD总线协议不同,SPI总线是以字节为单位进行通信,不需要起始位与结束位。

    主机数据传递都是通过CS位低开始。

    与SD总线不同之处有三:

        <1> 被选择(CS被拉低)的卡响应请求。
        <2> 使用8位或16位数据格式。
        <3> 当通信出错,SD卡会应答error,而不是像SD卡那样等待超时。

    在卡正在执行写操作时,向卡发送每一个数据块都会返回特定的响应标志。

3.2.1 模式选择

    SD卡唤醒后进入SD总线模式。如果CS信号线在应答命令CMD0时被拉低,那么就进入SPI模式。

    只有重新上电才能恢复SD总线模式。在SPI模式下,SD卡协议机制不可见。支持SPI模式的SD卡命令均可用。

    CRC校验默认在SPI模式下为关闭。

    CMD0是一个静态命令,CRC值为0x4A不变。CMD0命令完整的序列为:40 00 00 00 00 95

3.2.2 总线数据传递保护

    SPI接口默认下是无保护传输模式。主机可以通过CRC_ON_OFF(CMD59)命令打开或关闭此项。

 

3.3 协议功能

     本节主要描述SD卡的各个命令的功能与操作方法。

    SD卡发送两类命令:广播命令、点对点命令。

    SD卡有两种操作模式:卡识别模式、数据传输模式。

      <1> 卡识别模式,从卡复位到接收到SEND_RCA(CMD3),卡处于该模式。

      <2> 一旦卡的RCA确定了,就进入数据传输模式。

3.3.1 卡识别模式

    主机通过SD卡的CMD线发送(CMD3)命令告诉SD卡RCA(相对卡地址)。

3.3.1.1 复位

    复位,不论当前是什么状态,收到CMD0时,都会进入空闲状态。
    在上电后,在进行通信之前,CLK要给至少74个时钟,MOSI为高。

3.3.1.2 操作电压范围

    主机发送SEND_OP_COND(ACMD41)可以让SD卡发送OCR。由于ACMD41是应用命令,故在之前一定要发送CMD55。

    MMC不响应ACMD41,主要原因是MMC不识别CMD55。MMC中CMD1的功能与ACMD1等效。

    实际运用中,可以使用ACMD41与CMD1来区别当前卡是SD卡还是MMC卡。

    ACMD41应答中的busy位用于告诉主机当前还不能进行数据通信。因此,主机要重复发送ACMD41,直到busy位为0为止。

    GO_INACTIVE_STATE (CMD15) 可以将向已标记地址的卡转入非激活态。这个命令用于解除一张卡。

3.3.1.3 卡识别过程

    在总线被激活后,主机发送ACMD41(CMD55+CMD41)。
    主机发送CMD2获取每张卡的CID。SD卡进入卡识别状态。
    主机发送CMD3让SD卡公布新的相对地址RCA。相对地址比CID短,再在今后的通信中都会使用到。SD卡进入空闲状态。从此之后,如果主机要求更换SD卡的RCA,则再次发送CMD3即可。RCA以最后一次有准。

    MMC是用CMD2与CMD3实现上述过程。

3.3.2 数据传输模式

     主机发送CMD9获取CSD中的数据。

    CMD7用于在空闲状态传输状态下切换。当CMD7的RCA为0x0000时,所有的卡切换成空闲状态。

    <> 读操作。
         所有的读命令都可以通过CMD12取消。
         CMD17读单一块,CMD18读多块。写保护CMD30。ACMD51,CMD56。

    <> 写操作
          所有的写命令都可以通过CMD12取消。写命令以CMD7终止。
          块写(CMD24,CMD25),锁与解锁(CMD42),CMD56。
        

     (详见《SD卡说明》P61)

3.3.2.1 读格式

    读一块的大小定义在CSD (READ_BL_LEN)中。读出的数据块后都会跟一个CRC校验码。
    CMD17启动单块读操作,读完后自动回到传递状态。CMD18启动多块读操作,SD卡连续发送数据,直至收到停止命令。

3.3.2.2 写格式

     (CMD24—27,42,56(w))开启单个或多个块的写操作。主机向SD卡发送的数据都必须跟CRC校验码。SD卡允许的最小写单位为512B。
    在需要连续写入多块数据时,建议使用多块写入命令。对于小于512B的块写入是不允许的。

    当主机尝试向已保护的区域写数据时,SD卡不执行该操作,在状态寄存器上值WP_VIOLATION位,并忽略后面的操作。

3.3.2.3 预擦操作

    在执行多块写操作之前执行了预擦命令(ACMD23),告诉卡将要写入的块数。这样会让写速度更快。
    主机通过该命令告知SD卡,接下来将会写入多少块数据。如果主机在写操作实际没有写那么多块,那么剩下的块数据是不确定的。如果实际写入的大于预定的,那么卡将一块一块地擦除。

    建议使用CMD25命令,让多块写操作更快。

3.3.2.4 擦除

    (详见P64)

3.3.2.5 应用功能命令

(1)APP_CMD(CMD55)

    该命令会告诉卡,下一条命令是ACMD。

    在APP_CMD命令发送之后立即发送ACMD会导致APP_CMD命令被覆盖。应该等卡响应后方可。
    <1> 发送APP_CMD。应答中APP_CMD位置位,表示卡已准备好。
    <2> 发送ACMD。应答中APP_CMD位置位,否则该位清0。

    如果是非合法命令(不是ACMD也不是CMD),则卡会当作错误命令处理。

(2)GEN_CMD(CMD56)

    类似块读写命令(CMD24与CMD17)。

 

3.3.2.6 命令类型

    命令有以下四种类型:

    * 广播(bc)
    * 广播需要应答(bcr)
    * 点对点命令(ac)
    * 点对点数据传输命令(actr)

3.3.2.7 命令功能详解

    (详见《SD卡手册》P72)

序列 类型 参数 应答 缩写 功能
CMD0 bc ---- ---- GO_IDLE_STATE 复位卡到空闲状态
CMD2 bcr ---- R2 ALL_SEND_CID  
CMD3 bcr ---- R6 SEND_RELATIVE_ ADDR  
CMD9 ac [31:16] RCA R2 SEND_CSD  
CMD10 ac [31:16] RCA R2 SEND_CID  
CMD11 adtc [31:0] data address R1 READ_DAT_UNTIL_ STOP  
CMD12 ac ---- R1b STOP_ TRANSMISSION  
CMD13 ac [31:16] RCA R1 SEND_STATUS  
CMD15 ac [31:16] RCA -- GO_INACTIVE_ STATE  

读块

序列 类型 参数 应答 缩写 功能
CMD16 ac [31:0] block length R1 SET_BLOCKLEN  
CMD17 adtc [31:0] data address R1 READ_SINGLE_ BLOCK  
CMD18 adtc [31:0] data address R1 READ_MULTIPLE_BLOCK  

写块

序列 类型 参数 应答 缩写 功能
CMD24 adtc [31:0] data address R1 WRITE_BLOCK  
CMD25 adtc [31:0] data address R1 WRITE_MULTIPLE_ BLOCK  

 写保护

    CMD28,CMD29,CMD30

擦除

    CMD32,CMD33,CMD38

应用功能命令(CMD55+)

    以下不一一举列,

 

3.3.3 应答

 

学习总结

(标题5)

1. SD卡是怎么识别SD总线与SPI总线模式的?

    SD卡的CMD/MISO引脚在SD总线模式扮演CMD线,在SPI模式是MISO线。无论是什么模式,该脚都能接收数据。
    在SD卡上电后,SD卡并不知道自己处于什么通信模式。这并不防碍CMD/MISO脚输入数据。主机通过该脚发送CMD0命令。
    如果SD卡在应答CMD0命令时,CS引脚为低电平,则认为当前的通信模式为SPI总线模式。

 

你可能感兴趣的:(SD卡学习笔记)