STM32CubeMx之SD卡驱动
1.SD卡简介
SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card)格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡。
SD卡具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,它被广泛地应用于便携式装置上,例如数码相机、平板电脑和多媒体播放器等。
SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用 6 线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut 进行数据通信。
SD 方式时的数据传输速度与SPI方式要快,STM32F103ZE自带SDIO接口驱动,4位模式最高速度可达24MHZ,8位总线模式下可达48MHZ,本章节将介绍如何使用HAL库完成对SD卡驱动。
2.SDIO简介
SD/SDIO MMC卡主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、 SD存储卡、 SDIO卡和CE-ATA设备间提供了操作接口。
- SDIO的主要功能如下:
- 与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、 4位和8位。
- 与较早的多媒体卡系统规格版本全兼容(向前兼容)。
- 与较早的多媒体卡系统规格版本全兼容(向前兼容)。
- 与SD存储卡规格版本2.0全兼容。
- 与SD I/O卡规格版本2.0全兼容,支持良种不同的数据总线模式:1位(默认)和4位。
- 完全支持CE-ATA功能(与CE-ATA数字协议版本1.1 全兼容)。
- 8位总线模式下数据传输速率可达48MHz
2.1SDIO总线拓扑
总线上的通信是通过传送命令和数据实现。
在多媒体卡/SD/SD I/O总线上的基本操作是命令/响应结构,这样的总线操作在命令或总线机制下实现信息交换;另外,某些操作还具有数据令牌。
在SD/SDIO存储器卡上传送的数据是以数据块的形式传输;在MMC上传送的数据是以数据块或数据流的形式传输;在CE-ATA设备上传送的数据也是以数据块的形式传输。
- SDIO“无响应”和“无数据”操作
- SDIO(多)数据块读操作
- SDIO(多)数据块写操作
- SDIO(多)数据块写操作
注意:当有Busy(繁忙)信号时, SDIO(SDIO_D0被拉低)将不会发送任何数据。
- SDIO连续读操作
- SDIO连续写操作
2.2 SDIO功能描述
SDIO包含2个部分:
● SDIO适配器模块:实现所有MMC/SD/SDIO卡的相关功能,如时钟的产生、命令和数据的传送。
● AHB总线接口:操作SDIO适配器模块中的寄存器,并产生中断和DMA请求信号。
- SDIO框图
复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度。
如果一个多媒体卡接到了总线上,则SDIO_D0、 SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。 MMC版本V3.31 和之前版本的协议只支持1 位数据线,所以只能用SDIO_D0。
如 果 一 个 SD 或 SDIO 卡 接 到 了 总 线 上 , 可 以 通 过 主 机 配 置 数 据 传 输 使 用 SDIO_D0 或SDIO_D[3:0]。所有的数据线都工作在推挽模式。
SDIO_CMD有两种操作模式:
● 用于初始化时的开路模式(仅用于MMC版本V3.31 或之前版本)。
● 用于命令传输的推挽模式(SD/SD I/O卡和MMC V4.2在初始化时也使用推挽驱动)。
SDIO_CK是卡的时钟:每个时钟周期在命令和数据线上传输1 位命令或数据。对于多媒体卡V3.31 协议,时钟频率可以在0MHz至20MHz间变化;对于多媒体卡V4.0/4.2协议,时钟频率可以在0MHz至48MHz间变化;对于SD或SDIO卡,时钟频率可以在0MHz至25MHz间变化。
SDIO使用两个时钟信号:
● SDIO适配器时钟(SDIOCLK=HCLK)
● AHB总线时钟(HCLK/2)
引脚定义:
引脚 |
定义 |
说明 |
SDIO_CK |
输出 |
多媒体卡/SD/SDIO卡时钟。这是从主机至卡的时钟线。 |
SDIO_CMD |
双向 |
多媒体卡/SD/SDIO卡命令。这是双向的命令/响应信号线。 |
SDIO_D[0:7] |
双向 |
多媒体卡/SD/SDIO卡数据。这些是双向的数据总线。 |
2.3 SDIO适配器
SDIO适配器是多媒体/加密数字存储卡总线的主设备(主机),用于连接一组多媒体卡或加密数字存储卡,它包含以下5个部分:
● 适配器寄存器模块
● 控制单元
● 命令通道
● 数据通道
● 数据FIFO
注意:适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK)。
关于SDIO详细介绍请参考STM32中文手册。
3.SD硬件接口
引脚 |
SDIO |
SPI |
SDIO_D2(PC10) |
数据线 |
|
SDIO_D3(PC11) |
数据线 |
SPI_CS 片选 |
SDIO_CMD(PD2) |
控制线 |
SPI_MOSI主机输出 |
SDIO_SCK(PC12) |
时钟 |
SPI_SCK时钟线 |
SDIO_D0(PC8) |
数据线 |
SPI_MISO主机输入 |
SDIO_D1(PC9) |
数据线 |
4 软件设置
1.芯片选择
2.时钟配置
3.SDIO配置
5 代码生成
1.SD初始化
相关配置可参考STM32中文参考手册_V1.0第20.9.2时钟控制寄存器SDIO_CLKCR。
2.SD读写扇区函数
为了方便后续FATFS文件系统移植,我们这里封装两个函数SD卡写扇区和读扇区。
3.主函数
初始化HAL库、GPIO端口、LCD屏(FSMC驱动)、SD卡初始化;获取卡类型、卡容量,最后调用SD卡读写扇区函数实现数据读写测试。
4.运行效果