STM32F103读取SD卡的数据(fat文件模式)
实验目的
掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
实验原理
SD卡寄存器
SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
SD卡结构
SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器; 接口驱动器控制SD卡引脚的输入输出。
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卡的初始化,注意末尾发送的8个CLK是提供SD卡额外的时钟,完成某些操作。通过SD卡初始化,我们可以知道SD卡的类型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以开始读写数据了。
SD卡写入与读取
读取:
1、发送CMD17;
2、接收卡响应R1;
3、接收数据起始令牌0XFE;
4、接收数据;
5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
6、禁止片选之后,发多8个CLK;
写入:
1、发送CMD24;
2、接收卡响应R1;
3、发送写数据起始令牌0XFE;
4、发送数据;
5、发送2字节的伪CRC;
6、禁止片选之后,发多8个CLK;
实验过程
电路连接:
我们先进行相应的配置,选择stm32f103c8芯片,配置如下:
选择gpio:
配置rcc:
配置sys:
然后生成工程
完整工程代码如下(hal库版本) 链接:https://pan.baidu.com/s/1YxLpaIM6HMQ4d_9yh4M4ww
提取码:276d
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 */
}
写入函数WritetoSD:
在这里插入代码片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); //取消挂载
}
结果展示
可以看到超过十一次之后会一直返回while,说明十一行之后就不会写入了
参考资料
参考资料:
SD模块 https://detail.tmall.com/item.htm?id=43580108042&spm=a1z09.2.0.0.4e1c2e8dwVFPWk&_u=e3meo26c8f82
https://mooc1.chaoxing.com/ueditorupload/read?objectId=c1f2b780d9f067ecf4bd45643ed5f128&fileOriName=STM32cube%25E9%2585%258D%25E7%25BD%25AETFAST%25E6%25A8%25A1%25E5%25BC%258FSPI%25E8%25AF%25BB%25E5%2586%2599SD%25E5%258D%25A1.zip
https://mooc1.chaoxing.com/ueditorupload/read?objectId=ea99571271816701b1f2a44c99d50028&fileOriName=STM32%25E7%2594%25A8cube%25E9%2585%258D%25E7%25BD%25AEFATFS%25E6%25A8%25A1%25E5%25BC%258F%25E4%25B8%258BSPI%25E8%25AF%25BB%25E5%2586%2599SD%25E5%258D%25A1.pdf
STM32F103读取SD卡的数据(fat文件模式)相关推荐
- 绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据
绘制STM32最小系统电路原理图.STM32F103读取SD卡的数据 文章目录 绘制STM32最小系统电路原理图.STM32F103读取SD卡的数据 1 AltiumDesigner 软件配置 2 A ...
- 读取SD卡里面的BMP文件 显示到TFT上
读取SD卡里面的BMP文件 显示到TFT上 http://blog.csdn.net/yunxianpiaoyu/article/details/8841755 我刚好最近做了一个BMP565格式的图 ...
- 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)
二.软件部分 软件中INI_FLAG为设置的一个标志位,通过置1该位可以控制发送或接受数据速度.因为在初始化阶段SD卡操作需要适当放缓,而初始化成功后可以加快数据传动速率. 1>往SD卡写一个字 ...
- FPGA 读取SD卡图片数据(top_sd_photo)
一.SD卡介绍 传送门:https://blog.csdn.net/qq_39507748/article/details/113195336 初始化以及读写操作的流程文章中也有说到. 二.实验内容 ...
- android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
我有一个自定义ListView,代码如下.而不是写作: "http://yoursite.com/image1.png","http://yoursite.com/ima ...
- STM32F103完成对SD卡的数据读取(fat文件模式)
目录 一.关于SD卡 1.简介 2.SD卡的寄存器 3.SD卡读取与写入(SPI模式) 二.实验操作 1.仪器 2.代码 3.连线 4.烧录程序 5.串口调试助手初始化并写入文件 6.sd卡里hell ...
- 基于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.具体实现 三.参考资料 ...
- AB(罗克韦尔)PLC如何通过程序直接与外插SD卡进行数据读写?
近日,荟通智控 受客户委托,需要进行AB PLC将过程数据写入PLC外接SD卡内的业务,以下为荟通智控 基于罗克韦尔示范程序CF_Read_Write_Example.ACD 的调试和验证重点汇总 确 ...
最新文章
- html流程图可新增删除,CSS / HTML流程图
- c语言字母表关键字,读书笔记-C语言关键字
- 修改after样式_理解:Before和:After伪元素
- VTK:vtkAxisActor用法实战
- 学习office add-in
- Java集合从菜鸟到大神演变
- 2018.09.16 loj#10243. 移棋子游戏(博弈论)
- hadoop-hbase-spark单机版安装
- python3 asyncio_asyncio--python3未来并发编程主流、充满野心的模块
- 【分布式事务系列二】Spring事务管理器PlatformTransactionManager
- html5使用mescroll
- 什么是静态代理,什么是动态代理
- 数据结构与算法分析(一)基础部分与算法分析方法
- 数据库一对一、一对多、多对多关系理解(转载)
- 三菱服务器显示003C,FX3U/FX3G系列PLC内置定位功能的当前值寄存器是什么?
- 数学之美系列好文,强推
- java写一个泡泡龙小游戏
- CyclicBarrier栅栏
- PDF编辑技巧 PDF怎么修改文字
- 睦星科技Kolmostar获1000万美元 A 轮融资,将推出更多元的GNSS定位解决方案...