文章目录

  • 一. 认识SD卡
    • 1. 介绍SD卡
    • 2. SD卡的物理结构
    • 3. SD卡寄存器
    • 4. SD卡模式
    • 5. 初始化SD卡过程
    • 6. SD卡读取数据
  • 二. 实验操作——对SD卡进行数据读取
    • 1. 硬件准备
    • 2. 新建工程
    • 3. 代码部分
    • 4. 烧录程序
    • 5. 实验结果分析
  • 三. 总结
  • 四. 参考资料

一. 认识SD卡

1. 介绍SD卡

SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备,由于它体积小、数据传输速度快、可热插拔等优良的特性,被广泛地于便携式装置上使用,例如数码相机、平板电脑和多媒体播放器等。
控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是 SPI接口,另外一种就是 SDIO接口。

2. SD卡的物理结构

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

  • 存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
  • 电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
  • 卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;
  • 接口驱动器控制SD卡引脚的输入输出。

3. SD卡寄存器

SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

  • 寄存器及功能描述如下
寄存器名称 描述
OCR 32位的操作条件寄存器主要存储了VDD电压范围,SD卡操作电压范围为2~3.6V
CID 卡识别码寄存器,长度为16个字节,存储SD卡唯一标识号,该号在卡生产厂家编程后无法修改
CSD 卡特性数据寄存器,包含了访问该卡数据时的必要配置信息
SCR SD卡配置寄存器(SCR),提供了SD卡的一些特殊特性在这张卡内,长度为64位,这个寄存器内容由制造商在生产厂内设置
RCA 卡相对地址寄存器是一个16位可写的地址寄存器,控制器可通过地址选择对应地址的SD卡
DSR 驱动级寄存器,属于可选寄存器,用于配置卡的驱动输出
SSR SD状态(SD Status):SD卡专有特征的信息
CSR 卡状态(Card Status):卡状态信息

4. SD卡模式

  • SD卡的操作模式:SD卡模式(SDIO)SPI模式(默认为SD模式)
    其中SD卡模式的信号线有:CLK、CMD、DAT0-DAT3,6根线。
    SPI模式的信号线有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根线。
  • SD卡的命令格式:
    命令CMD0就是0,CMD16就是16,以此类推。
    SPI命令格式为6字节构成,高位在前(MSB)。
  • 引脚分布如下:
  • SD卡的主要引脚功能
引脚 功能
CLK 时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz 的频率
CMD 双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡
DAT0~3 数据线,数据可以从卡传向主机也可以从主机传向卡

5. 初始化SD卡过程

SPI操作模式下:在SD卡收到复位命令时,CS为有效电平(低电平),则SPI模式被启用,在发送CMD之前要先发送74个时钟,64个为内部供电上升时间,10个用于SD卡同步;之后才能开始CMD操作,在初始化时CLK时钟不能超过400KHz。

  1. 初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置);
  2. 上电延时(>74个CLK);
  3. 复位卡(CMD0),进入IDLE状态;
  4. 发送CMD8,检查是否支持2.0协议;
  5. 根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
  6. 取消片选,发多8个CLK,结束初始化
  • SD卡初始化流程图:

6. SD卡读取数据

这里通过CMD17来实现,具体过程如下:

  1. 发送CMD17;
  2. 接收卡响应R1;
  3. 接收数据起始令牌0XFE;
  4. 接收数据;
  5. 接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
  6. 禁止片选之后,发多8个CLK.

二. 实验操作——对SD卡进行数据读取

1. 硬件准备

  • SD卡

    注意:VCC要接5V!!!
  • 硬件连接方式
stm32 SD卡模块
PA4 SDCS
PA5 SCK
PA6 MISO
PA7 MOSI
VCC VCC
GND GND
  • 连接图

2. 新建工程

详细的工程文件获取链接:https://pan.baidu.com/s/1MFVI8M022kbmuOlGbAl6aw
提取码:xhc1

CubeMX相关配置

  • SPI1选择全双工模式

  • USART1选择异步模式

  • FATFS中勾选User-defined

  • 时钟设置

  • 生成工程

3. 代码部分

