SD卡应用总结(FatFs)
来源:互联网 发布:国内皮鞋品牌 知乎 编辑:程序博客网 时间:2024/06/06 13:10
对于SD卡的应用,想必大家都尝试多。不过,很多网友恐怕只停留在实验的基础上吧。对于SD卡在文件系统下或者不带文件系统下,对SD卡的操作都是很简单的。是的,只是简单的文件读写确实不难。但是,如果每秒钟不停的写数据,而且是不停的工作,恐怕SD卡的应用就没有这么简单了吧,有时总会出现一些莫名其妙的问题。
不知道大家是否遇到过这些问题?本人开发了几个关于SD卡的项目,例如,定时拍照、定时录音等。对于这样的项目,基本上要求每一秒都在不停的写数据,而且一般一天工作好几个小时,甚至会不停的工作。在这些项目中,本人遇到太多的问题,下面把遇到的问题及解决方法与大家分享,希望有同样经验的网友一起分享一下您的经验。
不知道大家是否遇到过这些问题?本人开发了几个关于SD卡的项目,例如,定时拍照、定时录音等。对于这样的项目,基本上要求每一秒都在不停的写数据,而且一般一天工作好几个小时,甚至会不停的工作。在这些项目中,本人遇到太多的问题,下面把遇到的问题及解决方法与大家分享,希望有同样经验的网友一起分享一下您的经验。
4259
TA的帖子19
TA的资源版主
问题1:根目录下文件毁坏。
现象:在FatFs下可以读写文件,可在PC上无法打开目录,提示文件毁坏。
分析:通过WinHex软件打开磁盘,发现目录完全正常,但是FAT表已经毁坏,引起的原因可能是带电插拔。
解决:既然是FAT表与目录对不上,而且FAT毁坏,就是用PC修复也只会删除这些文件,对于我们的单片机来说,也没有好的解决方法,那就格式吧。
下面的代码用于判断FAT表是否和文件目录对应的上,使用的方法是:扫描FAT表,看看应用了多少簇,在通过读取FSInfo扇区的信息,看这两者是否一致。一致时为正确,不一致一般有问题。FatFs中并没有这个函数,是本添加的。后面我们可以调用这个函数实现FAT检查功能。 后面我们可以通过此函数的返回值,看是否要格式。
[ 本帖最后由 zhaojun_xf 于 2013-8-6 10:42 编辑 ]
现象:在FatFs下可以读写文件,可在PC上无法打开目录,提示文件毁坏。
分析:通过WinHex软件打开磁盘,发现目录完全正常,但是FAT表已经毁坏,引起的原因可能是带电插拔。
解决:既然是FAT表与目录对不上,而且FAT毁坏,就是用PC修复也只会删除这些文件,对于我们的单片机来说,也没有好的解决方法,那就格式吧。
下面的代码用于判断FAT表是否和文件目录对应的上,使用的方法是:扫描FAT表,看看应用了多少簇,在通过读取FSInfo扇区的信息,看这两者是否一致。一致时为正确,不一致一般有问题。FatFs中并没有这个函数,是本添加的。后面我们可以调用这个函数实现FAT检查功能。 后面我们可以通过此函数的返回值,看是否要格式。
[ 本帖最后由 zhaojun_xf 于 2013-8-6 10:42 编辑 ]
点评
这个情况确实是遇到过,不知道怎么弄,播放机里可以播放,但是电脑上显示不出来,只能凑合用了。 详情 回复
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题2:根目录正常,里边的文件夹毁坏。
现象:在FatFs下可以读写文件,可在PC上可以打开根目录,却无法里面的文件夹,提示文件毁坏。
分析:通过WinHex软件打开磁盘,发现目录完全正常,但是FAT表与目录数据对应不上,引起的原因可能是带电插拔。
解决:既然是FAT表与目录对不上,就是用PC修复也只会删除这些文件,对于我们的单片机来说,也没有好的解决方法,那就删除这个文件吧。
下面的代码用于判断用于判断是否可以在这个文件夹下新建文件,能新建就是正常的,否则异常,删除这个文件夹。
现象:在FatFs下可以读写文件,可在PC上可以打开根目录,却无法里面的文件夹,提示文件毁坏。
分析:通过WinHex软件打开磁盘,发现目录完全正常,但是FAT表与目录数据对应不上,引起的原因可能是带电插拔。
解决:既然是FAT表与目录对不上,就是用PC修复也只会删除这些文件,对于我们的单片机来说,也没有好的解决方法,那就删除这个文件吧。
下面的代码用于判断用于判断是否可以在这个文件夹下新建文件,能新建就是正常的,否则异常,删除这个文件夹。
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题3:文件大小为0字节,并且无法删除。
现象:文件已经存在,但在PC下无法删除,删除后会自动生成。
分析:既然文件已经创建,但没有内容,说明,文件打开后,写数据失败。
解决:既然文件已经新建,但没有写内容,我们可以在写内容失败后删除此文件,否则后面就删不掉了,只能格式了。
下面的代码用于判断文件是否读写正确,文件内容为0字节,而且写失败就删除。
现象:文件已经存在,但在PC下无法删除,删除后会自动生成。
分析:既然文件已经创建,但没有内容,说明,文件打开后,写数据失败。
解决:既然文件已经新建,但没有写内容,我们可以在写内容失败后删除此文件,否则后面就删不掉了,只能格式了。
下面的代码用于判断文件是否读写正确,文件内容为0字节,而且写失败就删除。
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题4:SD卡电源无法关断。
现象:通过I/O端口控制SD卡电源,关断后SD卡电源端还有2.9V左右的电压。
分析:不管用mos管还是电源芯片,通过I/O端口控制都应该截断电源,但事实上SD卡电源叫还是有电,原因是这些电压是通过SPI的4个端口串进去了,特别是片选管脚。
解决:既然是通过这几个管脚窜进去的,那么在关掉电源之前让这几个管脚都没有电压输入就可以了。
现象:通过I/O端口控制SD卡电源,关断后SD卡电源端还有2.9V左右的电压。
分析:不管用mos管还是电源芯片,通过I/O端口控制都应该截断电源,但事实上SD卡电源叫还是有电,原因是这些电压是通过SPI的4个端口串进去了,特别是片选管脚。
解决:既然是通过这几个管脚窜进去的,那么在关掉电源之前让这几个管脚都没有电压输入就可以了。
回复 支持 反对
1861
TA的帖子20
TA的资源五彩晶圆
精品贴子
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题5:临界代码。
现象:在操作文件系统时有时还没有读写完成,就断电或插拔SD卡。
分析:如果没有写完数据就直接断电或插拔会导致文件或文件系统毁坏。
解决:在对文件进行写操作时进来减小临界代码的尺寸。
我们可以尽量减少操作文件的时间,如果时间不能减少,我们可以减少临界代码的尺寸,可以在代码中添加f_sync()函数。例如下面的写WAV文件中,由于需要分别写入头和文件内容,我们可以再写入一段数据后添加一个同步还是。
现象:在操作文件系统时有时还没有读写完成,就断电或插拔SD卡。
分析:如果没有写完数据就直接断电或插拔会导致文件或文件系统毁坏。
解决:在对文件进行写操作时进来减小临界代码的尺寸。
我们可以尽量减少操作文件的时间,如果时间不能减少,我们可以减少临界代码的尺寸,可以在代码中添加f_sync()函数。例如下面的写WAV文件中,由于需要分别写入头和文件内容,我们可以再写入一段数据后添加一个同步还是。
回复 支持 反对
2579
TA的帖子0
TA的资源管理员
这个是好东西啊,现在手上好多SD卡,有几个就是不能格式化不能删除文件的,这回找到原因和解决的办法了!
点评
希望能帮你解决问题。。。。。。 详情 回复
回复 支持 反对
4259
TA的帖子19
TA的资源版主
回复 8楼eric_wang 的帖子
希望能帮你解决问题。。。。。。
点评
:titter: 我的卡删除照片自动能恢复回去,格式化都失败,这回可以解决了:lol 详情 回复
回复 支持 反对
2579
TA的帖子0
TA的资源管理员
回复 9楼zhaojun_xf 的帖子
我的卡删除照片自动能恢复回去,格式化都失败,这回可以解决了
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题6:FAT表与FSInfo信息不匹配。
现象:为了尽快操作文件,而不用通过FAT遍历就可以知道SD卡的存储状态,在FSInfo中存储了未使用簇数和空闲簇号,但某种原因导致FAT表中是实际使用情况与FSInfo中信息不匹配。
分析:FSInfo中的信息可以快速定位到SD卡中的空闲区域,如果这里的信息不正确,我们只能通过FAT表获取这些信息。如果SD卡很大,特别是应用了很大空间,从FAT表中获取这些信息非常缓慢。
解决:如果某处读写操作非常缓慢时,可能是FAT表与FSInfo中的信息不匹配,我们需要进行一次匹配以矫正FSInfo中的信息。
下面的代码可以通过扫描FAT区获取真正的空闲号和空余空间,同时矫正这些信息。
现象:为了尽快操作文件,而不用通过FAT遍历就可以知道SD卡的存储状态,在FSInfo中存储了未使用簇数和空闲簇号,但某种原因导致FAT表中是实际使用情况与FSInfo中信息不匹配。
分析:FSInfo中的信息可以快速定位到SD卡中的空闲区域,如果这里的信息不正确,我们只能通过FAT表获取这些信息。如果SD卡很大,特别是应用了很大空间,从FAT表中获取这些信息非常缓慢。
解决:如果某处读写操作非常缓慢时,可能是FAT表与FSInfo中的信息不匹配,我们需要进行一次匹配以矫正FSInfo中的信息。
下面的代码可以通过扫描FAT区获取真正的空闲号和空余空间,同时矫正这些信息。
回复 支持 反对
1240
TA的帖子1
TA的资源版主
绝对的好文章,需要大力支持一下啊!
点评
谢谢支持,希望对大家有用。。。。 详情 回复
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题7:文件毁坏。
现象:在FatFs下写入文件时,有时由于头没有写对,有时由于尾没有写读,导致文件文件打开。
分析:通过WinHex软件打开磁盘,发现文件内容不正确,有点缺头,有的缺尾。
解决:既然是文件头或未不正确,我们可以对其头或尾进行判断,不正确的可以删除掉。
下面的代码是以JPGE文件为例,如果JPGE文件的头和尾不正确时,图片显示不对,对于头不对时,显示无法打开,如果是尾不正确可以打开,但部分内容无法显示,只能显示部分图像。我们可以通过判断,把不正确的图片删除,保留也没有意义。此发可以应用到其他文件上,至于该判断头还是尾,根据文件更改。
现象:在FatFs下写入文件时,有时由于头没有写对,有时由于尾没有写读,导致文件文件打开。
分析:通过WinHex软件打开磁盘,发现文件内容不正确,有点缺头,有的缺尾。
解决:既然是文件头或未不正确,我们可以对其头或尾进行判断,不正确的可以删除掉。
下面的代码是以JPGE文件为例,如果JPGE文件的头和尾不正确时,图片显示不对,对于头不对时,显示无法打开,如果是尾不正确可以打开,但部分内容无法显示,只能显示部分图像。我们可以通过判断,把不正确的图片删除,保留也没有意义。此发可以应用到其他文件上,至于该判断头还是尾,根据文件更改。
回复 支持 反对
4259
TA的帖子19
TA的资源版主
回复 12楼cat3902982 的帖子
谢谢支持,希望对大家有用。。。。
回复 支持 反对
1万
TA的帖子37
TA的资源管理员
赞 :)
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题8:SD卡数据写入失败。
现象:在FatFs下写入文件时,有时会一次写入不了数据,有时会连续几次写入不了数据。
分析:写入不了数据,是一些存储异常或者SD卡异常导致,例如接触不良、内存或堆栈问题等。
解决:写不了数据并不意味做SD卡有问题,我们可以让设备重启,再写入数据。
如果连续几次写不了数据就格式化SD卡,势必导致SD卡中文件内容的丢失,为了把损失将到最低,我们可以让设备重启,如果仍然无法写入数据,再格式化SD卡。
现象:在FatFs下写入文件时,有时会一次写入不了数据,有时会连续几次写入不了数据。
分析:写入不了数据,是一些存储异常或者SD卡异常导致,例如接触不良、内存或堆栈问题等。
解决:写不了数据并不意味做SD卡有问题,我们可以让设备重启,再写入数据。
如果连续几次写不了数据就格式化SD卡,势必导致SD卡中文件内容的丢失,为了把损失将到最低,我们可以让设备重启,如果仍然无法写入数据,再格式化SD卡。
回复 支持 反对
4259
TA的帖子19
TA的资源版主
问题9:SD卡热插拔。
现象:在很都时候,我们都需要对SD卡进行热插拔操作,而我们知道,很多文件毁坏都是这样操作导致的。
分析:在读写SD卡时,突出断电由于文件并没有操作完成,会导致文件毁坏。
解决:在对SD卡进行插拔操作时,断掉SD卡的供电。
要读SD卡进行断电操作,可以有很多方法,例如,可以把SD卡锁在设备中,扒卡之前必须开锁,通过锁我们知道要对SD卡进行插拔了,所以,不能再对SD卡操作了,切断SD卡供电。在没有插入卡之前不能对SD卡供电。
当然我们还可以通过按键之类的东西实现,以保证不对SD卡带电操作即可。
转载处链接:
http://bbs.eeworld.com.cn/thread-377465-1-1.html
0 0
- SD卡应用总结(FatFs)
- SD卡应用总结(FatFs)
- [FatFs 学习] SD卡总结-SPI模式
- stm32 Fatfs 读写SD卡
- 连接fatfs与SD卡
- 利用MSP430F5438A单片机进行SD卡初始化——实战应用(四)与FatFs的整合1
- 关于SPI FLASH , SD卡 和 FatFs
- SD卡的读写和FatFS文件系统
- SD卡的读写和FatFS文件系统
- SD卡与fatfs文件系统(1)
- SD卡与fatfs文件系统(2)
- SD卡与fatfs文件系统(3)
- SD卡与fatfs文件系统(4)
- FatFs读写SD卡出现FR_NO_FILESYSTEM解决方法.
- SD卡与fatfs文件系统(1)
- SD卡与fatfs文件系统(2)
- SD卡与fatfs文件系统(3)
- SD卡与fatfs文件系统(4)
- C++单件
- python open 的写入读取方式
- iOS 新特性的设置版本配置
- MFC对于win32编程的封装细节
- hdu 5095模拟
- SD卡应用总结(FatFs)
- 迭代遍历Vector、LinkedList、ArrayList三种数据结构
- 字符串替换
- 解决bug小积累
- 积跬步,聚小流-------SQL SEVER对表的基本操作
- 禁止用户访问servlet
- JAVA学习第六十四课 — 反射机制
- HTTP常用状态码
- UVA - 10282 Babelfish