1,SD卡基础知识
SD卡(Secure Digital Memory Card)即:安全数字存储卡,它是在MMC的基础上发展而来,作为存储器件广泛应用于电子产品中。
1.1 SD卡有SDIO和SPI两种传输方式,具体信号定义如下:
其中红色选中的信号是必需的。
1.2 SD卡的内部结构
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 卡状态获取。整个初始化函数流程如下:
具体执行流程如下:
(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 函数用于等待数据读取操作完成,只有在确保数据读取完成了,我们就可以放心使用数据。
对嵌入式物联网感兴趣的小伙伴,可以多了解一下相关信息。(看过来)