STM32制作SD卡读卡器

STM32F4_USB读卡器(USB_Slave)/USB U盘(Host) 的缩写,是一个外部总线标准,用以规范电脑与外部设备的连接和通讯。,同时支持从机功能和主机功能,完全符合USB 2.0规范的On-The-Go(就是OTG,实现在没有Host主机的情况下,实现设备间的数据传送)补充标准。根据之前的学习,我们知道如果是高速设备,那么D+上会接一个1.5K的上拉电阻到VCC,如果是低速设备,那么D-上会接一个1.5K的上拉电阻到VCC;主机模式下,OTG FS支持全速(FS,12Mb/s)和低速(LS,1.5Mb/s)收发器,在从机模式下仅支持全速(FS,12Mb/s)收发器。 阅读详情
AI摘要

本文介绍了作者如何从优快云获取并移植STM32F103C8T6的SD卡驱动,过程中遇到的错误包括源码中的注释问题和SPI速度设置错误。通过调试发现RCC_APB1PeriphClockCmd的错误导致SPI时序问题,最终解决了驱动卡顿问题。

 注意,本博客适合像我一样的小白,会的不多,但是想快速做些东西,不适合会写驱动的大佬。

本文使用stm32f103c8t6,裸机开发。

/**

 * 硬件连接:

 *        CS -> PB12 连接SD卡CS

 *        SCK -> PB13 连接SD卡SCK

 *        MISO -> PB14 连接SD卡MISO

 *        MOSI -> PB15 连接SD卡MOSI

 * 注意:

 *        有的SD卡是带有AMS1117的,其VCC要接在5V上,

 *        STM32在只有jinl供电时5V是不会输出的,要用USB给STM32供电!!!

 *        有的SD卡不支持SPI模式,我尝试后发现SNMSUNG的SD卡不支持,但是KINGSTON的可以

 */

【免费】stm32f103c8t6SD卡驱动(Fatfs)_103C8T6的FAFS文件系统资源-优快云文库

一、SD卡驱动

(一)copy源码,移植

我在优快云上找到了一位大佬用HAL库和fatfs实现stm32f103c8t6对micro SD卡读写的驱动。于是借(抄)鉴(袭)之。

1.编写SPI初始化函数(CubeIDE编辑生成的初始化代码好像在main.c和xxx_msp.c,比较散乱,于是直接上手写)

	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启GPIOB的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);	//开启SPI2的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将PB12引脚初始化为推挽输出
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将PB13和PB15引脚初始化为复用推挽输出
	

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将PB14引脚初始化为上拉输入
	
	
	/*SPI初始化*/
	SPI_InitTypeDef SPI_InitStructure;						//定义结构体变量
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;			//模式,选择为SPI主模式
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//方向,选择2线全双工
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//数据宽度,选择为8位
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;		//先行位,选择高位先行
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;	//波特率分频,选择128分频
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;				//SPI极性,选择低极性
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;			//SPI相位,选择第一个时钟边沿采样,极性和相位决定选择SPI模式0
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;				//NSS,选择由软件控制
	SPI_InitStructure.SPI_CRCPolynomial = 7;				//CRC多项式,暂时用不到,给默认值7
	SPI_Init(SPI2, &SPI_InitStructure);						//将结构体变量交给SPI_Init,配置SPI1
	
	SPI_Cmd(SPI2, ENABLE);									//使能SPI2,开始运行
	
	/*设置默认电平*/
	SD_CS(1);											//SS默认高电平

从原子哥的讲解来看,我们还需要更改SPI的速度,(也就是SPI_baudratePrescaler)可是 标准库当中并没有给出,我们只好操作寄存器,编写该函数(我比较菜,直接从原子哥的fatfs的SPI源码中copying过来)

 

SPI速度设置函数如下 

/**
 * @brief 设置SPI2的速度为低速
*/
void  sd_spi_speed_low(void)
{
	SPI2->CR1&=0XFFC7;
	SPI2->CR1|=SPI_BaudRatePrescaler_256;	//����SPI2�ٶ� 
	SPI_Cmd(SPI2,ENABLE); 
}

/**
 * @brief 设置SPI2的速度为高速
*/
void  sd_spi_speed_high(void)
{
	SPI2->CR1&=0XFFC7;
	SPI2->CR1|=SPI_BaudRatePrescaler_2;	//����SPI2�ٶ� 
	SPI_Cmd(SPI2,ENABLE); 

}

之后出现了一些灵异事件! 

main.c中有一个读写文件的示例函数:

