SD 卡系统有两种工作模式:卡识别模式和数据传输模式。
1、卡识别模式
主机上电复位后即处于此模式,它会在总线上等待卡. 卡复位后也处于此模式, 直到SEND_RCA(CMD3)命令到来。
此模式下主机复位总线所有的卡, 验证工作电压, 询问卡的地址. 这个模式下所有数据的传输都是只通过CMD线来完成。
1) 卡的复位
当卡上电或收到 GO_IDLE_STATE (CMD0)命令后, 卡即进入 Idle State 状态. 此时卡将其RCA设为0, 相关寄存器设为传输稳定的最优模式。
2) 工作电压验证
每个卡的最高和最低工作电压存储在 OCR. 只有当电压比配时, CID 和 CSD 的数据才能正常传输给主机.SD_SEND_OP_COND (ACMD41)命令用来判断卡的工作电压是否符合, 如果不符合的话, 卡应该放弃总线操作, 进入 Inactive State 状态. 在发送 SD_SEND_OP_COND (ACMD41)命令前记 得 要 首 先 发 送 APP_CMD(CMD55).
ACMD41 命令响应中的 BUSY 位也用于卡表示其还没准备好, 主机此时应重发 ACMD41 命令, 直到卡准备好. 主机在这个阶段的 ACMD41 中不允许改变工作电压, 如果确实想改变的话, 应该先发送CMD0, 然后再发送改变后的 ACMD41。GO_INACTIVE_STATE (CMD15)命令用于使指定地址的卡进入 Inactive State 模式。
3) 卡识别过程.
ALL_SEND_CID (CMD2)命令用于获取卡的 CID 信息, 如果卡处于 Ready State, 它就会在CMD 线上传送它的 CID 信息, 然后进入 Identification State 模式. 紧接着发送 CMD3(SEND_RELATIVE_ADDR)命令, 用于设置卡新的地址. 卡收到新的地址后进入 Stand-by State模式。
2、数据传输模式
卡收到 SEND_RCA(CMD3)命令后即进入此模式. 主机识别到卡后也进入此模式。
进入数据传输模式后, 主机先不停的发送 SEND_CSD (CMD9)命令获取卡的 CSD 信息。SET_DSR (CMD4)用于设置卡的 DSR 寄存器, 包括数据总线宽度, 总线上卡的数目, 总线频率, 当设置成功后, 卡的工作频率也随之改变. 此步操作是可选的。
CMD7 命令用于使指定地址的卡进入传输模式, 任何指定时刻只能有一个卡处于传输模式. 传输模式下所有的数据传输都是点对点的, 并且所有有地址的命令都需要有响应。
所有读命令都可以由 CMD12 命令停止,之后卡进入 Transfer State. 读命令包括单块读(CMD17), 多块读(CMD18), 发送写保护(CMD30), 发送 scr(ACMD51)和读模式一般命令(CMD56)。
所有写命令都可以由 CMD12 命令停止. 写命令包括单块读(CMD24), 多块读(CMD25),写 CID(CMD26), 写 CSD(CMD27),锁和解锁命令(CMD42)和写模式一般命令(CMD56)。
当写命令传输完成后, 卡进入 Programming State(传输成功)或 Transfer State(传输失败)
如果一个卡写操作被停止,但其前面数据的 CRC 和块长度正确, 数据还是会被写入。
卡要提供写缓冲, 如果写缓冲已满并且卡处于 Programming State, DAT0 保持低 BUSY。
写 CID,CSD, 写保护, 擦除命令没有缓冲, 当这些命令没完时, 不应发送其他的数据传输命令。
参数设置命令在卡被编程时是不允许发送的, 这些命令包括设置块长度(CMD16), 擦除块起始(CMD32)和擦除块结束(CMD33)。
当卡正编程时读命令是禁止的.
用CMD7 使另一个卡进入 Transfer State 不会终止当前卡的编程和擦除, 当前卡会进入Disconnect State 并且释放DAT线。Disconnect State模式的卡可通过 CMD7 重新被选中,此时卡进入 Programming State并且使能 busy 信号。
CMD0 或 CMD15 会终止卡的编程操作, 造成数据混乱, 此操作应禁止。
1) 总线宽度选择命令
ACMD6 命令用于选择总线宽度, 此命令只有在 Transfer State 有效. 应在 CMD7 命令后使用。
2) 块读命令
块是数据传输的最小单位, 在 CSD (READ_BL_LEN)中定义, SD 卡为固定的 512B.
每个块传输的后面都跟着一个 CRC 校验. CMD17(READ_SINGLE_BLOCK)用于传输单个块, 传输完之后,卡进入 Transfer State. CMD18 (READ_MULTIPLE_BLOCK)用于多个块的传输, 直到收到一个 CMD12 命令.
3) 块写命令
与块读命令类似, 每个块传输的后面都跟着一个 CRC 校验.卡写数据时会进行 CRC 校验. 多块写比重复的单块写更能提高效率. 如果CSD中的WRITE_BLK_MISALIGN没设置, 并且发送的数据不是块对齐的, 卡会设置状态寄存器中的ADDRESS_ERROR位,并且进入Receive-data-State状态等待停止命令.此时写操作也会停止, 并且卡会设置其的 WP_VIOLATION 位. 如果写缓冲满的话, 卡会停止接受 WRITE_BLOCK 命令. 此时主机应发送 SEND_STATUS(CMD13)命令, 卡返回数据的 READY_FOR_DATA 位标志卡是否准备好接受新的数据. 在多块写操作中通过事先发送 ACMD23 命令可提高写速度. ACMD23 用于定义接下来要写数据的块的数目. 每次多块写操作后, 这个值又被设为默认的 1。ACMD22 会使卡返回写成功的块数目。
4) 擦除命令
擦除命令的顺序是: ERASE_WR_BLK_START(CMD32),ERASE_WR_BLK_END(CMD33)and ERASE(CMD38)。如果(CMD38或(CMD32, 33)接收到出错信息, 卡会设置状态寄存器中的ERASE_SEQ_ERROR位并且重新等待新的命令时序. 如果接收到时序错误命令, 卡会设置其 ERASE_RESET 位并且重新等待新的命令时序。
5) 写保护管理
有三种机制:
A.写保护物理开关
B.卡内部写保护
通 过 设 置 CSD 中 的 WP_GRP_ENABLE 位 和 WP_GRP_SIZE 位 , SET_WRITE_PROT 和CLR_WRITE_PROT 命令用来设置和清除保护机制。
C.密码保护.