对于 SD 卡的 SPI 模式而言,采用的 SPI 的通信模式为模式 3,即 CPOL=1,CPHA=1,在 SD 卡 2.0 版
本协议中,SPI_CLK 时钟频率可达 50Mhz。
SD 卡的 SPI 模式,只用到了 SDIO_D3(SPI_CS)、SDIO_CMD(SPI_MOSI),SDIO_SC(SPI_SCK)和 SDIO_D0(SPI_MISO)引脚
sd卡初始化命令
1、SD 卡在正常读写操作之前,必须先对 SD 卡进行初始化,SD 卡的初始化过程就是向 SD 中写入命令。在对 SD 卡进行读写操作时同样需要先发送写命令和读命令,SD 卡的命令格式由 6 个字节组成(先发送高位再发送低位)
写入命令:
byte1:命令号,格式为01xx_xxxx,
byte2~byte5:命令参数
byte6: 前 7 位为 CRC(循环冗余校验)校验位,最后一位为停止位 0. 在 SPI 模式下默认不开启
CRC 校验(校验位全部设为1),在 SDIO 模式下开启 CRC 校验.SD 卡上电默认是 SDIO
模式,在接收 SD 卡返回 CMD0 的响应命令时,拉低片选 CS,进入 SPI 模式.
SD 卡的命令号(byte1)分为标准命令(如 CMD0)和应用相关命令,在发送应用相关命令之前,必须先发送 CMD55 命令
返回的R1数据格式
返回的 R3 数据格式
返回的R7 数据格式
电压范围比较重要,具体内容如下:
判断SD卡版本:( SD1.0 和SD2.0(SD2.0才支持 CMD8 命令) )
发送CMD8有响应:SD2.0
无响应:发送 CMD55 + ACMD41
返回0 : SD1.0
返回错误: 则是MMC卡,发送CMD1
返回0 ,MMC卡初始化成功,否则是错误卡。
SD2.0初始化
1、先对从机 SD 卡发送至少 74 个以上的同步时钟,在上电同步期间,片选 CS 引脚和 MOSI 引脚必须为高电平(MOSI 引脚除发送命令或数据外,其余时刻都为高电平)
2,拉低片选 CS 引脚,发送命令 CMD0(0x40)复位 SD 卡,等待返回数据
3,在接收返回信息期间片选 CS 为低电平,判断数据为复位完成信号 0x01,SD 卡返回响应数据的 8 个时钟周期后再拉高片选 CS 信号,SD 卡进入 SPI 模式。如果返回其他值,重新上一步。
4,拉低片选 CS 引脚,发送命令 CMD8(0x48)查询 SD 卡的版本号,等待返回数据。
5,SD 卡返回响应数据后,先等待 8 个时钟周期再拉高片选 CS 信号,此时判断返回的响应数据,如果为4'b0001,(即2.7V~3.6V), SD卡位2.0版本,否则上一步。
6、拉低片选 CS 引脚,发送命令 CMD55(0x77)告诉 SD 卡下一次发送的命令是应用相关命令,等待返回数据。
7、SD 卡返回响应数据后,先等待 8 个时钟周期再拉高片选 CS 信号,此时判断返回的响应数据。如果返
回的数据为空闲信号 0x01,开始进行下一步
8、拉低片选 CS 引脚,发送命令 ACMD41(0x69)查询 SD 卡是否初始化完成,等待返回数据。
9、SD 卡返回响应数据后,先等待 8 个时钟周期再拉高片选 CS 信号,此时判断返回的响应数据若为0x00,则初始化完成。否则第6步。
SD 卡在初始化的时候,SPI_CLK 的时钟频率不能超过 400KHz,在初始化完成之后,再将 SPI_CLK 的时钟频率切换至SD 卡的最大时钟频率。
SD卡写操作
拉低片选 CS 引脚,发送命令 CMD24(0x58)读取单个数据块,等待返回数据。
返回正确响应数据 0x00 后,等待至少 8 个时钟周期,开始发送数据头 0xfe;
3、 发送完数据头 0xfe 后,接下来开始发送 512 个字节的数据(要发送512字节的整数倍)
4、 数据发送完成后,发送 2 个字节的 CRC 校验数据。由于 SPI 模式下不对数据进行 CRC 校验,
直接发送两个字节的 0xff 即可;等待返回数据。
5、SD 卡返回响应数据(xxx0_0101)后会进入写忙状态(MISO 引脚为低电平),即此时不允许其它操作。当检测到 MISO 引脚为高电平时,SD 卡此时退出写忙状态;
6、拉高 CS 引脚,等待 8 个时钟周期后允许进行其它操作。
SD卡读操作
1、 拉低片选 CS 引脚,发送命令 CMD17(0x51)读取单个数据块,等待返回响应数据;
2、 SD 卡返回正确响应数据 0x00 后,准备开始解析 SD 卡返回的数据头 0xfe;
3、 解析到数据头 0xfe 后,接下来接收 SD 卡返回的 512 个字节的数据;
4、 数据解析完成后,接下来接收两个字节的 CRC 校验值。由于 SPI 模式下不对数据进行 CRC
校验,可直接忽略这两个字节;
6、 拉高片选 CS 引脚,等待 8 个时钟周期后允许进行其它操作。