一、SD卡初始化步骤
1、上电后延时至少74Clock,等待SD卡内部操作完成。
2、片选CS低电平选中SD卡。
3、发送CMD0( {8‘h40, 8‘h00, 8‘h00, 8‘h00, 8‘h00, 8‘h95} ),需要返回0x01,进入Idle状态。
4、为了区别SD卡是2.0还是1.0,或者是MMC卡,这里根据协议向上兼容的,首先发送只有SD2.0才有的命令CMD8( CMD8= {8‘h48, 8‘h00, 8‘h00, 8‘h01, 8‘haa, 8‘h87} ),
如果CMD8返回无错误,则初步判断为2.0卡,进一步发送命令循环发送CMD55 (8‘h77, 8‘h00, 8‘h00, 8‘h00, 8‘h00, 8‘hff)+ ACMD41 ( {8‘h69, 8‘h40, 8‘h00, 8‘h00, 8‘h00, 8‘hff} ),直到返回0x00,确定是SD2.0卡。
5、如果CMD8返回错误则判断为1.0卡或者MMC卡,循环发送CMD55 + ACMD41,返回无错误,则为SD1.0卡,到此SD1.0卡初始化成功,如果在一定的循环次数下,返回为错误,则进一步发送CMD1进行初始化,
如果返回无错误,则确定是MMC卡,如果在一定的次数下,返回无错误,则不能识别该卡,初始化结束。
6、CS拉高。
二、SD卡读步骤
1、发送CMD17( {8‘h51, 8‘h00, 8‘h00, 8‘h00, 8‘h00, 8‘hff } )(单块)或CMD18(多块)读命令,返回0x00。
2、接受数据开始令牌0xfe(或者0xfc) + 正式数据512Bytes + CRC校验2Bytes默认正式传输的数据长度是512Bytes,可用CMD16设置块长度。
三、SD卡写步骤
1、发送CMD24( {8‘h58, 8‘h00, 8‘h00, 8‘h00, 8‘h00, 8‘hff} )(单块)或者CMD25(多块)写命令,返回0x00。
2、发送数据开始令牌0xfe(或者 0xfc) + 正式数据512Bytes + CRC校验2Bytes。