SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的
SD 卡是基于 flash 的存储卡。
SD 卡和 MMC 卡的区别在于初始化过程不同。SD卡并不是我们通常意义上的手机扩展卡,那种卡叫做TF卡,但是通讯以及驱动模式是类似的.
SD 卡的通信协议包括 SD 和 SPI 两类,SD卡上电之后默认处于SD状态。
SD 卡使用卡内智能控制模块进行 FLASH 操作控制,包括协议、安全算法、
数据存取、ECC 算法、缺陷处理和分析、电源管理、时钟管理。这些都不需要用户关系,这是SD卡厂商做的事情
驱动SD卡主要要实现读扇区,写扇区,初始化,获取SD卡相关配置信息这几个就可以了,
另外.SD卡本身只是一种数据介质,它不含有文件系统,文件系统是一种文件的组织格式,是独立于存储介质的一种规范
标准SD卡引脚序列
SD卡引脚功能表
TF卡引脚排序
TF卡引脚功能表
由此可见,TF卡比SD卡少了一个VSS引脚,也就是少了一个供电引脚
另外电路设计时若SD卡使用SPI模式,那么不用的几根数据线应加上上拉电阻,否者会因为这几根数据线的电流震荡引起电流损耗,造成电路上的不稳定
SD卡电路SPI驱动模式
SD卡内部有五个我们可以读取的寄存器,分别如下
要读取这些信息就需要与卡通讯,SD通讯是用命令+数据的形式进行的,命令格式如下
也就是说,一次SD卡命令发送一共要发送6个字节,对于SPI通讯而言,就是SPI总线上传送六个字节
字节 1 的最高 2 位固定为 01,低 6 位为命令号(比如 CMD16,
为 10000 即 16 进制的 0X10,完整的 CMD16,第一个字节为 01010000,即 0X10+0X40)。
字节 2~5 为命令参数,有些命令是没有参数的。对于没有参数的命令默认发送0即可
字节 6 的高七位为 CRC 值,最低位恒定为 1,crc计算遵循以下规律
GX为生成多项式,具体计算方法请查看CRC计算相关,不过有一点好处就是,在SPI驱动模式下,不需要CRC校验(默认SD卡在SPI模式下不开启CRC校验,在SD模式下默认开始CRC校验),所以我们只需要对CMD0进行CRC就可以了,后面的CRC都可以不管(因为在CMD0之前是SD模式,所以第一个命令需要,切换之后就不用了),而CMD0的CRC为0x95(加上了之后的一位1)
注:SPI模式下打开crc校验需要用到CMD59的保留命令,请查阅相关资料
SD卡的命令表如下所示(以下仅写出SPI模式的CMD)
CMD0 复位SD卡, 重置所有卡到 Idle状态,参数为0
CMD1 设置SD卡到ACTIVATE模式,也就是推出IDLE模式
CMD8 发送接口状态命令
CMD9 读取CSD寄存器
CMD10 读取CID寄存器
CMD12 在多块读取的时候请求停止读取
CMD13读取SD卡状态寄存器