STM32F103最小板完成对SD卡的数据读取(fat文件模式)

目录

一、SD卡协议原理介绍

1、SD卡简介

2、SDIO设备分类

3、SD卡物理结构

4、SD卡寄存器

5、SD模式

驱动模式

传输模式

二、 实现对SD卡的数据读取

1、硬件准备

2、芯片模块与SD卡模块连线

3、HAL库文件配置 

4、代码编辑及改写 

5、结果展示

 三、相关问题说明及解决办法

1、SD卡初始化失败

2、无反应(长时间处于main)

3、成功运行,但文本显示乱码

四、总结 

五、参考资料


一、SD卡协议原理介绍

1、SD卡简介

下列内容参考百度百科。

     SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡。

     SD卡具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,它被广泛地应用于便携式装置上,例如数码相机、平板电脑和多媒体播放器等。

SD卡的结构能保证数字文件传送的安全性,也很容易重新格式化,所以有着广泛的应用领域。音乐、电影等多媒体文件都可以方便地保存到SD卡中。目前市场上SD卡的品牌很多诸如:SANDISKKingmaxPanasonicKingston

     SD卡作为一种新型的存储设备,具有以下特点: 

●高存储容量,最常用的容量:8GB、16GB、32GB、128GB、256GB等。

●内置加密技术,适应基于SDMI协议的著作版权保护功能。

●高速数据传送;最大读写速率为100MB/s。

●体积轻小,便于携带,具有很强的抗冲击能力。

2、SDIO设备分类

                            

     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卡规范版本最新是4.01版本,但STM32F42x系列(F1系列也一样)控制器只支持SD卡规范版本2.0,即只支持标准容量SD和高容量SDHC标准卡,不支持超大容量SDXC标准卡,所以可以支持的最高卡容量是32GB。

3、SD卡物理结构

一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。

                                

SD卡接口除了保留MMC卡的7针外,还在两边加多了2针,作为数据线。 

在SD卡3.0规范中,SD卡的理论最大容量可达2TB,理论最大读写速度可达104MB/s(在最新的4.10规范中,理论最大读写速度已提高到312MB/s)。 

SD卡主要分为四部分组成:外部引脚、内部寄存器接口控制器和内部存储介质。

引脚

SD卡主要引脚和功能描述如下: 

  • CLK:时钟信号,控制器或者SD卡在每个时钟周期传输一个命令位或数据位,在SD总线的默认速度模式下频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率,在UHS-I速度模式下,时钟频率最高可达208M。 

  • CMD:命令和响应复用引脚,命令是由控制器发给SD卡,可以是从控制器到单个SD卡,也可以是到SD总线上所有卡;响应是存储卡对控制器发送的命令应答,应答可以来自单卡或所有卡。

  • DAT0~3:数据线,数据可以从卡传向控制器也可以从控制器传向卡。

 4、SD卡寄存器

寄存器及功能描述如下:

  • OCR(Operating Conditions Register)寄存器:32位的操作条件寄存器主要存储了VDD电压范围,SD卡操作电压范围为2~3.6V。

  • CID(Card IDentification Register)寄存器:卡识别码寄存器,长度为16个字节,存储SD卡唯一标识号,该号在卡生产厂家编程后无法修改。 

  • CSD(Card-Specific Data Register)寄存器:卡特性数据寄存器,包含了访问该卡数据时的必要配置信息。

  • SCR(SD Card Configuration Register)寄存器:SD卡配置寄存器(SCR),提供了SD卡的一些特殊特性在这张卡内,长度为64位,这个寄存器内容由制造商在生产厂内设置。 

  • RCA(Relative Card Address)寄存器:卡相对地址寄存器是一个16位可写的地址寄存器,控制器可通过地址选择对应地址的SD卡。 

  • DSR(Driver Stage Register)寄存器:驱动级寄存器,属于可选寄存器,用于配置卡的驱动输出。

5、SD模式

驱动模式

SD卡有两种驱动模式:SPI模式与SDIO模式。它们所使用的接口信号是不同的。在SPI模式下,只会用到SD卡的4根信号线,即CS、DI、SCLK与DO(分别是SD卡的片选、数据输入、时钟与数据输出)。 [4]




传输模式

SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出),1位SD模式(独立指令和数据通道,独有的传输格式),4位SD模式(使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)。 

