SD卡的读写和FatFS文件系统

22 篇文章 0 订阅

作者:xidongs

转自:http://www.cnblogs.com/xidongs/archive/2011/02/07/1949628.html


因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!
  我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。
  FatFs文件系统体积蛮小,6-7K足矣,对于128KflashSTM32来说很合适,代价不大。同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。相关文件系统的介绍请看这里
  这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=3210864&bbs_page_no=1&bbs_id=3020

  下面是我的代码:

  其中底层的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);                                                   
//SDCID
u8 SD_GetCSD(u8 *csd_data);                                                 
//SDCSD
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文件系统具有很高的可移植性,经测试,在STM3218MSPI时钟下,读文件的速度在每秒300K以上,写文件也有100K的速度,应该说基本满足了嵌入式工程应用中,对磁盘读写的速度要求。如果进一步优化SD卡读写代码,速度应该还会有一定提高,同时还要注意的是FLASH自身读写速度没有ram那么快,通过更换SD卡发现读写速度和卡本身有直接的关系,所以应该尽量选择速度较快的卡。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值