找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10086|回复: 2
打印 上一主题 下一主题
收起左侧

一个关于SD卡读写超时的话题

[复制链接]
跳转到指定楼层
楼主
ID:98618 发表于 2016-10-20 13:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在基于STM32 MCU的应用开发中,经常会有人用到SD卡。有人发现在对SD卡进行读写时,偶尔会遇到SD卡读写失败的情况。尤其是单独对SD卡进行读写正常、或者非多任务环境下运行正常,而当SD读写跟其它程序代码混在一起或在多任务环境下运行时就容易发生异常。比方如下情形:


1、使用STM32F4SDIO,用CubeMX配置。用polling模式的时候,出现SD卡写的时候卡死的情况。后来用DMA模式就好了。


2STM32F746DISCO开发板和官方1.3.0例程基础上使用了FreeRTOS系统,改为DMA传输后还是不稳定。后来把SDIO相关的中断优先级别调高,SDIO中断设为3DMA发送和接收的调为4,比FreeRTOS的系统用户级别高,解决问题。


3、在FreeRTOS+FatFs+STM32F429的基础上。
A.单个任务操作,SD卡读写没有问题
B.多个任务,SD卡和U盘两个任务,优先级别一样,SD卡无法读写,U盘可以读写,调中断级别,调整堆栈大小都没有用。
C.还是多任务,SD卡和U盘两个任务,甚至更多任务,只要把SD卡任务的优先级别调为最高,则SD卡,U盘读写都正常。


4、使用STM32官方SDIOSD CARD驱动的时候,单任务的时候没有出现错误,使用多任务的时候经常出现问题,表现为读取文件的时候没有问题,经常点击屏幕的时候就会出问题,最后通过仿真找到出错点就是读取数据向SD卡发送CD17命令时出现SD_RX_OVERRUN这个错误,产生原因为读取FIFO溢出. 通过仿真与测试发现问题主要出现在读取过程中不能打断。
在两个读取函数里面SD_ErrorSD_ReadMultiBlocks(u32 addr, u32 *readbuff, u16 BlockSize, u32NumberOfBlocks);SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16BlockSize); 加上临界保护可以消除问题。同样写操作的时候也一样需要加临界保护。

以上罗列的情形,根本上讲因为SD卡读写过程中发生了超时错误导致读写异常。应对措施视具体应用要求可能有所差异,最终目的都是为了避免SD卡读写过程中的超时错误。比如将查询模式改为DMA模式、调整相关SD卡读写过程中所涉及中断的优先级、提升SD卡读写任务的优先级、将SD卡读写程序放在临界保护区运行或者在读写SD卡操作时关闭中断等。


我们可以从SD卡相关协议得知,在对SD卡进行读写操作时是有超时保护及约束机制的。对于标准卡和高容量卡的读写超时定义还有所差异。细节请参考SD卡相关规格书。SD Specifications ----Physical Layer Simplified Specification




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:152188 发表于 2017-8-24 21:44 | 只看该作者
谢谢分享,最近也在调试sdcard!!
回复

使用道具 举报

板凳
ID:371527 发表于 2019-1-30 09:16 | 只看该作者
数据分段存储,每段喂狗,每段写入时间小于看门狗最大计时时间
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表