STM32F407之SD卡读数据介绍

1,SD卡基础知识

SD卡(Secure Digital Memory Card)即:安全数字存储卡,它是在MMC的基础上发展而来,作为存储器件广泛应用于电子产品中。

1.1  SD卡有SDIO和SPI两种传输方式,具体信号定义如下:

STM32F407之SD卡读数据介绍_第1张图片

其中红色选中的信号是必需的。

1.2   SD卡的内部结构

STM32F407之SD卡读数据介绍_第2张图片1.3  SD中的两个重要概念: Sector与Block

 

Sector:  A number of blocks, basic erase unit (SD擦除单位)

可以设置为N*block。

Block :   A number of bytes, basic data transfer unit (SD中最小的读写单位)。

block length 可以被 SET_BLOCKLEN (CMD16)设置 。

1.4 SD 常用命令

Class0 :(卡的识别、初始化等基本命令集)

CMD0:复位SD 卡.

CMD1:读OCR寄存器.

CMD9:读CSD寄存器.

CMD10:读CID寄存器.

CMD12:停止读多块时的数据传输

CMD13:读 Card_Status 寄存器

Class2 (读卡命令集):

CMD16:设置块的长度

CMD17:读单块.

CMD18:读多块,直至主机发送CMD12为止 . 

Class4(写卡命令集) :

CMD24:写单块.

CMD25:写多块.

CMD27:写CSD寄存器 .

Class5 (擦除卡命令集):

CMD32:设置擦除块的起始地址.

CMD33:设置擦除块的终止地址.

CMD38: 擦除所选择的块.

2,STM32读取SD流程

STM32的SDIO接口提供 APB2 外设总线与多媒体卡 (MMC)、SD 卡、SDIO 卡以及 CE-ATA 设备之间的接口。

2.1 时钟

三个时钟信号:卡时钟SDIO_CK(传输速率0-25MHZ)、SDIO适配器时钟SDIOCLK(用于驱动适配器来产生卡时钟,与所挂载的总线时钟相同)、总线时钟PCLK2(F1为HCLK2)

   SDIO_CK计算公式:SDIO_CK=SDIOCLK/(2+CLKp)   CLKp为可配置的分频系数,在初始化时不可以超过400khz ,初始化完成后可全速运行。

2.2 操作流程

A, 初始化相关 GPIO 及 SDIO 外设;

B, 配置 SDIO 基本通信环境进入卡识别模式,通过几个命令处理后得到卡类型;

C,  如果是可用卡就进入数据传输模式,接下来就可以进行读、写、擦除的操作。

2.3  SD 卡初始化

SD 卡初始化过程主要是卡识别和相关 SD 卡状态获取。整个初始化函数流程如下:

STM32F407之SD卡读数据介绍_第3张图片

具体执行流程如下:

 

(1) 配置 NVIC,SD 卡通信用到 SDIO 中断,如果用到 DMA 传输还需要配置 DMA 中 断。注意中断服务函数不是定义在 stm32f4xx_it.c 文件的,是直接定义在 bsp_sdio_sd.c 文件中,中断服务函数定义在个文件问题都不大,只要定义正确就 可以的,编译器会自动寻找。 (2) 执行 SD_LowLevel_Init 函数,其功能是对底层 SDIO 引脚进行初始化以及开启相 关时钟,该函数在之前已经讲解。

(3) SDIO_DeInit 函数用于解除初始化 SDIO 接口,它只是简单调用 SD_LowLevel_DeInit 函数。而 SD_LowLevel_DeInit 函数是与 SD_LowLevel_Init 函数相反功能,关闭相关时钟,关闭 SDIO 电源,让 SDIO 接近上电复位状态。 恢复复位状态后再进行相关配置,可以防止部分没有配置的参数采用非默认值而 导致错误,这是 ST 官方驱动常用的一种初始化方式。 

(4) 调用 SD_PowerON 函数,它用于查询卡的工作电压和时钟控制配置,并返回 SD_Error 类型错误。

2.4 SD卡读操作

从 SD 卡读取数据可分为单块读取和多块读取。这里介绍单块读操作流程。

SD_ReadBlock 函数执行流程如下: 

(1) 将 SDIO 外设的数据控制寄存器 (SDIO_DCTRL)清理,复位之前的传输设置。 

(2) 调用 SDIO_ITConfig 函数使能相关中断,包括数据 CRC 失败中断、数据超时中断、数 据结束中断等等。然后调用 SD_LowLevel_DMA_RxConfig 函数,配置使能 SDIO 从 SD 卡的读取数据的 DMA 请求。为使 SDIO 发送 DMA 请求,需要调用 SDIO_DMACmd 函数使能。对于高容量的 SD 卡要求块大小必 须为 512 字节,程序员有责任保证目标读取地址与块大小的字节对齐问题。 

(3) 对 SD 卡进行数据读写之前,都必须发送 CMD16 指定块的大小,对于标准卡,读取 BlockSize 长度字节的块;对于 SDHC 卡,读取 512 字节的块。 

(4) 利用 SDIO_DataInitTypeDef 结构体类型变量配置数据传输的超时、块数量、数据块大 小、数据传输方向等参数并使用 SDIO_DataConfig 函数完成数据传输环境配置。 

(5) 最后控制器向 SD 卡发送单块读数据命令 CMD17,SD 卡在接收到命令后就会通过数据线把数据传输到控制器数据 FIFO 内,并自动生成 DMA 传输请求。

(6)SD_WaitReadOperation 函数用于等待数据读取操作完成,只有在确保数据读取完成了,我们就可以放心使用数据。

对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)

 

你可能感兴趣的:(stm32,单片机,嵌入式硬件)