原创 microSD卡SPI模式读写及FATfs移植(基于c8051f340)

2010-12-31 18:40 12794 6 43 分类: MCU/ 嵌入式

2009年6月4日星期四


       花了不到一个月,SD卡的SPI模式读写与FATfs文件系统的移植告一段落了,写下来为大家一个提供参考。


硬件(如图1、2、3):


(1)       新华龙BT F340开发评估板,c8051f340时钟频率最大48MHz,集成SPI、UART控制器,4K+256字节的RAM,64K的FLASH;U-EC5仿真器;


(2)       4片MicroSD卡(又叫TF卡):KingMax-2G,KingSton-2G,SanDisk-2G,SanDisk-Ultra-2G。一片SD卡适配器,一个microSD卡 读卡器;


(3)       一块面包板,一条串口线,电阻、电容、电线若干;


(4)       万用表、示波器、烙铁、PC。。。其他


 93a03822-d4ea-4259-a510-663b35781cdb.JPG

                  图1 测试平台

13c89e97-65a1-484a-aa18-a9bf0fbdddfe.JPG



                  图2 面包板


 282c9346-2e28-447c-b371-84b7e1b0890c.JPG


                  图3 microSD卡适配器


软件:


(1)       Silabs-IDE(需KEILC编译器);


(2)       WinHex;


(3)       Windows超级终端。


 


程序:


(1)       spi.h,spi.c 包括SPI总线数据发送接收函数;


(2)       sd.h,sd.c  包括SD卡初始化、块读写等函数;


(3)       uart.h,uart.c 包括括串口发送接收函数;


(4)       diskio.h,diskio.c 包括移植FATfs需要的函数;


(5)       ff.h,ff.c,integer.h 包括FATfs文件系统;


(6)       mcu_init.h,mcu_init.c 包括C8051F340单片机硬件初始化函数;


(7)       test1_main.c 包括main函数和一些测试函数;


程序源码下载 


 


调试需要注意的问题:


(1)       卡各个引脚电平必须正确:DI,DO,CLK加上拉电阻(也可不加);


(2)       首先应测试卡是否能正确初始化,初始化时SPI时钟为100K~400K;


 


参考:


(1)       SanDisk Secure Digital Card Product Manual Version2.2


(2)       Microsoft Extensible Firmware Initiative FAT32 File System Specification


(3)       www.dharmanitech.com(主要参考,非常好)


(4)       Chan fs: http://elm-chan.org/fsw/ff/00index_e.html


 


2010年11月27日补充:(编辑一下帖子,结果图片和程序包包都不见了,过两天再给大家弄上来)


      从发此文以来,经常有网友发来邮件请教相关问题,由于时隔一年有余,很多东西都忘掉了,而且大家遇到的问题我当时可能没有遇到,实在无法回复大家,今天查看邮件时又有网友咨询,我就在电脑里翻箱倒柜的找到一个当时写的很简单的调试记录发上来供大家参考吧。内容如下:



调试过程中遇到的问题:


(1) SanDisk ultra卡初始化读写成功,但换成其他的卡后初始化失败,调整SPI时钟速度也不行。最后测试SCK,DO和CS引脚电平,发现CS在高电平时还不到1V,大约80mV,通过换CS引脚到P2.1问题解决;


(2) SanDisk、KingSton、KingMax卡初始化成功,但唯独KingMax卡在读写过程中失败,改变SPI时钟速率(变慢)问题解决;


(3) 在读写单块、多块函数中,变量retry如果设为unsigned char型,比较时(retry>0xfe)容易出现读写失败,把retry设为unsigned int型,并retry>0xfffe后,问题解决;


(4) KingSton卡在读单块、读多块成功后,开始在第1000块处写单块、写双块,成功后开始文件读写测试:写一个512字节的文件,按理论不够一簇(这里为4K),但空间需占一簇(4K),加上格式化后已占用的一簇(4K),应该已用8K,但发现已用空间为1M,且删除该文件后占用空间仍为1M。把第1000块写改为第10000块写后问题解决。分析:可能第1000块有一些分区数据,在写1000块过程中覆盖了一些信息。


(5) SanDisk-2G标准卡热拔插后,初始化失败,MCU手动复位后初始化成功。在初始化函数中,发送两次CMD1问题解决;


(6) KingSton、KingMax卡写完多块后再读多块出错。把while(!SPI_receive())改为while(SPI_receice()!=0xff)后问题解决。



其他:


(1) FATfs中的Block、Sector概念和SD卡定义的相反;


(2) 各类盘在格式化成FAT32后已用空间为4K或1K,个人认为已用的空间为根目录所占用。4K其实为1个簇的大小,此簇包含8个sector,即8*512Byte=4096B=4KB;1K为簇是2个sector的情况,因此从格式化后已用空间大小就可知该盘分配簇的大小。


以上仅供参考。:)

PARTNER CONTENT

文章评论37条评论)

登录后参与讨论

用户553391 2015-9-10 00:49

很好的SD卡文件访问代码,多谢了。

用户1615962 2014-11-27 15:52

不错,学习了,正好用得着

用户1774161 2014-7-24 00:05

不错,看看呢

用户1149759 2014-2-26 00:16

感谢

用户1614911 2013-12-6 10:50

果然很厲害,哎 我要變強啊

用户1050384 2013-11-11 16:23

不错,谢谢

用户310719 2013-6-25 08:18

xiexiee

用户1432478 2013-1-19 20:01

学习谢谢。。。

用户1384978 2012-12-3 11:37

不错,谢谢 !!!

用户295332 2012-10-8 14:10

不错,谢谢
相关推荐阅读
用户141063 2008-12-08 20:09
清华大学校长留给毕业生的一段话
未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要!”                                                     ...
用户141063 2008-10-18 11:56
阻抗匹配
阻抗匹配是指信号源或者传输线跟负载之间的一种合适的搭配方式。阻抗匹配分为低频和高频两种情况讨论。 <?xml:namespace prefix = o ns = "urn:schemas-mic...
用户141063 2008-08-31 09:45
决定高薪必要的细节守则
作者:贾忠贤 转自chinaren: http://i.chinaren.com/group/msg/12331/15987338点到10点之间,是在有目的性阅读,还是为明天的事情做准备,甚至在充电专...
用户141063 2008-08-28 19:33
脑子脱线那一刻...
别人的。。。●有一次坐公交拿了IC卡排队上车,前面一个人是扔硬币的,我大脑短路跟着把IC卡扔进去了……●早上要戴隐形眼镜,结果把盖打开直接把眼镜倒马桶里,然后镇定地倒入新的护理液,准备摘眼镜,半天摘不...
用户141063 2008-08-17 12:58
KEIL产生WARNINGL15: MULTIPLE CALL TO SEGMENT的原因及解决方法
.***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?。。。?。。。CALLER1: ?。。。?MAINCALLER2: ?C_C51STARTUP该警...
EE直播间
更多
我要评论
37
6
关闭 站长推荐上一条 /3 下一条