IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> SD卡数据读取 -> 正文阅读

[嵌入式]SD卡数据读取

本文使用到的硬件:STM32F103C8T6、Micro SD卡模块CH376S SPI接口、杜邦线、USB转TTL接口
本文使用到的软件:Keil MDK、串口调试助手


一、SPI读写SD卡介绍

SPI外设只具有两条数据线MISO和MOSI,分别用作数据的输入和输出,由于引脚较少,所以控制相对较容易。
在这里插入图片描述

1.1 SPI模式

在SPI模式下,数据都是以 字节(Byte)为单位进行传输的。此时SD卡作为从机设备,一般的操作是MCU发送带有参数的命令,SD卡接收到命令和参数后进行操作,并且返回响应,MCU根据返回的响应进行下一步操作。

在这里插入图片描述

1.2 命令

SD卡的命令有6个字节(48位),由以下几部分组成:
第一字节的最高位b7为起始位,始终为0
接下来为传输位,始终为1
b5-b0为命令代码
第2~5字节为命令的参数,共4个字节
最后一个字节的前7为CRC7校验位,最后一位为停止位,始终为1

常用命令:

命令参数响应类型简写描述
CMD00R1GO_IDLE_STATE软件复位
CMD8(*1)R7SEND_IF_COND发送MCU的电压范围,检测SD卡是否满足MCU的电压范围
ACMD41(*2)(*3)R1SD_SEND_OP_COND开始SD卡初始化和检测SD卡是否完成初始化
CMD90R1SEND_CSD读取CSD寄存器的值
CMD100R1SEND_CID读取CID寄存器的值
CMD120R1bSTOP_TRANSMISSION停止读取操作
CMD16数据块长度[31:0]R1SET_BLOCKLEN设置数据块长度(*4)
CMD17地址[31:0]R1READ_SINGLE_BLOCK读取单个数据块
CMD18地址[31:0]R1READ_MULTIPLE_BLOCK读取多个块数据
CMD24地址[31:0]R1WRITE_BLOCK写单个块数据
CMD25地址[31:0]R1WRITE_MULTIPLE_BLOCK写多个块数据
CMD550R1APP_CMD定义下一条命令为ACMD命令
CMD580R3READ_OCR读取OCR寄存器

1.3 初始化操作

SPI模式下的初始化操作有:上电->进入SPI模式(CMD0)->检测当前MCU电压是否符合SD卡的要求(CMD8)->开始初始化(ACMD41)->读取卡类型(CMD58)

初始化过程中,SD卡时钟信号周期需为100KHz~400KHz之间,不能大于400KHz。

  • 上电

    当电压达到SD卡的最小工作电压的后,MCU必须使CS,DI为高电平,输出最少74个时钟脉冲后,才能开始发送第一个命令。

  • 初始化过程

    SD卡上电后处于SD Bus模式,使CS保持为0,并且发送CMD0命令,SD卡就会进入到SPI模式。在SPI模式下,命令的CRC校验功能默认是禁止的(CMD8命令除外),但是发送第一个CMD0命令时,SD卡是处于SD Bus模式,该模式下CRC校验功能是启动的,因此第一个CMD0命令必须要有正确的CRC校验。正确的CMD0命令应为:0x40, 0x00, 0x00, 0x00, 0x00, 0x95。

    CMD8用于检测SD卡接口电压是否满足要求,该命令的参数包括当前MCU接口的电压范围VHS([11:8]),以及用于检测通信的Check Pattern([7:0])。如果SD卡能满足当前MCU的接口电压,它就会返回VHS和Check Pattern的值。需要注意的是,CMD8的CRC校验值必须正确,假如CRC校验不对,SD卡返回的R1值中的CRC错误位就会置1。
    ACMD41命令用于开始初始化SD卡及检测其是否完成初始化。该命令的参数HCS([30])表示MCU是否支持SDHC和SDXC,若支持HCS置1,反之置0。如果ACDM41命令返回R1的值为0x01,说明SD卡正在初始化,MCU需要重复发送ACMD41,直到返回值R1为0。
    初始化完成后,通过发送CMD58指令读取卡的类型(OCR寄存器的CCS位[30]), CCS为1表示当前卡的类型为SDXC或者SDHC,为0表示卡的类型为SDSC。

在这里插入图片描述

1.4 读写数据(多数据)

  • 读取数据
    读取多个数据块操作和读取单个数据块的相似,先发送命令CMD18,然后开始等待数据块的起始标识符。需要停止读取操作时,发送CMD12命令,返回响应为0表示SD卡处于忙碌状态,只有返回任何不为0的值后,MCU才能发送下一条命令。
    在这里插入图片描述

  • 写入数据
    当SD卡接收到写入多个数据块命令CMD25后,发送数据包起始符为(0xFC), 只有当DO不为0时,才能继续发送第二个数据包。如果要结束写入操作,则发送停止发送标识符(0xFD)
    在这里插入图片描述

二、实验配置

2.1 源代码

链接:https://pan.baidu.com/s/1lXiepBi4sLZra6uo3yJgOw
提取码:dnjs

2.2 硬件连线

STM32SD卡模块
PA4SDCS
PA5SCK
PA7MOSI
PA6MISO
VCCVCC
GNDGND

2.3 部分代码分析

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(" mian \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 */
}

  • WritetoSD(WriteBuffer,sizeof(WriteBuffer));
    写入SD卡程序,我们可以在文件的开始定义我们要写入SD卡的内容
    在这里插入图片描述
  • SD_init();
    SD初始化函数,完成发送命令及鉴别SD卡
    在这里插入图片描述
  • while
    在这里插入图片描述
    write_cnt>10,write_cnt我们设置的初始值为0,表示当写入的次数达到11次我们就不再写入,输出while表示写入完成。

三、实验结果分析

  • 烧录成功

在这里插入图片描述

  • 初始化及写入SD卡成功

在这里插入图片描述

  • 查看文档
    在这里插入图片描述

四、总结

注意在接线时一定要保证5V电压,否则无法初始化,只可以完成烧录程序。虽然得到了最终结果,但理解原理是最重要的。


参考文章:
https://www.cnblogs.com/mr-bike/p/3546228.html
https://blog.csdn.net/qq_46467126/article/details/122033766
https://blog.csdn.net/IssacMi/article/details/102785961

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:21:45  更:2021-12-26 22:22:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:30:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码