搜索
bottom↓
回复: 315

九九的STM32笔记(七)SD卡的读写和FatFS文件系统

  [复制链接]

出0入0汤圆

发表于 2009-2-18 19:41:00 | 显示全部楼层 |阅读模式
因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!
  我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。
  FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。相关文件系统的介绍请看这里。
  这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。

重要参考文章:
ouravr上搜索fatfs
转一篇比较详细介绍FatFs文件系统移植的文章
点击此处下载 ourdev_419657.rar(文件大小:879K) (原文件名:1.rar)
点击此处下载 ourdev_419658.rar(文件大小:879K) (原文件名:2.rar)
点击此处下载 ourdev_419659.rar(文件大小:90K) (原文件名:3.rar)


  下面是我的代码:

  其中底层的SPI总线对SD卡的操作在SPI_SD_driver.c/h中,而FATFS的移植文件diskio.c中对磁盘的操作函数中将调用底层的操作函数。下面是一些底层操作函数:
u8 SPI_ReadWriteByte(u8 TxData);                                             //SPI总线读写一个字节
u8 SD_WaitReady(void);                                                           //等待SD卡就绪
u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc);                      //SD卡发送一个命令
u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc);  //SD卡发送一个命令,不断线
u8 SD_Init(void);                                                                      //SD卡初始化
                                 
u8 SD_ReceiveData(u8 *data, u16 len, u8 release);                   //SD卡读数据
u8 SD_GetCID(u8 *cid_data);                                                   //读SD卡CID
u8 SD_GetCSD(u8 *csd_data);                                                 //读SD卡CSD
u32 SD_GetCapacity(void);                                                     //取SD卡容量

u8 SD_ReadSingleBlock(u32 sector, u8 *buffer);                      //读一个sector
u8 SD_WriteSingleBlock(u32 sector, const u8 *buffer);           //写一个sector
u8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count);       //读多个sector
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count);  //写多个sector

  这是diskio.c中的一段代码,在disk初始化中,我们调用了SPI_SD_driver.c中的SD卡初始化函数。
DSTATUS disk_initialize (
    BYTE drv                /* Physical drive nmuber (0..) */
)
{
    u8 state;

    if(drv)
    {
        return STA_NOINIT;  //仅支持磁盘0的操作
    }

    state = SD_Init();
    if(state == STA_NODISK)
    {
        return STA_NODISK;
    }
    else if(state != 0)
    {
        return STA_NOINIT;  //其他错误:初始化失败
    }
    else
    {
        return 0;           //初始化成功
    }
}
  
  总之FATFS文件系统具有很高的可移植性,经测试,在STM32的18MSPI时钟下,读文件的速度在每秒300K以上,写文件也有100多K的速度,应该说基本满足了嵌入式工程应用中,对磁盘读写的速度要求。如果进一步优化SD卡读写代码,速度应该还会有一定提高,同时还要注意的是FLASH自身读写速度没有ram那么快,通过更换SD卡发现读写速度和卡本身有直接的关系,所以应该尽量选择速度较快的卡。


相关代码:
点击此处下载 ourdev_419656.rar(文件大小:547K) (原文件名:FATFS.rar)


我的博客中本文的地址,内有语法高亮的代码,方便阅读

出0入0汤圆

发表于 2009-2-18 20:33:40 | 显示全部楼层
路过!顶!

出0入0汤圆

发表于 2009-2-18 22:57:18 | 显示全部楼层

出0入0汤圆

发表于 2009-2-20 13:25:56 | 显示全部楼层
好。。顶下

出0入0汤圆

发表于 2009-2-20 14:24:05 | 显示全部楼层
好东西,标记一下

出0入0汤圆

发表于 2009-2-20 14:54:41 | 显示全部楼层
Mark一下!

出0入0汤圆

发表于 2009-2-20 21:42:57 | 显示全部楼层
LZ 好人
也是高手 敬佩一下
顺带MARK!

出0入0汤圆

发表于 2009-2-20 21:56:11 | 显示全部楼层
顶  好!

出0入0汤圆

发表于 2009-2-20 22:19:44 | 显示全部楼层
有个问题想请教楼主很久了,为什么你的程序和资料中都没有处理或提到“数据对齐”的问题??是我没注意到吗?

出0入0汤圆

发表于 2009-2-21 10:48:05 | 显示全部楼层
hao

出0入0汤圆

发表于 2009-3-10 21:34:16 | 显示全部楼层
经过实际测试
有些卡可以初始化,有些不行。
可能驱动还不够完善。

出0入0汤圆

发表于 2009-3-10 21:52:45 | 显示全部楼层
好东西,学习下

出0入0汤圆

