SD/TF卡驱动(一)--------SD卡相关简介

一、概要

前段时间公司提出需求需要在EFR32BG22上用到TF卡,但是并不着急,然后以我的性格而言,你要么不说,这一说出扣我就手痒,于是,就。。。。。。

对于SD/TF卡而言,有两种驱动方式:SDIO和SPI,前者更适合SD卡的驱动,更加稳定、快速和方便。但是对于EFR32BG22来说,并没有SDIO的硬件接口,这里只能用SPI来驱动它。

EFR32自带硬件SPI,之前也用它来驱动过ADS1220(一款TI的24位ADC芯片),有兴趣的可以过去看看:
ADS1220驱动代码
可能因为理解不够,在用硬件SPI驱动SD卡的时候,一直无法初始化通过,死在了ACMD41指令处,一直返回0x01,经过很多测试,甚至有投机取巧的方式,看上去是初始化过去了,但是在后面一直无法对SD卡进行正常读写,期间还把一块SD卡写坏了。

在这里特别声明一下,切勿直接对SD卡进行写操作(读操作无所谓),否则很容易将SD卡写坏。

后面我尝试直接用GPIO模拟SPI,时间已经是凌晨两点,可喜的是,竟然一次性过了。

既然搞了,就把SD卡相关的东西,搞深一点吧,下面记录一下SD卡相关的知识。

本文将分为三个部分学习记录:
(1)SD介绍,包括文档相关协议介绍:SD卡引脚排布即功能、相关寄存器以及命令格式;
(2)SD卡程序初始化流程以及读写;
(3)FATFS文件系统。

如果您觉得自己对SD卡有了一定的掌握,可以直接跳到下一篇,感谢批评指正:
SD/TF卡驱动(二)--------SD卡程序初始化流程以及读写

二、SD卡相关介绍

1.基本介绍

SD卡,中文名叫安全数码卡,由日本松下、东芝和美国SanDisk公司在1999年8月共同开发研制。2g重的他们容量却可以达到32GB以上。

SD卡按照容量分,可分为3类:SD卡、SDHC卡和SDXC卡
SD卡:0~2G
SDHC卡:2G~32G
SDXC卡:32G~2T
前面两种卡协议基本一致,但是SDXC卡协议就相差很大了。对于我们一般嵌入式设备而言,一般32G以下就基本够用了,所以下面大多都是介绍SD卡和SDHC卡的。

前面已经说过,SD卡的驱动一般可以有两种方式:
①SD模式(SDIO驱动)
②SPI模式
嵌入式主机可以任意选择两种中的一种进行通信,与SDIO相比,SPI最大的软肋就是速度问题,但是对于一般的设备而言,SPI的速度也足够满足日常要求。(STM32F103用SPI驱动SD卡,速度可以达到每秒2MByte的速度)。

需要说明的是,有任何问题,请查看SD卡协议文档,本文所有的说明皆出自这份文档说明:
SD卡协议文档

2.SD卡引脚排布及功能描述

SD卡的引脚排布如下:
在这里插入图片描述
其引脚功能描述如下所示(不知道为啥,没办法贴图,凑合看):

针脚        1 		2		3		4		5		6		7		8		9
SDIO模式	CD/DAT3 CMD		VSS		VCC		CLK		VSS		DAT0	DAT1	DAT2
SPI模式		CS		MOSI	VSS 	VCC		CLK		VSS		MISO	NC		NC

上面的VCC只能使用3.3V,注意,切勿使用5V,各个引脚电平IO只支持3.3V。在SPI模式下,四个控制引脚都必须加10~100K的上拉电阻。若你的MCU引脚电平输出不是3.3V,可以参考下面的电路进行电平转换(注意不要照搬照抄,下面图片展示的是3.3V–>5V):
IO电平转换

3.SD卡相关寄存器及命令格式

(1)SD卡一共有5个寄存器,其描述如下:

寄存器名		宽度		描述
CID 		128 	卡的识别码:用于识别单个卡的编号。
RCA 		16		卡的相对地址(这个寄存器在SPI模式下不可用)
CSD 		128 	卡的特性数据:是关于这个卡工作条件的相关信息,卡的容量等信息就保存在这个寄存器中
SCR 		64 		SD配置寄存器:关于这个SD卡的特殊功能的特性信息。
OCR 		32		工作条件寄存器(电压)

