实验目的

掌握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文件模式)相关推荐

  1. 绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据

    绘制STM32最小系统电路原理图.STM32F103读取SD卡的数据 文章目录 绘制STM32最小系统电路原理图.STM32F103读取SD卡的数据 1 AltiumDesigner 软件配置 2 A ...

  2. 读取SD卡里面的BMP文件 显示到TFT上

    读取SD卡里面的BMP文件 显示到TFT上 http://blog.csdn.net/yunxianpiaoyu/article/details/8841755 我刚好最近做了一个BMP565格式的图 ...

  3. 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)

    二.软件部分 软件中INI_FLAG为设置的一个标志位,通过置1该位可以控制发送或接受数据速度.因为在初始化阶段SD卡操作需要适当放缓,而初始化成功后可以加快数据传动速率. 1>往SD卡写一个字 ...

  4. FPGA 读取SD卡图片数据(top_sd_photo)

    一.SD卡介绍 传送门:https://blog.csdn.net/qq_39507748/article/details/113195336 初始化以及读写操作的流程文章中也有说到. 二.实验内容 ...

  5. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?

    我有一个自定义ListView,代码如下.而不是写作: "http://yoursite.com/image1.png","http://yoursite.com/ima ...

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

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

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

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

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

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

  9. AB(罗克韦尔)PLC如何通过程序直接与外插SD卡进行数据读写?

    近日,荟通智控 受客户委托,需要进行AB PLC将过程数据写入PLC外接SD卡内的业务,以下为荟通智控 基于罗克韦尔示范程序CF_Read_Write_Example.ACD 的调试和验证重点汇总 确 ...

最新文章

  1. html流程图可新增删除,CSS / HTML流程图
  2. c语言字母表关键字,读书笔记-C语言关键字
  3. 修改after样式_理解:Before和:After伪元素
  4. VTK:vtkAxisActor用法实战
  5. 学习office add-in
  6. Java集合从菜鸟到大神演变
  7. 2018.09.16 loj#10243. 移棋子游戏(博弈论)
  8. hadoop-hbase-spark单机版安装
  9. python3 asyncio_asyncio--python3未来并发编程主流、充满野心的模块
  10. 【分布式事务系列二】Spring事务管理器PlatformTransactionManager
  11. html5使用mescroll
  12. 什么是静态代理,什么是动态代理
  13. 数据结构与算法分析(一)基础部分与算法分析方法
  14. 数据库一对一、一对多、多对多关系理解(转载)
  15. 三菱服务器显示003C,FX3U/FX3G系列PLC内置定位功能的当前值寄存器是什么?
  16. 数学之美系列好文,强推
  17. java写一个泡泡龙小游戏
  18. CyclicBarrier栅栏
  19. PDF编辑技巧 PDF怎么修改文字
  20. 睦星科技Kolmostar获1000万美元 A 轮融资,将推出更多元的GNSS定位解决方案...

热门文章

  1. 专访三维空间雷成老师 | 原来水墨画风格的3D建筑动画可以如此惊艳……
  2. 遇到人生低谷期该怎么度过?
  3. framebuffer之overview/双缓冲/alpha与colorkey/窗口平移与virtual screen平移
  4. android删除手机照片恢复软件,安卓手机上照片删除如何恢复?
  5. 外包两年跳进外企和大厂,简历污点不是外包经历,是技术太差
  6. hdu 2475 box LCT
  7. 二层交换、三层交换和路由的原理及区别
  8. 当LCC画龙时,新老车企分别在想什么?
  9. PC 时代 Office 的仇,WPS 在 24 年后有机会报了
  10. 复杂网络之社区发现算法