TA的每日心情 | 开心 2019-6-20 14:08 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
|
本帖最后由 mabo124 于 2018-7-13 00:05 编辑
这周学习进行基于RT1052下的FatFS读写SD卡实验,参考原子哥的例程为模板(本想参考原子哥的例程,自己移植FatFS,结果尝试了3天,最终放弃了),添加了读写sd卡操作,为下一步存储照片做好打好基础。这里总结如下。
1. FatFS是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它不需要做任何修改,便可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等。
2.MicroSD卡原理图
(1) MicroSD卡 和 SD卡的区别在于不同的协议,外观和速度都不同,但是存储方式一样。
(2)Micro SD Card,原名Trans-flash Card(TF卡)是一种极细小的快闪存储器卡,其主要应用于移动电话、GPS设备、便携式音乐播放器和一些快闪存储器盘中。
(3) SD卡是安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(外语缩写PDA)和多媒体播放器,是目前消费数码设备中应用最广泛的一种存储卡。
查的资料可知,SD卡有两种操作接口:SDIO和SPI。 使用SDIO口的速度比较快,SPI的速度比较慢 。这里Micro SD卡也有相应两种接口。
野火 RT1052的原理图采用的SDIO接口方式。
3. Fatfs 移植。FatFs 软件包括以下文件。
ffconf.h FatFs 模块配置文件
ff.h FatFs 和应用模块公用的包含文件
ff.c FatFs 模块
diskio.h FatFs and disk I/O 模块公用的包含文件
integer.h 数据类型定义
option 可选的外部功能
diskio.c FatFs 与disk I/O 模块接口层文件(不属于 FatFs 需要由用户提供)
4. SD卡驱动
SD卡的驱动使用的fsl提供库文件fsl_sd.c、fsl_sdmmc_event.c、fsl_sdmmc_host.c和fsl_sdmmc_common.c。
5. FATFS的应用示例
(1) 初始化RT1052系统工作(此处省略)
(2)检查SD卡
- while(USDHC1_Init())
- {
- printf("\r\n SD Card Error! \r\n");
- delay_ms(500);
- printf("\r\n Please Check! \r\n");
- delay_ms(500);
- }
复制代码 (3)初始化FatFS并挂载SD卡
- exfuns_init(); // 为FatFS相关变量申请内存
- f_mount(fs[0],"0:",1); // 挂载SD卡
复制代码 f_mount函数在ff.c文件的第3493行,声明如下。
- /*-----------------------------------------------------------------------*/
- /* Mount/Unmount a Logical Drive */
- /*-----------------------------------------------------------------------*/
- FRESULT f_mount (
- FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/
- const TCHAR* path, /* Logical drive number to be mounted/unmounted */
- BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */
- )
复制代码 (4) 读取SD卡信息
- while(exf_getfree("0:",&total,&free)) // 获取SD卡的总容量和剩余容量
- {
- printf("\r\n SD Card Fatfs Error! \r\n");
- delay_ms(200);
- }
- printf("\r\n FATFS OK! \r\n");
- printf("\r\n SD Total Size: %d MB \r\n" ,total>>10);
- printf("\r\n SD Free Size: %d MB \r\n",free>>10);
复制代码 (5)对SD卡进行读操作。打开SD卡根目录下的文件data.txt,这里,SD卡中没有这个文件,所以就创建此文件。
- res = f_open(file, "0:/data.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE );
- if( res != FR_OK )
- printf("\r\n f_open() fail.. \r\n");
- else
- printf("\r\n f_open() success.. \r\n");
复制代码 (6)对SD卡进行写操作。在(5)基础上,向相应文件写入字符串(下一次实验可以尝试open/puts一个图像文件)。
- res = f_lseek(file,file->fptr);
-
- n = f_puts("\r\n hello mabo..\r\n", file) ; // 向文件写入字符串
- if( n<1 ) // 判断写操作是否成功
复制代码 (7)关闭文件,卸载SD卡
- f_close(file);
- f_mount(fs[0],"0:",0);
复制代码 6. 实验效果图。左下图为串口输出结果,右下图为windows下sd卡的读取效果(J盘里有一个data.txt文件,里面有相应字符串“\r\n hello mabo.. \r\n”)。
|
|