(2)命令格式
SD卡的命令格式在SD卡协议文档中有详细说明如下所示:
在这里插入图片描述
翻译下来如下:

字节1		  	字节2~5			字节6
7 6 5……0		31……0			7~1 0
0 1 command		命令参数			CRC 1

①SD卡的指令由6个字节组成,字节1的高两位固定为0 1,低六位为command,后续在代码中会讲到这一点。
②字节2~5为命令参数,需要注意的是,有些命令是没有参数的。
③字节6的高七位为CRC校验值,具体的计算方法有兴趣的可以查一下,挺复杂的,最低一位固定为1。

SD卡的命令总共有12类,有兴趣的可以看看协议文档P20:

在SPI模式下,并不是所有命令都支持,而且可以用的命令也不是都能用上(可参照协议文档P90),从大多数的资料来看,常用的就以下几个(为区分SPI模式还是SDIO模式):

命令			参数					回复			描述
CMD0		无			  		R1			复位SD卡
CMD8		VHS+CHeck pattern	R7			发送接口状态命令(确定工作电平等)
CMD9		无					R1			读取卡特定数据寄存器
CMD10		无					R1			读取卡特定标志寄存器
CMD16		块大小				R1  		设置块大小
CMD17		地址				R1			读取一个块数据
CMD24		地址				R1			写入一个块数据
CMD41		无					R3			发送给主机容量支持信息和激活卡初始过程
CMD55		无					R1			告诉SD卡,下一个是特定应用命令
CMD58		无					R3			读取OCR寄存器

注意:SPI模式下,上面的命令中CMD41命令保留,不被支持,而支持的是ACMD41(A开头的CMD为特定应用程序的命令)
上面的命令中,CMD0、CMD8、CMD16、CMD41、CMD55、CMD58都是初始化中用到的。R1、R3和R7则是卡的回应,他们表示什么意思呢?我们找到SD卡协议文档P95看下:
Response R1:
在这里插入图片描述
Response R3:
在这里插入图片描述
当主机发来CMD58(READ_OCR)命令时,SD卡回复它R3格式数据,R3格式下有5byte,最高位byte为R1格式(如上),后面是四个字节为OCR寄存器值(一个32位的工作条件寄存器,与电压有关,感兴趣的可以看文档P74)。

Response R7:
在这里插入图片描述
当主机发送CMD8命令后,SD卡回复R7格式数据,一样是5byte,最高位byte为R1格式的数据,剩余四位如上图所示。这是检测SD卡是否支持哪个SD卡协议(2.0?1.0?)以及工作电压范围。

  • 12
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RT-Thread是一个实时操作系统,可以在不同的硬件平台上运行。在使用RT-Thread操作系统时,可以使用SD卡接口实现对SD卡数据的读和写。 具体实现的步骤如下: 1. 创建基本工程,包括创建Bootloader和相关组件的配置。 2. 在STM32F4芯片系列中,只支持SD 2.0协议,即SDSDHC。不支持SDXC协议,同时也只支持读取512大小的数据块。因此,在选择SD卡时需要注意其兼容性和数据块大小的设置。 3. SD卡具有物理结构,需要了解其具体规格和连接方式,以确保正确的使用和操作。 4. 在使用RT-Thread操作系统时,可以根据具体的开发板和硬件平台选择合适的驱动和框架,如使用FSMC总线驱动TFT显示屏、SPI驱动W25Qxx Nor flash等。 总之,RT-Thread操作系统提供了对SD卡的支持,可以通过配置和选择合适的驱动和框架来实现对SD卡数据的读和写操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [RT-Thread Studio驱动SD卡](https://blog.csdn.net/weixin_37875741/article/details/109733737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [rt-thread驱动篇(07)---STM32F429单片机SD卡驱动添加](https://blog.csdn.net/m0_37845735/article/details/124548387)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [RT-Thread1.2.0.rar_STM32 RT-Thread_STM32 SPI TF_STM32的SDIO例程_s](https://download.csdn.net/download/weixin_42659252/86145822)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

all of the time

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值