当前位置: 首页 > 工具软件 > sd > 使用案例 >

SD卡初始化

隗锐进
2023-12-01

SD卡初始化
1 寄存器介绍
SD卡内部有7个寄存器,分别为:OCR、CID、CSD、SCR、RCA、CSR和SSR寄存器(mmc卡没有SCR、SSR寄存器)。
OCR寄存器:OCR寄存器:32bit。这个寄存器存储了卡的VDD电压轮廓图。任何标准的SD卡控制器可以使用2V-3.6V的工作电压来让SD卡能执行这个电压的识别操作。OCR寄存器存储了在访问卡数据是所需的电压范围。OCR的第30位反映该卡是否为高容量卡。如图2-1:

CID寄存器: 128bit。包含了本卡的特别识别码(唯一ID号),这些信息是卡生产期间被编程,控制器不能修改它们的内容,具体内容如下图2-2:

CSD寄存器:128bit。这个寄存器保存着SD卡的详细信息,如块的大小、SD卡容量、文件系统等信息。在SD3.0协议中,CSD分为1.0版本和2.0版本。版本1.0对应着标准容量的SD卡(小于等于2GB),版本2.0对应高容量和超高容量的SD卡(大于2GB)。注:根据CSD寄存器版本号解决的问题:0077247
1.0和2.0CSD寄存器结构不同,如图2-3、2-4:

SCR寄存器:64bit。SD卡配置寄存器,mmc卡没有SCR寄存器。这个寄存器的内容由制造商在生产场内设置。定义了数据在擦除后的状态是’0’/’1’。描述了该卡支持的安全算法。描述该卡所支持的所有数据总线宽度。如图2-5:

RCA寄存器:16bit。RCA寄存器保存了在卡识别过程中卡发布的器件地址。该地址用在卡识别后主机利用该地址与卡进行通信。
CSR寄存器:卡状态寄存器

2 卡状态介绍
SD卡的工作模式分为:无活动模式、卡识别模式、数据传输模式
无活动模式:空闲状态
卡识别模式:卡在复位以后(CMD0)和收到SEND_RCA命令以前都处以此模式
数据传输模式:卡在第一次发布他们的RCA以后都处以数据传输模式
依赖关系如下图3-1:

3 CMD命令介绍
SD卡的CMD命令由6字节组成:
Byte1:命令号 01+命令号 比如CMD8  01001000
Byte2-5:命令参数,有些命令没有参数
Byte6:前7位为校验位,最后一位为停止位

CMD0 复位SD卡,重置所有卡到idle状态,参数为0
CMD1 设置SD卡到activate状态,也就是退出idle状态。(注意:在mmc卡中,CMD1命令作用为读取OCR寄存器,获取支持的电压值)。
CMD2 广播获取卡的CID信息
CMD3 广播分配SD卡的相对地址
CMD5 使卡进入或者退出sleep state
CMD6 切换功能(如切换到高速模式)
CMD7 根据获取的指定的RCA(卡的相对地址),选中SD卡,如果在选中的一个卡的状态下又选中其它的卡,那么之前的卡会自动取消选中,如果发送地址0,表示取消选中全部卡
CMD8 判断卡的类型(SD2.0,SD1.0,SDIO,mmc)
CMD9 读CSD寄存器(获取卡的存储信息,如块的大小,容量等)
CMD10 读CID寄存器(读取卡的唯一ID号)
CMD12 停止读多块时的数据传输
CMD13 读取卡状态寄存器(CSR)
CMD16 设置单个扇区的大小,一般为512字节一个扇区
CMD17  读单块
CMD18 读多块,直至主机发送CMD12
CMD24 写单块
CMD25 写多块
CMD27 写CSD寄存器(保存着SD卡的详细信息:块的大小,SD卡的容量大小,文件系统等内容)
CMD28 设置写保护的地址
CMD29 擦除写保护的地址
CMD30 向卡询问写保护位的状态
CMD32 设置擦除块的起始地址
CMD33 设置擦除块的终止位置
CMD38 擦除所选择的块
CMD52 设置四位传输模式
CMD55 发送特殊命令前需要先发送CMD55
ACMD6 设置SD卡的总线位宽。需要先读取SCR寄存器(SD卡配置寄存器,描述该卡所支持的所有数据总线宽度)
ACMD11 切换总线宽度
ACMD41 获取SD卡支持的电压值(OCR寄存器)ACMD51 获取SD卡SCR寄存器的值(SD卡配置寄存器,描述该卡所支持的所有数据总线宽度)

4初始化流程介绍
SD卡的初始化流程分为两个阶段:初始化阶段与识别阶段