发表于 2009-3-12 12:43:09 | 显示全部楼层
参考楼主的源代码
自己编写了FATFS 测试菜单
参见:

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=3238182&bbs_page_no=1&bbs_id=3020

出0入0汤圆

发表于 2009-3-12 20:55:38 | 显示全部楼层
这个FatFS和电脑兼容吗

出0入0汤圆

发表于 2009-3-18 19:48:52 | 显示全部楼层
狂顶

出0入0汤圆

发表于 2009-3-19 21:58:00 | 显示全部楼层
首先感谢楼主分享这么好的资料,我有个SD卡初始化问题想问问.
我之前也把fatfs移植到avr上,在sd卡初始化时我是先发ACMD41,判断卡的类型(SD还是MMC).
在SD标准中好像也这么说,看下图,


(原文件名:sd.JPG)

但看到楼主程序中SD_init()是先发送的是下面这个命令,请问这是什么命令?

    //获取卡片的SD版本信息
    r1 = SD_SendCommand_NoDeassert(8, 0x1aa, 0x87);

出0入0汤圆

发表于 2009-3-21 10:45:23 | 显示全部楼层
真不错

出0入4汤圆

发表于 2009-4-16 21:16:53 | 显示全部楼层
顶下,不错

出0入0汤圆

发表于 2009-4-16 21:41:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-6 15:33:22 | 显示全部楼层
cool 啊

出0入0汤圆

发表于 2009-6-8 16:29:40 | 显示全部楼层
总觉得“移植”很深奥,看不懂,看来只能找个开发板来试验了。将会是以巨大工程....

出0入0汤圆

发表于 2009-6-11 18:25:34 | 显示全部楼层
SO GOOD!

出0入0汤圆

发表于 2009-6-16 14:56:50 | 显示全部楼层
暑假我研究这个,先作记号,谢谢LZ分享

出0入0汤圆

发表于 2009-6-18 21:27:27 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-6-24 12:58:04 | 显示全部楼层
九九 你好!
   请教个问题,这几天在做Fatfs-tiny的移植,CPU是LPC2103,开发环境是ADS1.2.读写目标是一张2G的 SD卡,在网上找了个SPI读写SD的程序移植了,很顺利,十几分钟就搞定了。但是到了fatfs的移植就不是太顺利了,折腾了一天终于算是可以在SD卡中创建txt文档了,其中的参考了你博客里面的一些内容(编译器问题),在此表示感谢!但是我向这个txt文档写数据之后,拿到PC机上打开却发现所建文档是0KB,双击后,提示“文件或目录损坏且无法读取”。这是为什么啊?下面是我的完整的代码,还望指点一二,小弟在此感激不尽!!!
http://www.ourdev.cn/bbs/bbs_upload298762/files_16/ourdev_455679.rar(原文件名:Intelligent Charger.rar)

出0入0汤圆

发表于 2009-8-12 11:44:51 | 显示全部楼层
研究ing

出0入0汤圆

发表于 2009-8-12 15:58:42 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-8-13 00:24:56 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-8-13 07:59:13 | 显示全部楼层
99又有新作啦。。

出0入0汤圆

发表于 2009-8-19 15:51:53 | 显示全部楼层
好贴留名

出0入0汤圆

发表于 2009-8-21 14:39:52 | 显示全部楼层
好贴回一下

出0入0汤圆

发表于 2009-8-24 16:41:23 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-8-28 14:11:00 | 显示全部楼层
标记,学习

出0入0汤圆

发表于 2009-8-30 01:42:14 | 显示全部楼层
使用STM32操作SD卡的话,应该考虑使用它的SD接口功能,以及配合DMA,这样才能最好的发挥STM32的功能,也更有实际应用的价值了。

我手上ST公司送的STM3210E-LK学习板的DEMO说是可以读SD卡,我初看了代码,是使用SD接口以及配合DMA编写的,本想测试一下性能如何,操作时间等,可是一试只能在PC上看到卡,根本打不开,连格式化都做不了。实际该例子是做成了一个读卡器,当然就使用了USB接口,不知道是哪部分的BUG。

好象网上还没类似比较好的例子。

出0入0汤圆

发表于 2009-9-7 12:16:36 | 显示全部楼层
留名

出0入0汤圆

发表于 2009-9-7 17:50:19 | 显示全部楼层
好东西 狂顶

出0入0汤圆

发表于 2009-9-11 09:51:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-25 13:49:11 | 显示全部楼层
好东西,学习了 多谢楼主分享

出0入0汤圆

发表于 2009-9-25 22:16:49 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2009-9-25 22:44:40 | 显示全部楼层
学习九九

出0入4汤圆

发表于 2009-9-27 10:09:43 | 显示全部楼层
留下标记,学习学习。。。

