关于个人介绍,既然你诚心诚意的看了 我就大发慈悲的告诉你 为了防止世界被破坏 为了维护世界的和平 贯彻爱与真实的邪恶 可爱又迷人的反派角色 我们是穿梭在银河的火箭队 白洞,白色的明天在等着我们
分类: 嵌入式
2019-11-13 15:47:16
SD/MMC描述
flash的出现,诞生了MMC, MMC的出现产生了SD,SD的出现造就了SDHC/SDXC以及后面的TF卡,TF卡容易松动造就了eMMC。eMMC和SSD本质一样,都内部含有控制器,只是一个是贴片,一个是硬盘。
注重接口叫sdio,注重卡一侧叫SD/MMC。 sdio支持1bit, spi, 4bit模式;而mmc支持1bit,spi,4bit,8bit模式。物理线主要是CMD,CLK, DATA0-DATA7(8bit,mmc)或者 CMD,CLK,DATA0-DATA3(sdio);在MMC中,通常data1复用为中断线。所有的命令传输都在CMD线上,DATA是双向的主要用于传数据。(工作模式有点类似于spi/i2c总线,只需要实现一个transfer函数功能就可以了(负责指令发送,应答接收,数据接收))
SD 总线协议
SD总线通信是基于指令和数据比特流,起始位开始和停止位结束。数据传输由host发起,comand->response(可选)->data(可选); SD总线通信有三个元素:
Command:由host发送到卡设备,使用CMD线发送;
Response:从card端发送到host端,作为对前一个CMD的相应,通过CMD线发送;
Data:即能从host传输到card,也能从card传输到host,通过data线传输。
Commands
以下是四种用于控制卡设备的指令类型,每个command都是固定的48位长度:
1、broadcast commands(bc), no response:广播类型的指令,不需要有响应;
2、broadcast commands with response(bcr):广播类型的指令且需要响应;
3、addressed(point-to-point) commands(ac):由HOST发送到指定的卡设备,没有数据的传输;
4、address(point-to-point) data transfercommands(adtc):由HOST发送到指定的卡设备且伴随有数据传输。
指令格式:
Card register
几个主要的寄存器:OCR,CID,CSD,RCA和SCR。
Operation condition register(OCR):32位的OCR包含卡设备支持的工作电压表;
Card identification number register (CID):包含用于在卡识别阶段的卡信息,包括制造商ID,产品名等;
Card specific data register(CSD):CSD寄存器提供了如何访问卡设备的信息,包括定义了数据格式,错误校验类型,最大访问次数,数据传输率等;
Relative card address register(RCA):存放在卡识别阶段分配的相对卡地址,缺省相对卡地址为0000h;
SD card configuration register(SCR):SCR是一个配置寄存器,用于配置SD memory card的特殊功能。
Response
所有的response都通过CMD线发送到host端,R4和R5响应类型是SDIO中特有的:
1、R1(normal response command):用来响应常用指令;
2、R2(CID,CSD register):用来响应CMD2和CMD10或CMD9,并把CID或CSD寄存器作为响应数据;
3、R3(OCR register):用来响应ACMD41指令,并把OCR寄存器作为响应数据;
4、R6(published RCA response):分配相对卡地址的响应;
5、R7(card interface condition):响应CMD8,返回卡支持的电压信息;
6、R4(CMD5):响应CMD5,并把OCR寄存器作为响应数据;
7、R5(CMD52):CMD52是一个读写寄存器的指令,R5用于CMD52的响应;
参考链接:
https://www.cnblogs.com/lihuidashen/p/6112169.html
https://blog.csdn.net/jsn_ze/article/details/50832881
Host 探测SD/MMC指令:
Setting 1-bit bus width (设置成1bit模式)
Setting clock 400000 (199999992/512) (设置初始时钟为400khz)
CMD0 (0x00000300) arg 0x00000000 issue. // 复位
CMD8 (0x00000408) arg 0x000001aa issue. // 读取版本号,读到就为2.0
CMD5 (0x00000705) arg 0x01000000 issue. // 设置ocr属性,失败则用CMD1判断是SD还是MMC
CMD error. INFO2 000000c0
CMD1 (0x00000701) arg 0x00000000 issue. // 设置ocr属性,失败则是SD,成功是MMC
CMD error. INFO2 000000c0
SD初始化:
CMD0 (0x00000300) arg 0x00000000 issue. // 复位SD
CMD8 (0x00000408) arg 0x000001aa issue. // 重新读取版本号
while (1s) {
CMD55 (0x00000437) arg 0x00000000 issue. // 配置rca
CMD41 (0x00000729) arg 0x41300000 issue. // 配置电压相关
}
MMC初始化:
CMD0 (0x00000300) arg 0x00000000 issue. // 复位SD
while (1s) {
CMD1 (0x00000408) arg 0x000001aa issue. // 设置MMC ocr属性
}