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卡状态寄存器 ![]()
CMD16 设置单个扇区的大小一般都设置为512字节一个扇区 CMD17 读取扇区命令 CMD18 读取多个扇区知道发送停止命令 ![]()
CMD24 写扇区命令 CMD25 写多个扇区命令 ![]()
CMD27 编辑CSD位 CMD28设置地址组保护位。写保护由卡配置数据的WP_GRP_SIZE 指定 CMD29清除保护位 ![]()
CMD30 要求卡发送写保护状态,参数中有要查询的地址 ![]()
CMD32 设置要擦除的第一个写数据块地址 CMD33 设置要擦除的最后一个写数据块地址 ![]()
CMD38 擦除所有选中的块
|