STM32F103之完成对SD卡的数据读取
文章目录
- 一. 认识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。
- 初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置);
- 上电延时(>74个CLK);
- 复位卡(CMD0),进入IDLE状态;
- 发送CMD8,检查是否支持2.0协议;
- 根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);
- 取消片选,发多8个CLK,结束初始化
- SD卡初始化流程图:
6. SD卡读取数据
这里通过CMD17来实现,具体过程如下:
- 发送CMD17;
- 接收卡响应R1;
- 接收数据起始令牌0XFE;
- 接收数据;
- 接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
- 禁止片选之后,发多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卡的数据读取相关推荐
- 用STM32F103完成对SD卡的数据读取
目录 SD卡协议原理 STM32+SD卡 的系统原理图设计 具体原理 代码 所用软件及硬件: 成果 参考文献 SD卡协议原理 功能 SD卡是存储卡,它的功能就是存储. 分类 SD卡按容量分类,可以分为 ...
- 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作
本文主要利用STM32F103完成对SD卡的数据读取,介绍该实验的详细操作 一.题目要求 二.SD卡协议原理 1.SD卡简述 2.SD卡物理结构 3.SD卡寄存器 4.SD卡操作模式 5.SD卡初始化 ...
- STM32F103完成对SD卡的数据读取(fat文件模式)
目录 一.关于SD卡 1.简介 2.SD卡的寄存器 3.SD卡读取与写入(SPI模式) 二.实验操作 1.仪器 2.代码 3.连线 4.烧录程序 5.串口调试助手初始化并写入文件 6.sd卡里hell ...
- 使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取
使用Altium Designer 绘制原理图并且使用STM32F103完成对SD卡的数据读取 前言 实验要求 一. 电路原理图绘制 软件安装配置过程 (一)绘制stm32最小系统的电路原理图 1.新 ...
- 基于STM32F103完成对SD卡的数据读取(fat文件模式)
文章目录 实验内容 一.SD卡协议 (一).SD卡简介 (二).SD 卡物理结构 (三).SD卡总线 二.基于STM32F103完成对SD卡的数据读取 (一).创建工程 (二).修改代码 (三).串口 ...
- STM32F103完成对SD卡的数据读取
目录 一.SD卡介绍 1.概述 2.SD模式 3.SD卡读取与写入(SPI模式) 二. STM32F103完成对SD卡的数据读取 1.代码部分 2.U盘格式化 3.电路连接 4.具体实现 三.参考资料 ...
- STM32F103最小板完成对SD卡的数据读取(fat文件模式)
目录 一.SD卡协议原理介绍 1.SD卡简介 2.SDIO设备分类 3.SD卡物理结构 4.SD卡寄存器 5.SD模式 驱动模式 传输模式 二. 实现对SD卡的数据读取 1.硬件准备 2.芯片模块与S ...
- STM32+SD卡的原理图绘制以及用32完成对SD卡的数据读取(fat文件模式)
目录 一.下载安装AD 1.1安装方法一 1.2安装方法二 二.绘制STM32最小系统原理图 2.1元件库 2.2新建工程 2.3绘制原理图 三.SD卡协议原理 3.1SD卡简介 3.2SD卡接口 3 ...
- STM32F103完成对SD卡的数据读取详细操作
SD卡协议原理 SD卡简述 关于SPI协议 通讯的起始和停止信号. 数据有效性 连线 代码完整工程 修改代码 烧录结果 总结 SD卡简述 很多单片机系统都需要大容量存储设备,以存储数据.目前常用的有 ...
最新文章
- 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析
- RedHat.Enterprise.Linux.5.2 Yum源配置
- mysql long varchar2_long查询结果转换为varchar2类型
- 安装linux前分区,安装Linux系统前的准备之磁盘分区
- 华为郑叶来:致敬开发者,共创“ AI ”的世界
- 好好活着就是一场博弈
- Mac系统可用的甘特图软件分享
- TDD(测试驱动开发)工作流程:
- 移远4G模组EC600N进行TCP/IP连接和服务器测试
- ZKtime5.0考勤管理系统标准版客户端登录忘记登录密码
- Debian 10截图小工具 flameshot
- 三极管与稳压管恒流电路
- [找工作]数据挖掘岗位2016校招要求
- CDC Schemes
- 英语口语网站免费学习资源大全
- 使用JDBC操作MySQL数据库
- 手机锂电池规格及充电曲线
- 使用Keras进行图像分类
- 【Kafka】kafka架构
- HEL库入门教程:STM32CubeIDE汉化教程 直接在线安装 简单易懂
热门文章
- 【Linux】管理用户和用户组
- SQL函数的自定义和调用
- 深度学习_图像分割_PANet论文详解
- JS调用媒体设备失败 --- getUserMedia undefine 问题(各浏览器配置方法)
- python输入二维数组_用Python生成二维数组的置换矩阵
- MIT 线性代数 1-5讲总结:消元、主元、初等矩阵、不可逆矩阵的证明、高斯-约尔当求逆、上下三角矩阵、置换矩阵、转置、向量空间与子空间
- SSM三大框架的运行流程、原理、核心技术详解!
- 【Hexo博客搭建】将其部署到GitHub Pages(三):怎么写作以及更新?
- Python游戏编程实践1:鲁蒂亚的世界
- 战争迷雾效果 第4章_真正的迷雾来了!