stm32在SDIO模式下SD写入错误的问题

news2024/11/15 17:15:50

1、问题描述
使用FAT32 f_write 多次执行写操作时,会报FR_DISK_ERR错误,而且是刚开始写不报错,写几次后会一直报错。

设断点跟踪到HAL_SD_WriteBlocks中,在调用SDMMC_CmdWriteMultiBlock时,会报SDMMC_ERROR_TX_UNDERRUN,意思 是Transmit FIFO underrun

2、原因分析
如下图所示,SDMMC开始写操作时,首先要将数据写入FIFO,然后再将FIFO中的数据取出,通过Data path写入到SD卡。因为时钟频率比较快(最高可达20MHz),因此往FIFO里装填数据必须非常快,否则后面从FIFO取数时就会取不到数,报出Transmit FIFO underrun错误。

可能原因1:
可能是通过APB2总线往FIFO装填数时,发生了中断,导致总线被占用或其他资源被占用,从而无法及时完成FIFO的装填,而后面从FIFO取数的频率又非常快,导致无法取到数。

可能原因2:
SD卡写的时候出现了坏块,导致写不成功,在写失败时需要重试一下。

可能原因3:
写速度太快,导致FIFO来不及装填,产生错误,需要降速。

在这里插入图片描述
3、解决办法之禁用中断
在调用f_write之前调用 __disable_irq() 接口关闭中断,写操作完成后调用 __enable_irq()接口启用中断:

__disable_irq()if(FR_OK  ==f_write())
{ }
else
{}
__disable_irq() ;

优点:简单
缺点:在写操作期间CPU无法响应中断

4、解决办法之写重试
重写bsp_driver_sd.c文件中的BSP_SD_WriteBlocks函数是_weak 函数,可以在自己的源文件myfile.c中重写该函数,当写发生错误后,清除错误标记,再重试几次即可,在我的单片机上,一般第一次重试即可成功

uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)
{
	int i;
	for (i = 1; i <= TY_SDIO_RETRY_MAX; i ++)	
	{
		if (HAL_SD_WriteBlocks(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) == HAL_OK)
		{
			if (i > 1)
			printf("[INFO] SDIO writing succeeded: retry %d.\n", i);
			return (MSD_OK); // Succeeded
		}
		else
		{
			printf("[ERROR] SDIO writing failure: retry %d, error code %#x, addr %#x, %u blocks.\n",
			i, hsd.ErrorCode, WriteAddr, NumOfBlocks);
			HAL_SD_Abort(&hsd); //clear error flag
		}
	}
	return (MSD_ERROR);
}

优点:上层应用软件不需要更改,也不需要禁用中断
缺点:频率较高时(我的是30MHZ)时,经常会发生写重试

5、解决办法之降低写频率(降速)
更改sdio.c中的MX_SDIO_SD_Init函数,将hsd.Init.ClockDiv = 0改为hsd.Init.ClockDiv = 2,写频率会变成原来的1/2,在我的单片机上降频1/2之后,写错误将不再发生。
优点:非常简单;无需禁用中断;无需对上层软件进行修改。
缺点:降低了写速度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

016:Mapbox GL加载geojson数据,显示line,自定义颜色、宽度等

第016个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,显示线条。paint中可以设置的参数:line-blur,line-cap,line-color,line-dasharray,line-gap-width,line-gradient,line-join,line-miter-limit,line-offset,line-opacity,line-…

缓存空间优化实践

导读 缓存 Redis&#xff0c;是我们最常用的服务&#xff0c;其适用场景广泛&#xff0c;被大量应用到各业务场景中。也正因如此&#xff0c;缓存成为了重要的硬件成本来源&#xff0c;我们有必要从空间上做一些优化&#xff0c;降低成本的同时也会提高性能。 下面以我们的案…

【MySQL】数据库完整性和安全性

目录 一、完整性 1.概念 2.sql语言支持的两种约束 2.1静态约束 撤销追加约束 断言 2.3动态约束 触发器 二、安全性 用DBMS对数据库实现的两个特性 一、完整性 1.概念 指dbms保证的db的一种特性&#xff0c;在任何情况下的正确性、有效性、一致性 原理图 广义完整性&…

深度学习第J7周:ResNeXt-50算法思考

目录 一、问题 二、思考分析 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] 查看j6周代码&#xff0c;思考解决问题。 一、问题 &#x1f4cc;你需要解决的…

自然语言处理实战项目5-文本数据处理输入模型操作,以命名实体识别为例,打通NLP模型训练从0到1

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来自然语言处理实战项目5-文本数据处理输入模型操作&#xff0c;以命名实体识别为例。今天我给出的案例是命名实体识别&#xff0c;假设我们有一个命名实体识别任务&#xff0c;需要从文本中识别人名、地点和组织等实体。…

快速找出满足所需比值的一对电阻值 - Python 函数实现

常用的5% 和1% 精度电阻的阻值满足E24 数系&#xff0c;基数只能在这个数系里取&#xff0c;再乘上10 的n 次幂。E24 数系如下图&#xff1a; 之前我都是人肉一个一个试的&#xff0c;凭运气挑&#xff0c;终于忍不住想整个一劳永逸的小工具。 代码 对于给定的比值&#xff0…

【计算机是怎么跑起来的】基础:计算机三大原则

