嵌入式系统作业12(SD卡读取)

掌握 SD 卡协议原理,用 STM32F103 完成对 SD 卡的数据读取(FAT文件模式)。

目录

一、SD 卡协议

1. SD 卡

SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备,由于它体积小、数据传输速度快、可热插拔等优良的特性,被广泛地于便携式装置上使用,例如数码相机、平板电脑和多媒体播放器等。

概述

SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡。
SD卡具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,它被广泛地应用于便携式装置上,例如数码相机、平板电脑和多媒体播放器等。
SD卡的结构能保证数字文件传送的安全性,也很容易重新格式化,所以有着广泛的应用领域。音乐、电影等多媒体文件都可以方便地保存到SD卡中。目前市场上SD卡的品牌很多诸如:SANDISK、Kingmax、Panasonic和Kingston。
SD卡作为一种新型的存储设备,具有以下特点:
**●高存储容量:**最常用的容量:8GB、16GB、32GB、128GB、256GB等。
**●内置加密技术:**适应基于SDMI协议的著作版权保护功能。
**●高速数据传送:**最大读写速率为100MB/s。
**●体积轻小:**便于携带,具有很强的抗冲击能力。

  • 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 是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。

2. SD 卡总线

SD 卡一般都支持 SDIO 和 SPI 这两种接口。
STM32F42x 系列控制器的 SDIO 是不支持 SPI 通信模式的,如果需要用到 SPI 通信只能使用 SPI 外设。
具体的 SPI 通信方式可以参看我之前的博客:基于 SPI 协议用 0.96 寸 OLED 显示汉字及温湿度数据
SD 卡使用 9-pin 接口通信,其中 3 根电源线、1 根时钟线、1 根命令线和 4 根数据线。
《嵌入式系统作业12(SD卡读取)》
SDIO 的通信时序要简单许多,SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效。

协议

通讯由一个起始位(“0”),由一个停止位(“1”)终止。SD 通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。
SD 总线的基本交互是命令与响应交互。
SD 数据是以块(Black)形式传输的,SDHC 卡数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要 CRC 位来保证数据传输成功。CRC 位由 SD 卡系统硬件生成。STM32 控制器可以控制使用单线或 4 线传输。
主机向 SD 卡写入数据块操作示意如下:
《嵌入式系统作业12(SD卡读取)》

命令

《嵌入式系统作业12(SD卡读取)》

SD 命令由***主机***发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)

响应

响应由*** SD 卡向主机***发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈 SD 卡的状态。
SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。

3.STM32 的 SDIO 功能

STM32 控制器有一个 SDIO,由两部分组成:SDIO 适配器和 AHB 接口。

  • SDIO 适配器提供 SDIO 主机功能,可以提供 SD 时钟、发送命令和进行数据传输。
  • AHB 接口用于控制器访问 SDIO 适配器寄存器并且可以产生中断和 DMA 请求信号
    《嵌入式系统作业12(SD卡读取)》

二 、SD 卡的数据读取(工程、代码)

1. 创建项目

其实直接打开压缩文件的工程,然后生成代码就行了
(下面还是加了几张工程截图)
《嵌入式系统作业12(SD卡读取)》
《嵌入式系统作业12(SD卡读取)》
《嵌入式系统作业12(SD卡读取)》
《嵌入式系统作业12(SD卡读取)》
配置 PA4 引脚为 GPIO_Output,并命名为 SD_CS
《嵌入式系统作业12(SD卡读取)》

2.代码文件

代码网盘链接
**提取码:e63q **
《嵌入式系统作业12(SD卡读取)》
修改main.c 中 while循环

while (1)
  { 
		
		
		
		WritetoSD(WriteBuffer,sizeof(WriteBuffer));		
 
		
		
		HAL_Delay(500);
		/*WriteBuffer[0] = WriteBuffer[0] +10; WriteBuffer[1] = WriteBuffer[1] +10;*/
		write_cnt ++;
		
		while(write_cnt > 0)
		{ 	
			printf(" while \r\n");
			HAL_Delay(500);
		}		

《嵌入式系统作业12(SD卡读取)》

三、SD卡数据读取(电路,实现)

1.电路连接

STM32F103C8T6SD卡
PA4CS
PA5SCK
PA6MISO
PA7MOSI

按如图所示找到对应引脚进行连接
《嵌入式系统作业12(SD卡读取)》
《嵌入式系统作业12(SD卡读取)》

2. 注意事项

在读卡前先格式化一下选择FAT模式
《嵌入式系统作业12(SD卡读取)》

不要在运行过程中拔卡
否者会失败
《嵌入式系统作业12(SD卡读取)》

  • 注意:
    SD 卡操作需要时间,得等一会,如果串口一直没有回应,可以试试以下操作:
    可以将SD卡换成内存小点的 4G/8G
    将最小核心板连接 5V,为其供给高电压
    尽量减少连线,或者使用短线连接

3.结果展示

编译烧录后,打开串口调试助手,可以看到:
《嵌入式系统作业12(SD卡读取)》
然后会显示while
《嵌入式系统作业12(SD卡读取)》
此时将SD卡从芯片中拔出,插入U盘,在电脑中可以看见有一个txt文件,打开可以看见。
《嵌入式系统作业12(SD卡读取)》

四、总结

这次实验不是很好做,虽然能够成功烧录,但是实验效果不容易出来,串口调试助手一直没显示,多尝试一下,看看有没有线没有连稳,或者芯片接触 不良。有时候是串口反应较慢,耐心等待一会或许会有结果读出。

    原文作者:ANK空檩
    原文地址: https://blog.csdn.net/qq_58222379/article/details/122057103
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