基于stm32、spi协议的Fatfs文件系统移植(附完整代码下载)

开发环境:Window 7 32bit
开发工具:Keil uVision4
硬件:stm32f103vct6

目录

1.硬件设计:

2.软件设计

1.SPI收发数据

2.向SD卡发送的命令格式:

3.SD卡应答命令的响应

4.SD卡初始化流程

 3.下载验证

4.注意事项

5.实验可改进的地方 


 

前言:已经有段时间没有写博客了,可能是事有点多(是我懒...额),最近又想来写一些;这次做的是stm32和SD卡的应用。SD卡的使用都很普遍,但是在单片机上的应用却少;我们知道单片机的处理速度有限,在大文件、大数据面前,根本是发挥不了作用的。但是因为SD卡价格优惠性价比很高,而在某些场合需要常年工作的单片机,可用它来记录单片机收集的数据;同时也可以通过SD卡给单片机更新自身程序(iap升级)等。接下来要做的是,利用stm32通过spi外设,驱动SD卡;当然如果要从SD卡上读取、写入文件,还需要移植文件系统,我选的是Fatfs(一个免费开源的文件系统)。

点击下载SD卡2.0协议

点击下载本实验源码

下载fatfs系统源码:

官网地址:http://elm-chan.org/fsw/ff/00index_e.html,拉到下面点击 Previous Releases,选择0.11a版本点击下载。

下载解压后,有两个文件夹,doc文件夹是帮助文档,src里面是是源码。
doc里面很多资料,详细介绍了fatfs系统的架构和使用说明,一些接口函数不明白怎么使用的话可以在里面找到说明。下面介绍src文件:

option文件夹:可选的的扩展功能,比如支持中文。我这次没有用到它。
00history:版本记录。官网每发布一次版本都会记录更改或者添加了那些功能,里面还有日期,可以看到它进化的历程。
00readme:这个文件里面就是做着我现在做的事情,说明每个文件的作用。
diskio.c: 这个是接口层文件,与芯片外设相关,里面有些函数需要我们实现,需要我们修改。
diskio.h:头文件里面声明的函数是让ff.c文件调用的,不需要我们修改。
ff.c:fatfs模块源码,核心东西,需要一定的代码能力才能看懂,不需要我们修改。
ff.h:fatfs模块应用接口,不需要我们修改。
ffconf.h关键参数配置,配置一些宏的值, 不同的值满足不同的需求,需要我们修改。
integer.h数据类型定义,与编译器有关,一般不需要修改。

接下我们要做两个事情,修改diskio.c文件和ffconf.h文件。
先说一下ffconf.h的配置,我只是改了下面两个宏:

#define _VOLUMES	5 //支持的逻辑设备数
#define _FS_NORTC	0 //暂时不加入RTC,先关闭, 不然编译报错;因为打开的话要实现get_fattime()来获取RCT时间

关于其他的宏暂时不改动,每个宏所起的作用在源码里有详细的英文说明,可以了解一下。
再说一下diskio.c文件,里面共有5个函数分别是:

/*
功能:设备初始化函数
参数:pdrc是设备号,fatfs系统可以同时挂载多个设备(SD卡、MMC等)
*/
DSTATUS disk_initialize (BYTE pdrv);
/*获取设备状态*/
DSTATUS disk_status (BYTE pdrv);
/*
功能:从设备读取若干个扇区的数据
buff: 读取的数据存放的地址
sector:扇区地址
count:所读取的扇区总个数
*/
DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
/*
功能:往设备写入若干个扇区的数据
buff: 写入的数据地址
sector:扇区地址
count:所写的扇区总个数
*/
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
/*
功能:设备控制,或获取设备的参数
pdrv:设备号
cmd:命令
buff:发送/接收缓冲区指针
*/
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);

 上面提到的扇区可能大家会有疑问,不同的设备,扇区大小不一样。SD卡每个扇区是512字节,型号W25Q128FV的spi Flash芯片每个扇区是4096字节。如果我用的是这个Flash芯片,那么在ffconf.c里面的_MAX_SS就要改大才能兼容。可见fatfs可兼容不同的扇区大小的设备。由上面参数可见读、写都是以扇区为单位,一个设备根据容量的不同,会分成若干个扇区。

再者,上面的每一个函数都有pdrv参数,为了兼容多个或者不同的设备,在上面每个函数里面会有一个switch分支,来区别具体要操作哪个设备,我只使用一个SD卡,所以只需要增加一个分支即可。

对于stm32来说,在提供的库函数就有spi外设的使用接口函数,非常方便,但这仅仅是数据的收发;想要从SD卡中读取信息,读/写扇区数据,还需要了解SD卡的通讯协议(通讯协议有几个版本网上有公开资料,可自行选择了解)。在stm32的标准库跟fatfs系统之间还需要一个中间层。它的作用是根据通讯协议提供的命令参数,从SD卡里获取设备型号、容量、设备状态、读/写扇区等操作,这也是这次讲解的重点。

diskio.c文件具体的改动这里不细说,直接看我的源码,接下来就要开始动手了(我怕我再啰嗦的话可能就留不住人了)。

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F4是STMicroelectronics推出的一款高性能微控制器系列,它集成了SPI(串行外设接口)功能,可用于与SD卡进行数据通信。为了在STM32F4上进行SD卡访问,可以使用FATFS文件系统进行移植。 首先,需要获取STM32F4系列的开发板以及SD卡模块。通过将SD卡模块连接到STM32F4的SPI接口上,并进行正确的硬件连接,以便能够进行数据传输。 接下来,在STM32CubeMX中进行配置,选择正确的引脚和SPI外设。设置相应的时钟频率,以确保SD卡能够正确工作。然后生成代码,导出到开发环境中。 在开发环境中打开生成的工程文件,找到对应的SPISD卡的初始化函数。根据需要修改SPI的参数,如通信速率、数据长度等。 接着,可以使用FATFS文件系统进行SD卡访问的移植。首先需要下载FatFs库,并将其添加到工程中。 然后,需要配置FATFS库,包括选择正确的文件系统类型(如FAT32),设置合适的SD卡的盘符等。可以使用FATFS库提供的函数进行SD卡的挂载、卸载等操作。 在主程序中,可以使用FATFS库提供的函数进行读写文件的操作。通过打开文件、写入数据、读取数据等方式,实现对SD卡中文件的访问。 最后,进行编译和下载,将代码烧录到STM32F4开发板中。 总之,通过合适的硬件连接、配置SPI外设和SD卡模块的初始化,以及引入FatFs库,并根据需要进行相应的配置,就可以在STM32F4上实现与SD卡的数据交互,并使用FATFS进行文件系统移植和访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值