一、1bit-4bit数据传输对比
CPU/EDMA与SD的数据传输可以设置为1bit或4bit模式,1bit模式仅使用DAT0数据线,4bit模式使用DAT3-DAT0四位数据线。例如,传输512字节的数据,传输的数据格式如下图所示:
二、读写命令
读写分为单块读写和多块读写。
CMD16:SET_BLOCKLEN,用于设定每次读写的块大小,对于标准容量卡standard SD,默认块大小为512字节,可以通过该命令改变CSD寄存器值从而改变读写块大小;而对高容量卡SDHC,块大小固定为512字节,不可以改变。
CMD17:READ_SINGLE_BLOCK,单块读取,每次读取一个数据块,命令参数附加有地址信息,实现读取SD卡某个地址的数据。
CMD18:READ_MULTIPLE_BLOCK,多块读取,每次读写多个数据块,命令参数同样包含地址信息。
与之对应的CMD24(WRITE_BLOCK)、CMD25(WRITE_MULTIPLE_BLOCK)可以实现单块与多块写操作。
对于标准容量卡,读写命令参数argument值为字节地址,读取时对第n个扇区,地址为512*n;对于高容量卡,读写命令参数argument值为扇区地址,读取时第n个扇区地址即为n。
三、单块多块读写时序图
读写过程,首先发送读写命令,接收到命令发送成功的response后发送或接受数据,如果为单块读写命令,发送或接收单块数据后即完成;如果为多块读写命令,直到收到停止操作的命令(CMD12)数据传输结束。
四、读写状态转换图
CMD3(SEND_RELATIVE_ADDR)完成后,host得到RCA,由卡识别模式进入数据传输模式。
1、 主机发送CMD9(SEND_CSD)命令获取卡的CSD信息。从CSD寄存器中可以获得最大读写的块长度等信息。
2、 发送CMD7(SELECT/DESELECT_CARD),命令参数为RCA,可以选中某个RCA地址的卡,同时断开与其他卡的连接;命令参数RCA=0时,host断开与所有卡的连接。该命令使卡由Stand by状态转到Transfer状态。当一个已经处于transfer状态的卡再次接收到CMD7命令时,卡会由transfer状态回到stand by状态,释放DAT总线。
3、 在transfer状态下,可以发送CMD24、CMD25,CMD17、CMD18对卡进行写读。所有这些命令都可以由CMD12命令停止。
4、 在transfer状态也可以发送命令CMD16(SET_BLOCKLEN)来设置读写的块大小。
以TMS320C6747DSP中MMCSD控制器为例,单块数据传输部分流程图如下。