void WritetoSD(char SD_FileName[], uint8_t write_buff[],uint8_t bufSize)

// {

//  FATFS fs;

//  FIL file;

//  uint8_t res=0;

//  UINT Bw;    

   

//  res = SD_init();        //SD卡初始化



//  if(res == 1)

//  {

//      UsartPrintf(USART_DEBUG,"SD卡初始化失败! \r\n");  

//      OLED_ShowString(1,1,"failed!");

//  }

//  else

//  {

//      UsartPrintf(USART_DEBUG,"SD卡初始化成功! \r\n");      

//      OLED_ShowString(1,1,"init successed!");

//  }

   

//  res=f_mount(&fs,"0:",1);        //挂载

   

// //   if(test_sd == 0)        //用于测试格式化

//  if(res == FR_NO_FILESYSTEM)     //没有文件系统,格式化

//  {

// //       test_sd =1;             //用于测试格式化

//      UsartPrintf(USART_DEBUG,"没有文件系统! \r\n");        

//      OLED_ShowString(2,1,"no file system!");

//      res = f_mkfs("", 0, 0);     //格式化sd卡

//      if(res == FR_OK)

//      {

//          UsartPrintf(USART_DEBUG,"格式化成功! \r\n");

//          OLED_ShowString(1,1,"geshihua sed!");      

//          res = f_mount(NULL,"0:",1);         //格式化后先取消挂载

//          res = f_mount(&fs,"0:",1);          //重新挂载  

//          if(res == FR_OK)

//         &nbs
【嵌入式】用STM32F103c8t6芯片完成对SD卡的数据读写 目录(一)SD卡协议1、SD卡的体系架构2、SD卡寄存器列表3、SD卡初始化(SPI模式)4、SD卡读写(SPI模式)(二)STM32CubeMX(三)Keil代码修改(四)电路连接(五)烧录运行结果(六)心得体会(七)参考链接 (一)SD卡协议 SD Host Controller Simplified Specification(以下简称:主机协议)用来标准化SD主机控制器,针对的是SD卡主机控制器厂商。这个协议不是强制的,在我们阅读SD驱动代码的时候,如果涉及到SD卡主机控制的代码,我们可能需要翻一下 阅读详情

相关推荐

【STM32】STM32使用RFID读卡器

ID卡(身份标识):作用就是比如你要输入学号,你刷卡直接就相当于输入学号,省去了输入的过程。IC卡:集成电路卡,是将一种微电子芯片嵌入卡片之中。(2)防碰撞—选择一张信号最强的卡(得到卡的ID)(1)请求卡—寻找附近所有信号的卡。(3)选卡—选择一张要通信的卡。(4)密钥验证—验证身份。(5)读写卡片—数据读写。厂家给的测试代码改写。

NewbieJ_的博客 5052

使用STM32在SPI模式下读写SD卡

使用STM32在SPI模式下读写SD卡

rzh222的博客 7465

STM32使用软件模拟spi读写sd卡(使用SD卡读卡器模块)

本文介绍了利用STM32F103RCT6开发板通过软件模拟SPI协议实现与SD卡通信的方法。主要内容包括:1)SD卡在嵌入式系统中的重要性及软件模拟SPI的适用场景;2)SD卡物理结构、SPI协议基础及通信流程;3)软件模拟SPI的实现步骤,包括GPIO配置和时序函数编写;4)FATFS文件系统移植与读写实现;5)调试过程中常见的SD卡未响应等问题的解决方法。实验结果表明,该方法在硬件SPI资源受限的情况下,能够可靠地实现STM32与SD卡的数据通信,为嵌入式系统存储解决方案提供了新的思路。文中给出了完整的

hanhanhan233的博客 1980

VS code+STM32CubeMX 使用 FreeRTOS+FatFS+USB_DEVICE 搭建 SD卡 读卡器 和 读写 SD卡 示例项目

文章目录1. 新建项目2. 配置 CubeMX 项目3. 配置 EIDE 项目4. 编写代码5. 编译下载6. 效果展示 本例介绍如何使用 vscode 插件 EIDE 和 STM32CubeMX 开发 STM32 项目,并实现一个 使用 FreeRTOS+FatFs 读写 SD 卡,同时将STM32 变成一个 SD卡 读卡器 的示例程序 **注:**本例使用的芯片是 STM32F407VGT6,编译器为 GCC 1. 新建项目 打开 EIDE,新建一个 Cortex-M MCU 空项目,然后打开,将工

Null 2884

stm32f103c8t6--sd卡的读写&&flash地址空间的数据读取