【计算机是怎么跑起来的】基础&#xff1a;计算机三大原则 计算机的三个根本性基础1.计算机是执行输入&#xff0c;运算&#xff0c;输出的机器输入&#xff0c;运算&#xff0c;输出 2. 软件是指令和数据的集合指令数据 3. 计算机的处理方式有时与人们的思维习惯不同对计算机来…

格式工厂将视频导出Maya需要的图像序列帧

目录 一、格式工厂影片转序列帧 1、格式工厂下载链接 2、打开需要转换的视频 3、输出配置 4、开始导出序列帧 二、Maya中添加影片序列帧和动画播放 1、打开Maya2016版本软件 2、导入图像 3、序列帧设置 4、播放速度设置 5、Maya中播放序列帧动画 一、格式工厂影片转序列帧…

展会邀请 | 虹科诚邀您4月26-28日前来参观成都国际工业博览会

HONGKE NEWS 2023 成都国际工业博览会精准聚焦中国智能制造&#xff0c;将通过展示自动化和工业机器人技术、新一代信息技术、金属加工、节能与工业配套、新材料等全行业最新技术和解决方案&#xff0c;完美呈现智能工业产业链中的创新技术及产品的有效融合。 2023年4月26日-…

无人机3d可视化系统的应用是怎样实现的?

随着科技的发展&#xff0c;以信息化为支撑的系统化操作将成为未来信息对抗的主要形式&#xff0c;通过人工智能技术赋能感知系统&#xff0c;可以抓住机会控制局面&#xff0c;带动后续环节高效运行&#xff0c;缩短循环求解时间&#xff0c;为信息对抗提供机会和关键支撑。无…

为什么医疗保健需要MFT来帮助保护EHR文件传输

毫无疑问&#xff0c;医疗保健行业需要EHR技术来处理患者&#xff0c;设施&#xff0c;提供者等之间的敏感患者信息。但是&#xff0c;如果没有安全的MFT解决方案&#xff0c;您将无法安全地传输患者文件&#xff0c;从而使您的运营面临遭受数据泄露&#xff0c;尴尬&#xff0…

leetcode 周赛 2386. 找出数组的第 K 大和-java实现

题目所属分类 华为校招 原题链接 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。 数组的 第 k 大和 定义为&#xff1a;可以获得的第 k 个 最大 子序列和&#xff08;子序列和允许出现重复&#xff09; 返回数组的 第 k 大…

【新时代圈友app】为什么要使用MongoDB数据库?— 查询缘分值最高的最佳好友并返回相关信息

目录 一、为什么要使用MongoDB数据库&#xff1f; 二、缘分值最佳好友 思路 一、为什么要使用MongoDB数据库&#xff1f; 本项目涉及到的圈子(动态)功能&#xff0c;用户会对朋友圈进行点赞、评论&#xff1b;那么随着用户的不断增多&#xff0c;评论点赞收藏等信息也会不断…

JS之Map的基本使用

一、Map的基本API 创建&#xff1a; const map new Map()插入&#xff1a;map.set("name", "郑建")读取&#xff1a;map.get("name")判断&#xff1a;map.has("name")删除&#xff1a;map.delete大小&#xff1a;map.size遍历&#…

webhub123 设计师好用的笔刷纹理网站收录​

整理了一些可以免费下载的好用的笔刷和纹理资源网站&#xff0c;收录到 webhub123 设计师好用的笔刷纹理网站收录​http://www.webhub123.com/#/home/detail?projectHashid31645930&ownerUserid21336964 收录效果如下&#xff0c;每个网站显示为一张图片&#xff0c;点击…

【Python基础入门学习】Python基础语法学习

基础认识 1. 注释2. 变量2.1 变量命名规则2.2 变量的类型2.3 不同类型之间的运算规则2.4 变量的输入和输出2.4.1 print 函数使用2.4.2 input 函数使用 2.5 变量的类型转换 3. 分支语句3.1 判断的定义3.2 if 判断语句基本语法3.3 else 处理条件不满足的情况3.4 逻辑运算3.5 if 的…

小红书数据分析:这个夏天,“围炉冰茶”继续刷屏

导语 去年秋冬开始爆火的“围炉煮茶”&#xff0c;果集千瓜数据显示&#xff1a;近90天来&#xff0c;笔记预估阅读总数达1,038.83万&#xff0c;同比下降80.67%&#xff0c;笔记互动总量61.78万&#xff0c;下降高达76.85%。 图 | 果集千瓜数据 受到时令的影响&#xff0c;围…

算法 - 随机 Coding 刷算法合集 [1]

目录 一.数组中重复的数字 [集合] 1.题目要求 2.题目思路 3.题目实现 二.二维数组中的查找 [数组] 1.题目要求 2.题目思路 3.题目实现 三.替换空格 [字符串] 1.题目要求 2.题目思路 3.题目实现 四.从尾到头打印链表 [链表] 1.题目要求 2.题目思路 3.题目实现 …

电脑技巧:分享浏览器5个小技巧,太实用了

大家在日常办公当中&#xff0c;浏览器可以说占用非常大的比重&#xff0c;比如搜个素材、图片、文档等等&#xff0c;今天就来给大家分享5个浏览器使用的小技巧&#xff0c;希望对大家能有所帮助&#xff01; 1、浏览器常用快捷键梳理 其实Web浏览器快捷键很多&#xff0c;但…

MySQL_第14章_视图

第14章_视图 1. 常见的数据库对象 对象描述表(TABLE) 表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录 数据字典 就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c; 程序…