上电
à( mmc_power_up(host, host->ocr_avail)
/*********************************************************************************初始化阶段开始
Idle
state
       (1)获取合适的工作电压
       Host发送CMD0命令进行复位
à( mmc_go_idle(host)
Host发送CMD8,告诉卡host可以支持SD2.0。卡收到CMD8命令后如果是是2.0的卡,会使能自己符合SD2.0的一些新功能(支持1.8V工作电压)
à( mmc_send_if_cond(host, host->ocr_avail)
Host发送参数为0的ACMD41,得到卡支持的工作电压范围
à( mmc_send_app_op_cond(host, 0, &ocr)
Host选择一个卡和host都支持的最低工作电压,并将host提供给卡的工作电压设置为这个值(后续就以这个工作电压重新复位(CMD0)开始对SD卡真正的初始化流程)
à( mmc_select_voltage(host, ocr)
              (2)重新复位,对Sd卡内部初始化
à( mmc_sd_init_card(host, rocr, NULL)
       à( mmc_sd_get_cid(host, ocr, cid, &rocr)
              Host发送CMD0命令复位
à mmc_go_idle(host);
              Host发送CMD8,高速卡host可以支持2.0的卡。如果是2.0的卡,会使能符合2.0的功能
à( mmc_send_if_cond(host, ocr)
Host发送带参数的ACMD41,发送给卡。参数里包含:host设置好的最低工作电压
              循环发送CMD55 +ACMD41,通过OCR寄存器第31 busy位判断卡内部是否初始化完成,当OCR寄存器的busy位(OCR寄存器的第31bit)为1时,SD卡内部初始化完成,卡进入ready state。
à( mmc_send_app_op_cond(host, ocr, rocr)
************************************************************************************/初始化完成
/**********************************************************************************识别阶段开始
       Ready state
              (1)Host根据ACMD41返回的rocr提取对应的S18A,如果为1,说明卡支持切换到1.8V。Host发送CMD11要求卡切换到1.8V的信号电压,同时host切换提供给卡的信号电压为1.8V。
à(mmc_set_uhs_voltage(host, pocr);)。
              (2)获取卡的CID值
              Host发送CMD2命令,要求卡回复其CID的值,一旦卡有回复后,卡进入到identification state。à(mmc_send_cid(host,
cid))
       Identification state
获取卡的RCA值
Host发送CMD3,要求卡回复其RCA的值(相对地址),一旦卡回复之后,卡进入stand-by state。
à( mmc_send_relative_addr(host, &card->rca))
******************************************************************************/识别阶段完成

/*****************************************************************************设置参数阶段
       Stand-by state
              (1)Csd寄存器中存储了SD卡的一些基础信息,host发送CMD9要求卡回复其CSD寄存器的值。
à( mmc_sd_get_csd(host, card)
              (2)Host发送CMD7,选中对应的卡,将卡切换到transfer taste。
à( mmc_select_card(card)
       Transfer state
à( mmc_sd_setup_card(host,
card, oldcard != NULL)(卡片被识别并选择后,开始设置卡片)
(1)Host发送ACMD51,要求卡回复其SCR(SD configuration register)寄存器的值。
à(mmc_app_send_scr(card)
(2)发送ACMD13,要求卡回复其SSR(SD state register)寄存器的值。
à(mmc_read_ssr(card)
(3)Host发送CMD6读取SD卡switch status,通过card switch status可以得到card支持的总线速度模式以及驱动强度类型。(mmc_read_switch(card)
à( mmc_sd_setup_card(host, card, oldcard != NULL)
              (4)切换总线宽度:
à(
mmc_sd_init_uhs_card(card)(切换到高速工作模式)
Host发送ACMD11,要求卡将总线宽度切换到4bit模式。
à(mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4)
设置host自身的总线宽度为4bit模式。
à(mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4)
              (5)选择合适的总线速度模式,驱动强度
              Host从卡和host都支持的总线速度模式中选择一个最优的模式。(sd_update_bus_speed_mode(card)
              (6)Host根据选择的总线速度模式,来选择对应的驱动类型及限流值,通过CMD6切换。à(sd_select_driver_type(card,
status) 
à(sd_set_current_limit(card, status)
              (7)Host发送CMD6,要求卡切换到对应的总线速度模式上。
à(sd_set_bus_speed_mode (card, status)
              (8)执行tuning操作(调整采样点使两个时钟频率匹配)
à( mmc_execute_tuning(card)
***********************************************************************************/到这个地方整个SD卡初始化就已经完成

 类似资料: