添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近在研究STM32F4的SD卡Fatfs文件系统,官方和开发板提供的例程完全可以使用,但是缺少了理论的支持,完全看不懂。所以在网上以及《零死角玩转STM32》上整理了一些SD卡相关的基础知识。

SD卡的分类

目前常用的存储卡按照尺寸可分为SD卡和micro SD卡(TF卡)( 其实种类繁多,我只接触过这两种 ),按照容量可分为标准容量SD(不大于2GB)、高容量SDHC(大于2GB,不大于32GB)和超大容量SDXC(大于32GB,不大于2TB),还可以按照传输速度进行划分,SD2.0规范中分为Class2,Class4,Class6和Class10,SD3.01规范中分为USH-I和USH-II。

其实,了解了SD卡的分类,不同速度等级的应用场景,看懂SD卡上的标识,足可以应付在生活中使用SD卡,例如:行车记录仪要求SD卡的速度等级为Class10。

容量及磁盘格式对照表 容量等级 容量范围 磁盘格式 SD上限至2GBFAT12、FAT16SDHC2GB至32GBFAT32SDXC32GB至2TBexFAT 速度等级及应用范围 速度等级 速度(MB/S 应用范围 Class 0—低于Class 2和未标注Speed Class的情况Class 2最低写入2.0 MB/S观看普通清晰度电视,数码相机连拍Class 4最低写入4.0 MB/S流畅播放高清电视(HDTV),数码相机连拍Class 6最低写入6.0 MB/S单反相机连拍,以及专业设备的使用Class 10最低写入10 MB/S全高清电视的录制和播放UHS-I写入50 MB/S以内,读取104 MB/S以内专业全高清电视实时录制UHS-II写入156 MB/S以内,读取312 MB/S以内未来世界

SD上常见的标识

SD卡引脚

SD卡有9个引脚,TF卡有8个引脚,引脚顺序是面向卡的引脚,左侧第一个是引脚1,依次类推。

CMD:命令控制线,主机通过该线发送控制命令,SD卡也是通过该线传输应答信息。通过管脚的名称可以看出它的功能,下面简单介绍了一下CMD。

SD分为卡识别阶段和数据传输阶段,两个阶段的时钟是有区别的:

  • 识别阶段时钟频率FOD,最高400KHz。
  • 数据传输模式时钟频率FPP,默认最高25MHz

SD卡忙状态通过把D0拉低来表示。

SD卡寄存器

SD卡内部共有8个寄存器,必须通过命令来进行访问,SDIO定义了64个访问SD卡的命令。

SD卡寄存器 名称 Bit 宽度 描述

CID

128

卡识别号(Card Identification)

RCA

16

相对卡地址(Relative Card Address)

DSR

16

驱动级寄存器(Driver Stage Register)

CSD

128

卡的特定数据(Card Specific Data)

SCR

64

SD配置寄存器(SD Configuration Register)

OCR

32

操作条件寄存器(Operation Conditions Register)

SSR

512

SD状态寄存器(SD Status)

CSR

32

卡状态寄存器(Card Status)

SD卡数据包格式

SD卡有常规数据(8bit)和宽位数据(512bit)两种格式的数据包。 它先发低字节再发高字节,而每
个字节则是先发高位再发低位。

SD卡命令

SD命令格式,共计48位。依次为:起始位、传输标志、命令+地址信息/参数、CRC7校验和终止位。

0 1 CONTENT CRC 1
1 1 6+32 7 1

SD卡命令类型有四种:

  • 无响应广播命令(bc),发送到所有卡,不返回任务响应;
  • 带响应广播命令(bcr),发送到所有卡,同时接收来自所有卡响应;
  • 寻址命令(ac),发送到选定卡,DAT线无数据传输;
  • 寻址数据传输命令(adtc),发送到选定卡,DAT线有数据传输;

在标准中定义了两种类型的通用命令:特定应用命令(ACMD)和常规命令(GEN_CMD)

SD卡部分常用命令

命令序号

类型

参数

响应

缩写

描述

基本命令(Class 0

CMD0

bc

[31:0]填充位

GO_IDEL_STATE

复位所有的卡到idle状态

CMD2

bcr

[31:0]填充位

R2

ALL_SEND_CID

通知所有的卡通过CMD线返回CID值。

CMD3

bcr

[31:0]填充位

R6

SEND_RELATIVE_ADDR

通知所有卡发布新RCA。

CMD4

bc

[31:16]DSR[15:0]填充位

SET_DSR

编程所有卡的DSR。

CMD7

ac

[31:16]RCA[15:0]填充位

R1b

SELECT/DESELECT_CARD

选择/取消选择RCA地址卡。

CMD8

bcr

[31:12]保留位

[11:8]VHS

[7:0]检查模式

R7

SEND_IF_COND

发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。

CMD9

ac

[31:16]RCA[15:0]填充位

R2

SEND_CSD

选定卡通过CMD线发送CSD内容。

CMD10

ac

[31:16]RCA[15:0]填充位

R2

SEND_CID

选定卡通过CMD线发送CID内容。

CMD12

ac

[31:0]填充位

R1b

STOP_TRANSMISSION

强制卡停止传输。

CMD13

ac

[31:16]RCA[15:0]填充位

R1

SEND_STATUS

选定卡通过CMD线发送它状态寄存器

CMD15

ac

[31:16]RCA[15:0]填充位

GO_INACTIVE_STATE

使选定卡进入“inactive”状态

面向块的读操作( Class 2

CMD16

ac

[31:0]块长度

R1

SET_BLOCK_LEN

对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。

CMD17

adtc

[31:0]数据地址

R1

READ_SINGLE_BLOCK

对于标准SD卡,读取SET_BLOCK_LEN长度字节的块,对于SDHC卡,读取512字节的块。

CMD18

adtc

[31:0]数据地址

R1

READ_MULTIPLE_BLOCK

连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。

面向块的写操作( Class 4

CMD24

adtc

[31:0] 数据地址

R1

WRITE_BLOCK

对于标准SD卡,写入SET_BLOCK_LEN长度字节的块,对于SDHC卡,写入512字节的块。

CMD25

adtc

[31:0]数据地址

R1

WRITE _ MULTIPLE _BLOCK

连续向SD卡写入数据块,直到被CMD12中断。块长度同CMD17。

CMD27

adtc

[31:0] 填充位

R1

PROGRAM_CSD

对CSD的可编程位进行编程。

擦除命令( Class 5

CMD32

ac

[31:0] 数据地址

R1

ERASE_WR_BLK_START

设置擦除的起始块地址。

CMD33

ac

[31:0]数据地址

R1

ERASE_WR_BLK_END

设置擦除的结束块地址。

CMD38

ac

[31:0] 填充位

R1b

ERASE

擦除预先选定的块。

加锁命令( Class 7

CMD42

adtc

[31:0]保留

R1

LOCK_UNLOCK

加锁/解锁SD卡。

特定应用命令( Class 8

CMD55

ac

[31:16]RCA[15:0]填充位

R1

APP_CMD

指定下个命令为特定应用命令,不是标准命令。

CMD56

adtc

[31:1] 填充位 [0] 读/写

R1

GEN_CMD

通用命令,或者特定应用命令中,用于传输一个数据块,最低位1表示读数据,为0表示写数据。

SD 卡特定应用命令

ACMD6

ac

[31:2] 填充位 [1:0] 总线宽度

R1

SET_BUS_WIDTH

定义数据总线宽度(‘00’=1bit,‘10’=4bit)。

ACMD13

adtc

[31:0] 填充位

R1

SD_STATUS

发送SD状态.

ACMD41

bcr

[31] 保留位 [30] HCS(OCR[30])[29:24] 保留位[23:0]VDD电压(OCR[23:0])

R3

SD_SEND_OP_COND

主机要求卡发送它的支持信息(HCS)和OCR寄存器内容。

ACMD51

adtc

[31:0] 填充位

R1

SEND_SCR

读取配置寄存器SCR.

SD卡有R1、R2、R3、R6、R7这几种响应类型,不同的命令对应的响应类型是不一样的。

SD卡响应类型及格式

R1 (正常响应命令)

描述

起始位

传输位

命令号

卡状态

CRC7

终止位

Bit

47

46

[45:40]

[39:8]

[7:1]

0

位宽

1

1

6

32

7

1

“0”

“0”

X

X

X

“1”

备注

如果有传输到卡的数据,那么在数据线可能有busy信号。

R2 CID CSD 寄存器)

描述

起始位

传输位

保留

[127:1]

终止位

Bit

135

134

[133:128]

127

0

位宽

1

1

6

X

1

“0”

“0”

“111111”

CID或者CSD寄存器[127:1]位的值

“1”

备注

CID寄存器内容作为CMD2和CMD10响应,CSD寄存器内容作为CMD9响应。

R3 OCR 寄存器)

描述

起始位

传输位

保留

OCR寄存器

保留

终止位

Bit

47

46

[45:40]

[39:8]

[7:1]

0

位宽

1

1

6

32

7

1

“0”

“0”

“111111”

X

“1111111”

“1”

备注

OCR寄存器的值作为ACMD41的响应。

R6 (发布的 RCA 寄存器响应)

描述

起始位

传输位

CMD3

RCA寄存器

卡状态位

CRC7

终止位

Bit

47

46

[45:40]

[39:8]

[7:1]

0

位宽

1

1

6

16

16

7

1

“0”

“0”

“000011”

X

X

X

“1”

备注

专用于命令CMD3的响应。

R7 (发布的 RCA 寄存器响应)

描述

起始位

传输位

CMD8

保留

接收电压

检测模式

CRC7

终止位

Bit

47

46

[45:40]

[39:20]

[19:16]

[15:8]

[7:1]

0

位宽

1

1

6

20

4

8

7

1

“0”

“0”

“001000”

“00000h”

X

X

X

“1”

备注

专用于命令CMD8的响应,返回卡支持电压范围和检测模式。

SD卡状态

SD卡的操作模式和状态如下表所示。接下来的两张图片也卡模式和数据传输模式下的状态切换。

SD卡模式及状态 操作模式 SD 卡状态

无效模式(Inactive)

无效状态(Inactive State)

卡识别模式(Card identification mode)

空闲状态(Idle State)

准备状态(Ready State)

识别状态(Identification State)

数据传输模式(Data transfer mode)

待机状态(Stand-by State)

传输状态(Transfer State)

发送数据状态(Sending-data State)

接收数据状态(Receive-data State)

编程状态(Programming State)

断开连接状态(Disconnect State)

现在就可以通过SD卡的状态、模式、命令、响应等信息来仔细阅读STM32的sdio.c文件了。由于我也不太懂所以,还没有具体的内容来提供。接下来我们去看看SD卡是如何Fatfs关联上的。

文件系统Fatfs

在Fatfs下面有diskio.c这个文件,这个文件中定义了五个接口,被ff.c文件调用,ff.c文件提供了open(),close(),write(),read()等等文件系统常用的接口。Fatfs的移植就是主要是更改diskio.c这个文件,通过五个接口来适配不同的存储介质,如SD卡、U盘、Flash等。

  • DSTATUS disk_status (BYTE pdrv);
  • DSTATUS disk_initialize ( BYTE pdrv );
  • DRESULT disk_read (BYTE pdrv, BYTE *buff,DWORD sector, UINT count  );
  • DRESULT disk_write (BYTE pdrv,   const BYTE *buff, DWORD sector, UINT count);
  • DRESULT disk_ioctl (BYTE pdrv, BYTE cmd,void *buff );

在这5个接口中,有一个共同的形参pdrv,他就是不同的存储介质SD卡、U盘、Flash。

ST的例程,开发板的例程,我们完全可以拿来稍加修改就可以使用。我们完全可以不明就里的拿来就用,好用就行,能交差就行,但是不明不白的拿来就用使我心里很不舒服,必须简单的弄明白原理,弄清楚结构,这样除了问题也能更快的定位。上面写了那么多,我也还是没有完全弄明白,随用随学吧!

文章目录1、什么是 SD卡 ?2、SD 存储卡实物图3、SD 存储卡的应用4、SD存储卡特性5、SD存储卡结构6、SD存储卡管脚定义7、SPI方式驱动 SD卡 原理图8、SD 2.0存储卡(SDHC)传输速率级别9、 FA TFS 文件系统 是什么?10、 FA TFS 文件系统 11、 FA TFS 模块的层次结构图12、 FA TFS 文件系统 包13、 FA TFS 文件系统 包结构 1、什么是 SD卡 ?   SD 卡就是 Secure Digital Card 的简称,就是“安全数字卡”,它是由日本 东芝 Toshiba)、松下(Pana 文件系统 提供了组织驱动器的方法。它规定了如何在驱动器上存储数据以及可以附加到文件上的信息类型,包括文件名、权限和其他属性。Windows支持三种不同的 文件系统 ,N TFS 是Windows默认使用的现代化 文件系统 。在安装Windows时,它会使用N TFS 文件系统 格式化您的驱动器。N TFS 的文件和分区大小限制从理论上说非常大,您不会达到这些限制。 FA T32是一种较旧的 文件系统 ,不如N TFS 高效,不支持那么多的功能集,但与其他操作系统相比具有更大的兼容性。 1. SD卡 FA T32 文件系统 快速入门1.1. 理论知识1.1.1. MBR(Main Boot Record) 主引导记录,占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构 1.1.2. DBR(DOS Boot Record) DOS引导记录,为操作系统进入 文件系统 以后可以访问的第一个扇区,通常用来解释 文件系统 ,DBR是由硬盘的MBR装载的程序段。D FA T16(File Allocation Table 16): FA T16是比较传统的 文件系统 ,最早用于DOS操作系统。它支持最大2GB的存储容量,文件名最长为8个字符并且不支持长文件名。 目录一、主引导扇区二、什么是 文件系统 ?三、对 FA T32的简单介绍 1.保留区 2. FA T表 3.数据区四、总结 最近的项目用到了 SD卡 数据读取,了解 FA T32系统着实恶心了我一下,分享一下自己的笔记。 u 盘,sd 卡等小容量存储介质不存在仔细的 分区。但是 在 文件系统 初始化的开始我们必须通过 MBR 获取分区表项的数据,以获得 CHS、LBA 参数以及分区大小扇区 数,从而得到 文件系统 的起始物理扇区号。 Microsoft 将使用 DOC 分区体系的磁 文件系统 是操作系统用于明确存储设备或分区上的文件的方法和数据结构(即在存储设备上组织文件的方法)。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称 文件系统 ;不带 文件系统 SD卡 仅能实现简单的读写扇区操作,要真正应用 SD卡 必须要使用 文件系统 FA TFS 文件存储原理(以 FA T32为例),下图为 FA T32 文件系统 布局:分区空间大小簇空间大小每个簇包含的扇区数< 8GB4KB88KB1616KB32>= 32GB32KB64。 跟在FLASH上挂载 FA T32 文件系统 一样,只需要底层提供给 Fa tFs 组件层一些数据操作的相关接口函数(放在bsp板级支持包里,即 SD卡 初始化、读状态、数据擦除、数据读写),然后修改diskio.c的具体内容,包括以下几个函数,以适应用户层对文件的操作。 在嵌入式系统中, SD卡 是一种常用的外部存储设备。 FA TFS 是一个广泛应用于嵌入式系统的开源 文件系统 ,它提供了简单易用的API接口,可以轻松地在嵌入式系统中实现 文件系统 功能。通过以上示例代码,我们实现了在嵌入式系统中使用 FA TFS 文件系统 进行文件的创建、写入和读取操作。当然, FA TFS 还提供了更多的API接口,例如目录的创建和遍历等功能,可以根据具体需求选择相应的接口进行使用。上述代码中,我们首先包含了 FA TFS 的头文件,并定义了 FA TFS 和FIL结构体。函数中,我们进行了 SD卡 接口的初始化,并使用。