每个sector为512B,与IDE磁盘一样。通过读写命令读取一个多个sector。主控程序不需要关注SD具体是怎么实现读写与擦写的。
每个sector可以耐受100,000次写操作,无限次读操作。
每当sector被用命令erase命令擦除了,那么写操作将会更快。
CID是用于存放SD卡识别码的寄存器。在SD出厂之前,CID都被写入了唯一的值。
通过READ_CID命令读取,只能读取,不能修改。
<1> BLOCK, 块。读写操作的最基本单元。块大小可以设置或固定。关于一块大小的数据存放在CSD寄存器中。
<2> SECTOR,扇区。擦除操作的基本单元。扇区的大小是固定的。CSD中有相应说明。
<3> WP Group,写保护组。它指可以用一位保护的组。大小在每都设备中都是固定的。CSD中有说明。
OCR是operating condition寄存器。指定了SD卡在哪些状态下可以正常工作,哪些状态下进入非激活状态。
READ_OCR(CMD58)命令。可以发送GO_INACTIVE命令进入非激活状态。
只有16位从32位的状态寄存器读出。该寄存器可以通过ACMD13读取。
寄存器名 | 位长 | 说明 |
CID | 128 | SD卡唯一的识别码 |
RCA | 16 | 相对地址(SPI不可见) |
CSD | 128 | 卡功能数据 |
SCR | 64 | SD卡配置寄存器 |
OCR | 32 | 操作条件 |
默认下,上电SD卡自动进入空闲状态。主机也可以发送GO_IDLE(CMD0)重位SD卡。
指定SD卡的工作电压范围。(CMD1)
CID寄存器长16B,包含了唯一的卡识别码。其中的值在出产时已固定,不能被修改。
注:SD卡与MMC卡的结构有所不同。
CSD包含配置信息。
注:SD卡与MMC卡的结构有所不同。
SCR是CSD的扩展。也包含了部分配置信息。
SD卡支持两种卡状态域:
<1> Card Status----(32bit)兼容MMC(MultiMediaCard)卡。
<2> SD_Status----(512bit),在传给主机时附带CRC16。当SD卡收到ACMD13(CMD55+CMD13)命令后会发送该寄存器的值。
上电或热插拔后,SD卡自动进入IDLE状态。在接收到ACMD41(ACMD类型命令发送之前要发送CMD55命令)之前,SD卡忽略所有指令。
ACMD41是一种特殊的同步命令,用于判断是否在电压范围。如果不在操作电压范围,ACMD41的应答中包含busy位,以示SD卡还未准备好。主机必须等待busy位清0了才能进行下一步操作。busy位的等待时间不会超出1秒。
在启动后,主机要在CMD线上发送初始化序列。不要超过1ms,74个时钟;再加上10同步时钟。
主机都能够通过执行CMD1与ACMD41。CMD1用于询问MMC(MultiMediaCards)的操作条件。
(略)
与SD总线协议不同,SPI总线是以字节为单位进行通信,不需要起始位与结束位。
主机数据传递都是通过CS位低开始。
与SD总线不同之处有三:
<1> 被选择(CS被拉低)的卡响应请求。
<2> 使用8位或16位数据格式。
<3> 当通信出错,SD卡会应答error,而不是像SD卡那样等待超时。
在卡正在执行写操作时,向卡发送每一个数据块都会返回特定的响应标志。
SD卡唤醒后进入SD总线模式。如果CS信号线在应答命令CMD0时被拉低,那么就进入SPI模式。
只有重新上电才能恢复SD总线模式。在SPI模式下,SD卡协议机制不可见。支持SPI模式的SD卡命令均可用。
CRC校验默认在SPI模式下为关闭。
CMD0是一个静态命令,CRC值为0x4A不变。CMD0命令完整的序列为:40 00 00 00 00 95
SPI接口默认下是无保护传输模式。主机可以通过CRC_ON_OFF(CMD59)命令打开或关闭此项。
本节主要描述SD卡的各个命令的功能与操作方法。
SD卡发送两类命令:广播命令、点对点命令。
SD卡有两种操作模式:卡识别模式、数据传输模式。
<1> 卡识别模式,从卡复位到接收到SEND_RCA(CMD3),卡处于该模式。
<2> 一旦卡的RCA确定了,就进入数据传输模式。
主机通过SD卡的CMD线发送(CMD3)命令告诉SD卡RCA(相对卡地址)。
复位,不论当前是什么状态,收到CMD0时,都会进入空闲状态。
在上电后,在进行通信之前,CLK要给至少74个时钟,MOSI为高。
主机发送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) 可以将向已标记地址的卡转入非激活态。这个命令用于解除一张卡。
在总线被激活后,主机发送ACMD41(CMD55+CMD41)。
主机发送CMD2获取每张卡的CID。SD卡进入卡识别状态。
主机发送CMD3让SD卡公布新的相对地址RCA。相对地址比CID短,再在今后的通信中都会使用到。SD卡进入空闲状态。从此之后,如果主机要求更换SD卡的RCA,则再次发送CMD3即可。RCA以最后一次有准。
MMC是用CMD2与CMD3实现上述过程。
主机发送CMD9获取CSD中的数据。
CMD7用于在空闲状态与传输状态下切换。当CMD7的RCA为0x0000时,所有的卡切换成空闲状态。
<> 读操作。
所有的读命令都可以通过CMD12取消。
CMD17读单一块,CMD18读多块。写保护CMD30。ACMD51,CMD56。
<> 写操作
所有的写命令都可以通过CMD12取消。写命令以CMD7终止。
块写(CMD24,CMD25),锁与解锁(CMD42),CMD56。
(详见《SD卡说明》P61)
读一块的大小定义在CSD (READ_BL_LEN)中。读出的数据块后都会跟一个CRC校验码。
CMD17启动单块读操作,读完后自动回到传递状态。CMD18启动多块读操作,SD卡连续发送数据,直至收到停止命令。
(CMD24—27,42,56(w))开启单个或多个块的写操作。主机向SD卡发送的数据都必须跟CRC校验码。SD卡允许的最小写单位为512B。
在需要连续写入多块数据时,建议使用多块写入命令。对于小于512B的块写入是不允许的。
当主机尝试向已保护的区域写数据时,SD卡不执行该操作,在状态寄存器上值WP_VIOLATION位,并忽略后面的操作。
在执行多块写操作之前执行了预擦命令(ACMD23),告诉卡将要写入的块数。这样会让写速度更快。
主机通过该命令告知SD卡,接下来将会写入多少块数据。如果主机在写操作实际没有写那么多块,那么剩下的块数据是不确定的。如果实际写入的大于预定的,那么卡将一块一块地擦除。
建议使用CMD25命令,让多块写操作更快。
(详见P64)
(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)。
命令有以下四种类型:
* 广播(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+)
以下不一一举列,
(标题5)
SD卡的CMD/MISO引脚在SD总线模式扮演CMD线,在SPI模式是MISO线。无论是什么模式,该脚都能接收数据。
在SD卡上电后,SD卡并不知道自己处于什么通信模式。这并不防碍CMD/MISO脚输入数据。主机通过该脚发送CMD0命令。
如果SD卡在应答CMD0命令时,CS引脚为低电平,则认为当前的通信模式为SPI总线模式。