转载地址:https://blog.csdn.net/Deep_l_zh/article/details/82665909
一、命令说明
mmc_go_idle
发送CMD0指令,GO_IDLE_STATE
使mmc card进入idle state。
虽然进入到了Idle State,但是上电复位过程并不一定完成了,这主要靠读取OCR的busy位来判断,而流程归结为下一步。
mmc_send_op_cond
发送CMD1指令,SEND_OP_COND
这里会设置card的工作电压寄存器OCR,并且通过busy位(bit31)来判断card的上电复位过程是否完成,如果没有完成的话需要重复发送。
完成之后,mmc card进入ready state。
mmc_all_send_cid
这里会发送CMD2指令,ALL_SEND_CID
广播指令,使card回复对应的CID寄存器的值。在这里就相应获得了CID寄存器的值了,存储在cid中。
完成之后,MMC card会进入Identification State。
mmc_set_relative_addr
发送CMD3指令,SET_RELATIVE_ADDR
设置该mmc card的关联地址为card->rca,也就是0x0001
完成之后,该MMC card进入standby模式。
mmc_send_csd
发送CMD9指令,MMC_SEND_CSD
要求mmc card发送csd寄存器,存储到card->raw_csd中,也就是原始的csd寄存器的值。
此时mmc card还是处于standby state
mmc_select_card & mmc_deselect_cards
发送CMD7指令,SELECT/DESELECT CARD
选择或者断开指定的card
这时卡进入transfer state。后续可以通过各种指令进入到receive-data state或者sending-data state依次来进行数据的传输
mmc_get_ext_csd
发送CMD8指令,SEND_EXT_CSD
这里要求处于transfer state的card发送ext_csd寄存器,这里获取之后存放在ext_csd寄存器中
这里会使card进入sending-data state,完成之后又退出到transfer state。
mmc_switch
发送CMD6命令,MMC_SWITCH
用于设置ext_csd寄存器的某些bit
mmc_send_status
发送CMD13命令,MMC_SEND_STATUS
要求card发送自己当前的状态寄存器
mmc_send_cid
发送CMD10命令,MMC_SEND_CID
要求mmc card回复cid寄存器
mmc_card_sleepawake
发送CMD5命令,MMC_SLEEP_AWAKE
使card进入或者退出sleep state,由参数决定。
二、初始化顺序
1.power up emmc
2.设置电压,配置阶段为400khz
3.设置位宽为1bit
4.cmd0
5.cmd1循环一直到检测到emmc返回的电源状态稳定
6.cmd2获取cid
7.cmd3 设置rca,如果获取到的数值不正确,可以手动设置为0x01
8.cmd9 获取csd
9.可以重新配置工作速率
10.cmd7 设置为transfer mode
11.cmd8获取额外的csd信息
12.cmd 16设置block len
13.cmd6 设置工作bit模式
14读cmd17.18
15.写cmd24.25
三、EMMC的主机配置
主机的配置最先要注意的就是IO的配置,很多复用的管脚,是否是EMMC的CMD和DATA功能配置