问题遇到的现象和发生背景
使用CUBEMX生成关于SDIO+DMA+FATFS
遇到的现象和发生背景,请写出第一个错误信息
使用f_mount搭载SD卡错误返回硬件错误
使用CUBEMX生成关于SDIO+DMA+FATFS
使用f_mount搭载SD卡错误返回硬件错误
SDIO:
卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输 1 位命令或数据。对于多媒体卡 V3.31 协议,时钟频率可以在 0MHz 至 20MHz 间变化;对于多媒体卡 V4.0/4.2 协议,时钟频率可以在 0MHz 至 48MHz 间变化;对于 SD 或 SD I/O 卡,时钟频率可以在 0MHz 至 25MHz间变化。
SDIO 适配器时钟(SDIOCLK):该时钟用于驱动 SDIO 适配器,来自 PLL48CK,一般为48Mhz,并用于产生 SDIO_CK 时钟(当系统时钟为 180M 的时候,PLL48CK=45Mhz)
前面提到,我们的 SD 卡时钟(SDIO_CK),根据卡的不同,可能有好几个区间,这就涉及到时钟频率的设置,SDIO_CK 与 SDIOCLK 的关系(时钟分频器不旁路时)为:
SDIO_CK=SDIOCLK/(2+CLKDIV)
FATFS:
ffconf.h
1)_FS_TINY。这个选项在 R0.07 版本中开始出现,之前的版本都是以独立的 C 文件出现
(FATFS 和 Tiny FATFS),有了这个选项之后,两者整合在一起了,使用起来更方便。我们使
用 FATFS,所以把这个选项定义为 0 即可。
2)_FS_READONLY。这个用来配置是不是只读,本章我们需要读写都用,所以这里设置
为 0 即可。
3)_USE_STRFUNC。这个用来设置是否支持字符串类操作,比如 f_putc,f_puts 等,本章
我们需要用到,故设置这里为 1。 4)_USE_MKFS。这个用来定时是否使能格式化,本章需要用到,所以设置这里为 1。 5)_USE_FASTSEEK。这个用来使能快速定位,我们设置为 1,使能快速定位。
6)_USE_LABEL。这个用来设置是否支持磁盘盘符(磁盘名字)读取与设置。我们设置
为 1,使能,就可以通过相关函数读取或者设置磁盘的名字了。
7)_CODE_PAGE。这个用于设置语言类型,包括很多选项(见 FATFS 官网说明),我们
这里设置为 936,即简体中文(GBK 码,需要 c936.c 文件支持,该文件在 option 文件夹)。
8)_USE_LFN。该选项用于设置是否支持长文件名(还需要_CODE_PAGE 支持),取值范
围为 03。0,表示不支持长文件名,13 是支持长文件名,但是存储地方不一样,我们选择使
用 3,通过 ff_memalloc 函数来动态分配长文件名的存储区域。
9)_VOLUMES。用于设置 FATFS 支持的逻辑设备数目,我们设置为 3,即支持 3 个设备。
10)_MAX_SS。扇区缓冲的最大值,一般设置为 512。
11)_FS_EXFAT。用于定义是否支持 exFAT 文件系统,我们设置为 1,以支持 exFAT 文件系统。