9126|6

114

帖子

3386

TA的资源

五彩晶圆(初级)

楼主
 

STM32笔记-SD卡的读写和FatFS文件系统(转) [复制链接]

因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!

  我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。

  FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。相关文件系统的介绍请看这里。

  这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。

      重要参考文章:

     转一篇比较详细介绍FatFs文件系统移植的文章

    1.rar (878.91 KB, 下载次数: 762)
    2.rar (878.91 KB, 下载次数: 581)
    3.rar (90.34 KB, 下载次数: 347)

    下面是我的代码: FATFS.rar (547.39 KB, 下载次数: 710)

  其中底层的SPI总线对SD卡的操作在SPI_SD_driver.c/h中,而FATFS的移植文件diskio.c中对磁盘的操作函数中将调用底层的操作函数。下面是一些底层操作函数:

  1. u8 SPI_ReadWriteByte(u8 TxData); //SPI总线读写一个字节
  2. u8 SD_WaitReady(void); //等待SD卡就绪
  3. u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令
  4. u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令,不断线
  5. u8 SD_Init(void); //SD卡初始化

  6. u8 SD_ReceiveData(u8 *data, u16 len, u8 release); //SD卡读数据
  7. u8 SD_GetCID(u8 *cid_data); //读SD卡CID
  8. u8 SD_GetCSD(u8 *csd_data); //读SD卡CSD
  9. u32 SD_GetCapacity(void); //取SD卡容量

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

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

  20. if(drv)
  21. {
  22. return STA_NOINIT; //仅支持磁盘0的操作
  23. }

  24. state = SD_Init();
  25. if(state == STA_NODISK)
  26. {
  27. return STA_NODISK;
  28. }
  29. else if(state != 0)
  30. {
  31. return STA_NOINIT; //其他错误:初始化失败
  32. }
  33. else
  34. {
  35. return 0; //初始化成功
  36. }
  37. }
复制代码


  总之FATFS文件系统具有很高的可移植性,经测试,在STM32的18MSPI时钟下,读文件的速度在每秒300K以上,写文件也有100多K的速度,应该说基本满足了嵌入式工程应用中,对磁盘读写的速度要求。如果进一步优化SD卡读写代码,速度应该还会有一定提高,同时还要注意的是FLASH自身读写速度没有ram那么快,通过更换SD卡发现读写速度和卡本身有直接的关系,所以应该尽量选择速度较快的卡。

来源:http://blog.ednchina.com/jjldc/190753/message.aspx
此帖出自stm32/stm8论坛

最新回复

好帖!!顶呀!  详情 回复 发表于 2012-5-8 17:43
点赞 关注
 

回复
举报

720

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
谢谢喽……学习一下哦……
此帖出自stm32/stm8论坛
 
 

回复

2639

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
谢谢分享
此帖出自stm32/stm8论坛
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

4
 

ding!!

顶一下!!!!!!!!!!!!!!!!!!!!!!!!!
此帖出自stm32/stm8论坛
 
 
 

回复

185

帖子

0

TA的资源

一粒金砂(初级)

5
 

回复 楼主 空气 的帖子

感谢楼主,正在学习使用呢,帮了很大的忙
此帖出自stm32/stm8论坛
 
个人签名加油学习,努力提高
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢喽……学习一下哦……
此帖出自stm32/stm8论坛
 
 
 

回复

1243

帖子

18

TA的资源

五彩晶圆(初级)

7
 

回复 楼主 空气 的帖子

好帖!!顶呀!
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【TI有奖直播报名中】
直播主题:MSPM0 系列 MCU 再添新成员:高性能与高性价比的优秀组合 MSPM0G351x / MSPM0L111x
直播时间:4月24日(周四)上午10:00
直播奖励:好礼等您拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 15

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表