SD卡初始化
SPI方式驱动SD卡
SPI初始化
1、初始化SPI接口及相关IO(通过SPI连接SD卡,所以先要初始化MCU的SPI接口,以及相关IO)
2、上电延时(>74个CLK)(应为SD卡内部有个供电电压上升时间,大概为64个CLK,剩下的10个CLK用于SD卡同步)
3、向SD卡发送复位命令(CMD0),进入IDLE状态。CS有效电平为“低”,SPI模式被启用
4、发送CMD8,检查是否支持SD卡2.0协议
5、根据不同协议检查SD卡(相关命令:CMD55、ACMD41、CMD58和CMD1等)
6、取消片选,发送8个CLK,结束初始化
注:卡初始化时,时钟不能大于400KHz.
SD卡单块数据块读取流程
1、发送CMD17指令,开始读数据块
2、等待CMD17响应(R1)
3、等待数据起始令牌:0XFE
4、接收数据
5、禁止片选,完成数据读取
SD卡多块数据块读取流程
1、发送CMD18指令,开始读取数据块
2、等待CMD18响应(R1)
3、等待数据起始令牌:0XFE
4、读第一个数据块的数据
5、等待数据起始令牌:0XFE
6、读第二个数据块的数据
7、......读取第N个数据块的数据
8、发送CMD12指令,结束数据块读取
9、等待CMD12响应(R1)
10、禁止片选,结束多块数据块读取
SD卡单块数据块写入流程
1、发送CMD24指令,开始写入数据
2、发送写数据起始令牌:0XFE
3、写入一个块的数据
4、发送2个字节的伪CRC(0XFE)
5、截止片选,完成单块数据写入
SD卡多块数据块写入流程
1、发送ACMD23指令,预擦除数据块
2、发送CMD25指令,开始写数据块
3、发送多块写数据起始令牌:0XFC
4、写入第一个数据块的数据
5、发送2个字节的伪CRC(0XFF)
6、发送多块写数据起始令牌:0XFC
7、写入第二个数据块的数据
8、......写入第N个数据块的数据
9、发送多块写数据结束令牌:0XFD
10、禁止片选,完成多数据块写入
注:发送ACMD之前,要先发送CMD55,通知SD卡,接下来要发送的是应用命令(APP CMD),而非标准命令