回答

收藏

野火i.MX RT1052 MINI试用-7-FatFS实验

其他 其他 4211 人阅读 | 0 人回复 | 2018-07-12

本帖最后由 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卡
  1. while(USDHC1_Init())  
  2.         {
  3.        printf("\r\n SD Card Error! \r\n");
  4.        delay_ms(500);                                       
  5.        printf("\r\n Please Check! \r\n");
  6.        delay_ms(500);
  7.         }
复制代码
        (3)初始化FatFS并挂载SD卡
  1. exfuns_init();                          // 为FatFS相关变量申请内存
  2.   f_mount(fs[0],"0:",1);             // 挂载SD卡
复制代码
                f_mount函数在ff.c文件的第3493行,声明如下。
  1. /*-----------------------------------------------------------------------*/
  2. /* Mount/Unmount a Logical Drive                                         */
  3. /*-----------------------------------------------------------------------*/
  4. FRESULT f_mount (
  5.         FATFS* fs,                        /* Pointer to the filesystem object (NULL:unmount)*/
  6.         const TCHAR* path,        /* Logical drive number to be mounted/unmounted */
  7.         BYTE opt                        /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */
  8. )
复制代码
         (4) 读取SD卡信息
  1. while(exf_getfree("0:",&total,&free))           // 获取SD卡的总容量和剩余容量
  2.         {
  3.         printf("\r\n SD Card Fatfs Error! \r\n");
  4.         delay_ms(200);
  5.         }                                                                                                                                      
  6.   printf("\r\n FATFS OK! \r\n");
  7.         printf("\r\n SD Total Size:  %d   MB \r\n" ,total>>10);
  8.         printf("\r\n SD  Free Size:  %d   MB \r\n",free>>10);
复制代码
           (5)对SD卡进行读操作。打开SD卡根目录下的文件data.txt,这里,SD卡中没有这个文件,所以就创建此文件。
  1. res = f_open(file, "0:/data.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE );

  2.   if( res != FR_OK )
  3.      printf("\r\n f_open() fail.. \r\n");
  4.         else
  5.      printf("\r\n f_open() success.. \r\n");
复制代码
            (6)对SD卡进行写操作。在(5)基础上,向相应文件写入字符串(下一次实验可以尝试open/puts一个图像文件)。
  1. res = f_lseek(file,file->fptr);        

  2.         n = f_puts("\r\n hello mabo..\r\n", file) ;     //  向文件写入字符串
  3.         if( n<1 )  // 判断写操作是否成功
复制代码
              (7)关闭文件,卸载SD卡
  1. f_close(file);
  2.         f_mount(fs[0],"0:",0);
复制代码
        6. 实验效果图。左下图为串口输出结果,右下图为windows下sd卡的读取效果(J盘里有一个data.txt文件,里面有相应字符串“\r\n hello mabo.. \r\n”)。



分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条