SD卡三种模式的针脚定义: 

针脚

4位SD模式

1位SD模式

SPI模式

名称

描述

名称

描述

名称

描述

1

CD/DAT3

卡监测/数据位3

CD

卡监测

CS

芯片选择

2

CMD

命令/回复

CMD

命令/回复

DI

数据输入

3

VSS1

VSS1

VSS1

4

VCC

电源

VCC

电源

VCC

电源

5

CLK

时钟

CLK

时钟

CLK

时钟

6

VSS2

VSS2

VSS2

7

DAT0

数据位0

DAT

数据位

DO

数据输出

8

DAT1

数据位1

RSV

保留

RSV

保留

9

DAT2

数据位2

RSV

保留

RSV

保留

低速卡通常支持0~400千比特/秒数据传输率,采用SPI和1位SD传输模式。高速卡支持0~100兆比特/秒数据传输率,采用4位SD传输模式;支持0–25兆比特/秒,采用SPI和1位SD模式。 

针对制造商、销售商和主机适配器生产商需要缴纳SD/SDIO授权费,每年1000美元外加1500美元的会员费。但SDIO卡和MMC适配器生产商无需授权费。MMC卡使用7针接口,SD卡和SDIO卡采用了9针接口。 

更多的关于SD卡协议原理及其介绍可参照资料:

SD卡协议简介_m0_53089598的博客-CSDN博客

二、 实现对SD卡的数据读取

1、硬件准备

SD卡模块及SD卡

                                         

STM32F103最小板:

查看源图像

2、芯片模块与SD卡模块连线

stm32SD卡模块
PA4SDCS
PA5SCK
PA7MOSI
PA6MISO
VCCVCC
GNDGND

3、HAL库文件配置 

打开stm32CubeMX,选择STM32F103C8t6芯片,配置相应文件。

 

 选择文件的保存位置,及工程命名,完成。

4、代码编辑及改写 

这里推荐直接打开源码,因为后面需要添加一些文件,以及相应函数的修改。

main函数:

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration---------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_FATFS_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); 	//enable uart	
	printf(" main \r\n");
	Get_SDCard_Capacity();	//得到使用内存并选择格式化
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN 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 > 10)
		{	
			printf(" while \r\n");
			HAL_Delay(500);
		}		
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 这里就不过多展示代码,后面我会给出完整的工程代码。可以参考里面的内容

5、结果展示

我们可以看出,当烧录完毕后,插入串口,会开始进行SD文件读取。

用读卡器读取SD卡,打开SD卡文件,查看其中的内容。

STm

 三、相关问题说明及解决办法

1、SD卡初始化失败

     当我们烧录好文件时,连接硬件至电脑串口,会发现一直出现初始化失败,导致的原因是stm32芯片的供电不足,导致SD卡模块无法正常工作。

解决办法:将stm32与SD卡模块都接上5v的电压,可以采用传统非type-c接口手机充电器对STm32供电,SD卡模块接STM32的5v引脚;也可以采用多个串口模块,对SD卡和stm32芯片分别供电。

2、无反应(长时间处于main)

  与上面不同,当一直处于main状态时,可能出现的原因为连接没有接好,或者是由于代码的原因,代码中会对SD卡进行格式化,有可能便是正处于格式化的过程中,这个过程一般比较长。不过以我的亲身经历来看,多半还是电压的问题,你需要重新检查你模块的电压。

3、成功运行,但文本显示乱码

当我们成功运行时,打开生成的hello文件,发现会出现乱码

将上面的sizeof改为strlen。

若不想出现显示的序号,直接将上面的WriteBuffer函数注释掉即可。

四、总结 

     本次实验在原理上并没有多难,但难的是硬件模块的实现,做了很多次尝试,每次都是以失败告终,也是折磨了我很久,但后来还是坚持不懈,将实验完成。

这里再次提醒,一定要注意硬件的线路连接问题,真的是很影响心态。最后,祝好运。

五、参考资料

https://blog.csdn.net/m0_53089598/article/details/121985861

https://blog.csdn.net/qq_46467126/article/details/122033766

完整工程链接:

链接:https://pan.baidu.com/s/1uYg6ZmgeD-HkZS05dq9Chw 
提取码:flma

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值