实验内容
掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
一、SD卡协议
(一)、SD卡简介
SD 卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信操作一般有两种通信接口可选,一种是 SPI 接口,另外一种就是 SDIO 接口。SDIO 全称是安全数字输入/输出接口,多媒体卡(MMC)、SD 卡、SD I/O 卡都有 SDIO 接口。STM32F10x 系列控制器有一个 SDIO 主机接口,它可以与 MMC 卡、SD 卡、SD I/O 卡以及CE-ATA 设备进行数据传输。MMC 卡可以说是 SD 卡的前身,现阶段已经用得很少。SD I/O 卡本身不是用于存储的卡,它是指利用 SDIO 传输协议的一种外设。比如 Wi-Fi Card,它主要是提供 Wi-Fi 功能,有些 Wi-Fi 模块是使用串口或者 SPI 接口进行通信的,但 Wi-Fi SDIO Card 是使用 SDIO 接口进行通信的。并且一般设计 SD I/O 卡是可以插入到 SD 的插槽。CE-ATA 是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。 SDIO 接口的设备:
(二)、SD 卡物理结构
一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5 个部分,见下图。存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;卡及接口控制单元控制SD卡的运行状态,它包括有8 个寄存器;接口驱动器控制 SD 卡引脚的输入输出。 SD 卡物理结构: SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息,参考下表。这些寄存器只能通过对应的命令访问,对 SD 卡进行控制操作并不是像操作控制器 GPIO 相关寄存器那样一次读写一个寄存器的,它是通过命令来控制,SDIO 定义了 64 个命令,每个命令都有特殊意义,可以实现某一特定功能,SD 卡接收到命令后,根据命令要求对 SD 卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现 SD 卡的控制以及读写操作。 SD 卡寄存器:
(三)、SD卡总线
1.总线拓扑 SD 卡一般都支持 SDIO 和 SPI 这两种接口,本篇内容只介绍 SDIO 接口操作方式。 SD 卡总线拓扑参考下图。虽然可以共用总线,但不推荐多卡槽共用总线信号,要求一个单独 SD 总线应该连接一个单独的 SD 卡。 SD 卡总线拓扑: SD 卡使用 9-pin 接口通信,其中 3 根电源线、1 根时钟线、1 根命令线和 4 根数据线, 具体说明如下: CLK:时钟线,由 SDIO 主机产生,即由 STM32 控制器输出; CMD:命令控制线,SDIO 主机通过该线发送命令控制 SD 卡,如果命令要求 SD 卡提供应答(响应),SD 卡也是通过该线传输应答信息; D0-3:数据线,传输读写数据;SD 卡可将 D0 拉低表示忙状态; VDD、VSS1、VSS2:电源和地信号。 实际上,SDIO 的通信时序简单许多,SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效。SD 卡操作过程会使用两种不同频率的时钟同步数据,一个是识别卡阶段时钟频率 FOD,最高为 400kHz,另外一个是数据传输模式下时钟频率 FPP,默认最高为 25MHz,如果通过相关寄存器配置使 SDIO 工作在高速模式,此时数据传输模式最高频率为 50MHz。 对于 STM32 控制器只有一个 SDIO 主机,所以只能连接一个 SDIO 设备,开发板上集成了一个 Micro SD 卡槽和 SDIO 接口的 WiFi 模块,要求只能使用其中一个设备。SDIO 接口的 WiFi 模块一般集成有使能线,如果需要用到 SD 卡需要先控制该使能线禁用 WiFi 模块。 2.总线协议 SD 总线通信是基于命令和数据传输的。通讯由一个起始位(“0”),由一个停止位(“1”)终止。SD 通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。SD 总线的基本交互是命令与响应交互。 命令与响应交互: SD 数据是以块(Black)形式传输的,SDHC 卡数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要 CRC 位来保证数据传输成功。CRC 位由 SD卡系统硬件生成。STM32 控制器可以控制使用单线或 4 线传输,本开发板设计使用 4 线传输。下图为主机向 SD 卡写入数据块操作示意。 多块写入操作:
二、基于STM32F103完成对SD卡的数据读取
(一)、创建工程
工程文件如下,请自行下载 链接:https://pan.baidu.com/s/1L5E4BG8cqvpvtDxOdUUXoQ 提取码:e63q
1.打开STM32CUBEMX,选择ACCESS TO MCU SELECTCR创建新项目 2.在Pat Number那输入自己的芯片,我选择的是stm32F103C8, 选中你要的芯片的封装类型,然后点击Start Project 3.cube配置 配置 PA4 引脚为 GPIO_Output,并命名为 SD_CS 进入Project Manager界面输入你的项目名称和你项目保存的地址,将IDE那项改为MDK-ARM
注:项目保存的地址不能有中文,否则会出错
然后点击Generate Code,生成工程文件
(二)、修改代码
提供的工程文件是以修改好了的,详细修改过程请参考: https://blog.csdn.net/qq_39758638/article/details/103573843
代码分析:
(三)、串口烧录
详情请参考: https://blog.csdn.net/lengyuefeng212/article/details/104178386
(四)、结果展示
1.连接方式(供电需5V供电):
STM32F103C8T6 | SD卡 |
---|
PA4 | CS | PA5 | SCK | PA6 | MISO | PA7 | MOSI |
2.打开串口助手,按下RESET按键 3.读取SD卡,打开文本文件 文件写入成功!
三、总结
此次实验操作并不复杂,但其连线需要十分谨慎细致,且需注意硬件供电需要使用5V供电,如果检查了代码、连线接口等所有相关都无问题,但仍无法成功初始化,则应该便是供电问题,这一步我尝试了很久,很神奇的是在一台笔记本电脑上USB供电可以轻易成功实现,但在其他三台笔记本电脑上却无法成功,祝你们好运!(?`・?・′?)
四、参考文献
https://blog.csdn.net/qq_39758638/article/details/103573843 《零死角玩转STM32—F103指南者》
|