1,初始化SDIO外设,关闭SDIO时钟。
2,上电,开启时钟,注意此时时钟应不能超过400kHz,且此时是只有一位数据线,要到初始化完成后再调时钟与数据线宽度。
3,延时最低74个时钟周期。使时钟与SD卡稳定,否则会出错。
4,发送CMD0,需要返回0x01,进入Idle状态
5,为了区别SD卡是2.0还是1.0,或是MMC卡,这里根据协议向上兼容的原理,首先发送只有SD2.0才有的命令CMD8,如果CMD8返回无错误,则初步判断为2.0卡,进一步发送命令循环发送CMD55+ACMD41,直到返回0x00,确定SD2.0卡初始化成功,进入Ready状态,再发送CMD58命令来判断是HCSD还是SCSD,到此SD2.0卡初始化成功。如果CMD8返回错误则进一步判断为1.0卡还是MMC卡,循环发送CMD55+ACMD41,返回无错误,则为SD1.0卡,到此SD1.0卡初始成功,如果在一定的循环次数下,返回为错误,则进一步发送CMD1进行初始化,如果返回无错误,则确定为MMC卡,如果在一定的次数下,返回为错误,则不能识别该卡,初始结束。
6,发送CMD2获取CID。
7.发送CMD3,获取RCA。
8,发送CMD9,获取CSD(SD卡容量等相关内容在这里)。
9,将时钟设置为所需要的频率,将数据线位宽设置为所需要的宽度。
10,之后便可以收发数据。
注意:收发数据时,当卡为标准容量卡时以字节为单位,当卡为高容量卡时应以块为单位来写地址。且读取或写入只能按块读写。