出0入0汤圆

发表于 2009-9-28 16:37:44 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2009-10-1 08:40:30 | 显示全部楼层
学习下文件系统

出0入0汤圆

发表于 2009-10-9 09:08:33 | 显示全部楼层
hao 学习

出0入0汤圆

发表于 2009-10-26 10:22:40 | 显示全部楼层
mark!我正在往m128上移植,不知可行不?

出0入0汤圆

发表于 2009-10-29 17:22:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-2 18:57:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-2 20:24:42 | 显示全部楼层
第一次回贴。我顶

出0入0汤圆

发表于 2009-12-5 21:12:59 | 显示全部楼层
好东西

出0入0汤圆

发表于 2009-12-15 22:18:15 | 显示全部楼层
好东西  以后来取  谢谢

出0入0汤圆

发表于 2009-12-16 14:05:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-28 08:51:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-6 10:41:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-10 16:32:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-19 17:40:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-22 13:00:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-24 12:14:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-2 11:26:57 | 显示全部楼层
楼主你好,我现在做的文件系统可以完成读写问题了,但是在查询Ka空间状态的时候遇到了难点,就是不知道用什么办法遍历目录,觉得
FRESULT f_opendir (
        DIR *dirobj,                /* Pointer to directory object to create */
        const char *path        /* Pointer to the directory path */
)

FRESULT f_readdir(DIR *dirobj,FILINFO *finfo)
两个函数可以实现我查询各文件大小的目的,但是不知道怎么才能做到啊

出0入0汤圆

发表于 2010-3-2 11:30:16 | 显示全部楼层
现在介绍一下我的文件系统的基本情况:我的文件系统只有一个根目录,短文件名的,现在想通过遍历目录的方法确定,卡里面的文件已经占用的空间,现在想实现的第一步是找到一个文件,查询文件信息(fname和fsize)....

出0入0汤圆

发表于 2010-3-2 15:11:14 | 显示全部楼层
围观一下啦,

出0入0汤圆

发表于 2010-3-11 16:22:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-17 13:26:26 | 显示全部楼层
看看

出0入0汤圆

发表于 2010-3-17 13:33:19 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2010-4-3 10:57:42 | 显示全部楼层
mark,正在学习fat

出0入0汤圆

发表于 2010-4-4 15:05:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-9 18:35:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-11 00:16:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-17 19:26:19 | 显示全部楼层
谢谢分享,先收藏了。

出0入59汤圆

发表于 2010-4-17 19:55:26 | 显示全部楼层
参考,学习,谢谢!

出0入0汤圆

发表于 2010-4-17 23:15:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-18 00:50:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-18 01:43:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-18 12:37:48 | 显示全部楼层
标记 SD卡的读写和FatFS文件系统

出0入0汤圆

发表于 2010-4-18 20:33:41 | 显示全部楼层
再标记一下。

出0入0汤圆

发表于 2010-4-19 18:21:42 | 显示全部楼层
mark

出0入42汤圆

发表于 2010-4-25 22:48:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-2 22:23:49 | 显示全部楼层
O(∩_∩)O哈哈~

出0入0汤圆

发表于 2010-5-2 22:28:10 | 显示全部楼层
好滴,尿个记号

出0入0汤圆

发表于 2010-5-3 15:51:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-3 15:57:15 | 显示全部楼层
九九改完STM32了啊?还做智能车生意么?

出0入0汤圆

发表于 2010-5-6 18:35:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-6 18:47:30 | 显示全部楼层
标记下,回头看

出0入0汤圆

发表于 2010-5-11 21:04:58 | 显示全部楼层
好东西,谢谢楼主

出0入0汤圆

发表于 2010-6-1 17:46:35 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-6-1 20:31:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-9 18:05:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-10 09:16:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-13 22:24:12 | 显示全部楼层
学习了~

出0入0汤圆

发表于 2010-6-15 15:00:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-9 14:10:09 | 显示全部楼层
顶了

出0入0汤圆

发表于 2010-7-12 19:25:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-13 14:01:58 | 显示全部楼层
继续顶啊

出0入0汤圆

发表于 2010-7-13 15:29:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-14 20:36:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-14 21:37:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-15 08:30:08 | 显示全部楼层
楼主强悍~高人~学习了~

出0入0汤圆

发表于 2010-7-16 10:24:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-7-16 10:56:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-16 12:01:04 | 显示全部楼层
回复【楼主位】jjldc 九九
-----------------------------------------------------------------------

正好用的到

出0入0汤圆

发表于 2010-7-19 22:13:37 | 显示全部楼层
太好了,现在正在学习SD和stm,感谢楼主分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 11:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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