int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, 0xFFFF);   return ch;
}
uint16_t uart_value[3];
uint8_t aRxBuffer1; //uart rx buff void WritetoSD(BYTE write_buff[],uint8_t bufSize);
char SD_FileName[] = "hello.txt";
uint8_t WriteBuffer[] = "01 write buff to sd \r\n";//uint8_t test_sd =0;    //用于测试格式化
uint8_t write_cnt =0;  //写SD卡次数void WritetoSD(BYTE write_buff[],uint8_t bufSize)
{FATFS fs;FIL file;uint8_t res=0;UINT Bw;  res = SD_init();       //SD卡初始化if(res == 1){printf("SD卡初始化失败! \r\n");      }else{printf("SD卡初始化成功! \r\n");        }res=f_mount(&fs,"0:",1);        //挂载//  if(test_sd == 0)      //用于测试格式化if(res == FR_NO_FILESYSTEM)      //没有文件系统,格式化{//      test_sd =1;                //用于测试格式化printf("没有文件系统! \r\n");      res = f_mkfs("", 0, 0);      //格式化sd卡if(res == FR_OK){printf("格式化成功! \r\n");     res = f_mount(NULL,"0:",1);      //格式化后先取消挂载res = f_mount(&fs,"0:",1);            //重新挂载  if(res == FR_OK){printf("SD卡已经成功挂载,可以进进行文件写入测试!\r\n");}  }else{printf("格式化失败! \r\n");      }}else if(res == FR_OK){printf("挂载成功! \r\n");       }else{printf("挂载失败! \r\n");}  res = f_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);if((res & FR_DENIED) == FR_DENIED){printf("卡存储已满,写入失败!\r\n");      }f_lseek(&file, f_size(&file));//确保写词写入不会覆盖之前的数据if(res == FR_OK){printf("打开成功/创建文件成功! \r\n");        res = f_write(&file,write_buff,bufSize,&Bw);       //写数据到SD卡if(res == FR_OK){printf("文件写入成功! \r\n");            }else{printf("文件写入失败! \r\n");}     }else{printf("打开文件失败!\r\n");} f_close(&file);                     //关闭文件      f_mount(NULL,"0:",1);      //取消挂载}void Get_SDCard_Capacity(void)
{FRESULT result;FATFS FS;FATFS *fs;DWORD fre_clust,AvailableSize,UsedSize;  uint16_t TotalSpace;uint8_t res;res = SD_init();       //SD卡初始化if(res == 1){printf("SD卡初始化失败! \r\n");      }else{printf("SD卡初始化成功! \r\n");        }/* 挂载 */res=f_mount(&FS,"0:",1);        //挂载if (res != FR_OK){printf("FileSystem Mounted Failed (%d)\r\n", result);}res = f_getfree("0:", &fre_clust, &fs);  /* 根目录 */if ( res == FR_OK ) {TotalSpace=(uint16_t)(((fs->n_fatent - 2) * fs->csize ) / 2 /1024);AvailableSize=(uint16_t)((fre_clust * fs->csize) / 2 /1024);UsedSize=TotalSpace-AvailableSize;              /* Print free space in unit of MB (assuming 512 bytes/sector) */printf("\r\n%d MB total drive space.\r\n""%d MB available.\r\n""%d MB  used.\r\n",TotalSpace, AvailableSize,UsedSize);}else {printf("Get SDCard Capacity Failed (%d)\r\n", result);}
} /* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
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();

针对SD卡文件的每个步骤,进行相应的字段输出,来具体判断究竟进行到了什么地步。

4. 烧录程序

  • 执行程序后,将生成的hex文件烧录进入单片机中

5. 实验结果分析

  • 打开串口助手,观察输出结果


    可以发现写入次数超过11次后,会不断返回while值,而hello.txt文本里有11行内容,之后也不会再写入了。
  • 打开SD卡看到了hello文本文件写入了内容,但是出现乱码情况
  • 删除hello.txt文件,对主函数进行修改
  • 再烧录一次,再次观察,结果显示正常

    有序写入,说明是成功的。

三. 总结

本文讲解了SD卡的协议原理,最后实现用STM32F103完成对SD卡的数据读取,由于站在别人的肩膀上做实验,已经避免了许多坑,所以整个实验过程比较顺利,但是需要注意的是线必须要接好,接触不良很容易读取失败,需要多尝试几遍,毕竟成功没有那么容易。

四. 参考资料

SD卡协议简介
简述SD卡的工作原理
SD卡学习(SDIO和SPI模式)
STM32利用SPI读写SD卡的程序详解

STM32F103之完成对SD卡的数据读取相关推荐

  1. 用STM32F103完成对SD卡的数据读取

    目录 SD卡协议原理 STM32+SD卡 的系统原理图设计 具体原理 代码 所用软件及硬件: 成果 参考文献 SD卡协议原理 功能 SD卡是存储卡,它的功能就是存储. 分类 SD卡按容量分类,可以分为 ...

  2. 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作

    本文主要利用STM32F103完成对SD卡的数据读取,介绍该实验的详细操作 一.题目要求 二.SD卡协议原理 1.SD卡简述 2.SD卡物理结构 3.SD卡寄存器 4.SD卡操作模式 5.SD卡初始化 ...

  3. STM32F103完成对SD卡的数据读取(fat文件模式)

    目录 一.关于SD卡 1.简介 2.SD卡的寄存器 3.SD卡读取与写入(SPI模式) 二.实验操作 1.仪器 2.代码 3.连线 4.烧录程序 5.串口调试助手初始化并写入文件 6.sd卡里hell ...

  4. 使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取

    使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取 前言 实验要求 一. 电路原理图绘制 软件安装配置过程 (一)绘制stm32最小系统的电路原理图 1.新 ...

  5. 基于STM32F103完成对SD卡的数据读取(fat文件模式)

    文章目录 实验内容 一.SD卡协议 (一).SD卡简介 (二).SD 卡物理结构 (三).SD卡总线 二.基于STM32F103完成对SD卡的数据读取 (一).创建工程 (二).修改代码 (三).串口 ...

  6. STM32F103完成对SD卡的数据读取

    目录 一.SD卡介绍 1.概述 2.SD模式 3.SD卡读取与写入(SPI模式) 二. STM32F103完成对SD卡的数据读取 1.代码部分 2.U盘格式化 3.电路连接 4.具体实现 三.参考资料 ...

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

    目录 一.SD卡协议原理介绍 1.SD卡简介 2.SDIO设备分类 3.SD卡物理结构 4.SD卡寄存器 5.SD模式 驱动模式 传输模式 二. 实现对SD卡的数据读取 1.硬件准备 2.芯片模块与S ...

  8. STM32+SD卡的原理图绘制以及用32完成对SD卡的数据读取(fat文件模式)

    目录 一.下载安装AD 1.1安装方法一 1.2安装方法二 二.绘制STM32最小系统原理图 2.1元件库 2.2新建工程 2.3绘制原理图 三.SD卡协议原理 3.1SD卡简介 3.2SD卡接口 3 ...

  9. STM32F103完成对SD卡的数据读取详细操作

    SD卡协议原理 SD卡简述 关于SPI协议 通讯的起始和停止信号. 数据有效性 连线 代码完整工程 修改代码 烧录结果 总结 SD卡简述 很多单片机系统都需要大容量存储设备,以存储数据.目前常用的有 ...

最新文章

  1. 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析
  2. RedHat.Enterprise.Linux.5.2 Yum源配置
  3. mysql long varchar2_long查询结果转换为varchar2类型
  4. 安装linux前分区,安装Linux系统前的准备之磁盘分区
  5. 华为郑叶来:致敬开发者,共创“ AI ”的世界
  6. 好好活着就是一场博弈
  7. Mac系统可用的甘特图软件分享
  8. TDD(测试驱动开发)工作流程:
  9. 移远4G模组EC600N进行TCP/IP连接和服务器测试
  10. ZKtime5.0考勤管理系统标准版客户端登录忘记登录密码
  11. Debian 10截图小工具 flameshot
  12. 三极管与稳压管恒流电路
  13. [找工作]数据挖掘岗位2016校招要求
  14. CDC Schemes
  15. 英语口语网站免费学习资源大全
  16. 使用JDBC操作MySQL数据库
  17. 手机锂电池规格及充电曲线
  18. 使用Keras进行图像分类
  19. 【Kafka】kafka架构
  20. HEL库入门教程:STM32CubeIDE汉化教程 直接在线安装 简单易懂

热门文章

  1. 【Linux】管理用户和用户组
  2. SQL函数的自定义和调用
  3. 深度学习_图像分割_PANet论文详解
  4. JS调用媒体设备失败 --- getUserMedia undefine 问题(各浏览器配置方法)
  5. python输入二维数组_用Python生成二维数组的置换矩阵
  6. MIT 线性代数 1-5讲总结:消元、主元、初等矩阵、不可逆矩阵的证明、高斯-约尔当求逆、上下三角矩阵、置换矩阵、转置、向量空间与子空间
  7. SSM三大框架的运行流程、原理、核心技术详解!
  8. 【Hexo博客搭建】将其部署到GitHub Pages(三):怎么写作以及更新?
  9. Python游戏编程实践1:鲁蒂亚的世界
  10. 战争迷雾效果 第4章_真正的迷雾来了!