目录 准备 一、SD卡的数据读写 1.目标 2.连线 3.写入数据 4.读出数据 二、Flash地址空间的数据读取 1.目的 2.配置 3.代码修改 三、总结 参考 准备 所需的软件 STM32CubeMX、keil5、串口调试助手、mcuisp烧录程序 所需硬件 stm32f103c8t6、SD卡以及卡槽、ST-link 一、SD卡的数据读写 工程代码: 链接:https://pan.baidu.com/s/15OKDTTh3jUxreny_cY_2IQ 提取码:.

run___5661651的博客 9411

SD卡读卡器模块的SPI模式实战:用STM32CubeMX配置软件SPI引脚

本文详细介绍了如何使用STM32CubeMX配置软件SPI引脚驱动SD卡读卡器模块的进阶技巧。通过对比硬件SPI与软件SPI的核心优势,提供引脚定义、时序优化、SPI协议适配及数据读写优化等实战方案,帮助开发者高效构建嵌入式存储系统。

lg888的博客 874

【STM32+cubemx】0019 HAL库开发:SDIO接口和FATFS文件系统访问TF、SD卡

stm32的部分型号有SDIO接口,cubemx也可以生成TF/SD卡的工程,同时cubemx的中间件甚至集成了FATFS文件系统,几乎可以说一站式解决了所有TF/SD卡的使用问题。 本节我们使用Cubemx生成TF/SD卡的工程,并且使用上FATFS文件系统,使得stm32写入TF/SD卡的数据可以直接通过读卡器在计算机上访问。

小白白学电子 3462

STM32用cube配置FATFS模式下SPI读写SD卡

要求:掌握SD卡协议原理,用STM32F103 完成对SD卡的数据读取(FAT文件模式) 一、SD卡与FATS 1、SD卡 (1)简介 SD 卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对 SD卡进行读写通信操作一般有两种通信接口可选,一种是 SPI接口,另外一种就是 SDIO 接口。SDIO 全称是安全数字输入/输出接口,多媒体卡(MMC)、SD 卡、SD I/O 卡都有 SDIO 接口。SD I/O 卡本身不是用于存储的卡,它是指利用 SDIO 传输协.

chelseafall的博客 2304

【STM32Cube_20】在SD卡上移植FATFS文件系统

本篇详细的记录了如何使用STM32CubeMX移植FATFS文件系统到SD卡上。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): Micro SD卡 小熊派开发板板载 Micro SD 卡槽,需要提前自行准备一张 Micro SD卡,如图: 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的...

Mculover666的博客(嵌入式) 3593

Revit二次开发——不启动Revit,做rvt文件数据导出

Revit二次开发——不启动Revit,做rvt文件数据导出Node.js部分调用C#端供外部调用的dllC#部分调用RevitNet.dll,做数据导出exe做外部调用dll总结功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 N

Y.Jerome的专栏 4110

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 544

杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

使用keycloak实现SSO单点登录(概念、原理、逻辑、详细步骤、难点解释)

野生猿林仔的博客 2万+

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解(一)查看当前 locale 设置(二)查看当前系统所有可用 locale(三)设置系统的 locale 命令介绍 locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。 通过 locale 来设置程序运行的不同语言环境,locale 由ANSI C提供支持。locale 的

liaowenxiong的博客 3万+

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 553

5分钟搞定!用Cursor和.NET 9.0快速搭建串口通讯上位机(附VS Code插件配置)

本文分享了如何利用Cursor AI编程助手与.NET 9.0,在5分钟内快速构建一个功能完整的串口通讯上位机程序。通过自然语言描述需求,AI自动生成WinForms界面和核心代码,极大提升了硬件调试工具的定制开发效率。文章详细介绍了环境配置、AI协作编码、功能实现与调试的全过程。

weixin_28366353的博客 274

工业质检新利器:手把手教你用AD-DINOv3实现零样本缺陷检测(附MVTec AD实战)

本文详细介绍了AD-DINOv3框架在工业质检中的应用,通过零样本异常检测技术解决传统方法的标注成本高和泛化能力弱问题。文章包含技术原理解析、MVTec AD数据集实战部署、模型训练流程及工业部署优化技巧,帮助读者快速掌握这一创新技术。

seed的博客 763

树莓派 RP2350B 开发环境搭建

本文介绍了树莓派RP2350B开发环境的搭建过程。

张一西的博客 286

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: STM32重要参考资料
下一篇: 初探STM32f407VET6
python_use
博客等级 码龄5年 430粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值