首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32的FATFS文件系统移植笔记(4)

STM32的FATFS文件系统移植笔记(4)

复制代码MSD0_WriteSingleBlock()和MSD0_WriteMultiBlock()函数都是SD卡操作的底层函数,我们在SPI_MSD0_Driver.c文件中实现。
    7、实现disk_ioctl()函数
        该函数在磁盘格式化、获取文件系统信息等操作时会被调用。
        实现后的程序如下:
  • DRESULT disk_ioctl (
  •                 BYTE drv,                /* Physical drive nmuber (0..) */
  •                 BYTE ctrl,                /* Control code */
  •                 void *buff                /* Buffer to send/receive control data */
  •         )
  •         {
  •                 if (drv==0)
  •                 {
  •                         MSD0_GetCardInfo(&SD0_CardInfo);
  •                         switch (ctrl)
  •                         {
  •                                 case CTRL_SYNC :
  •                                         return RES_OK;
  •                                 case GET_SECTOR_COUNT :
  •                                         *(DWORD*)buff = SD0_CardInfo.Capacity/SD0_CardInfo.BlockSize;
  •                                 return RES_OK;
  •                                 case GET_BLOCK_SIZE :
  •                                         *(WORD*)buff = SD0_CardInfo.BlockSize;
  •                                 return RES_OK;
  •                                 case CTRL_POWER :
  •                                         break;
  •                                 case CTRL_LOCK :
  •                                         break;
  •                                 case CTRL_EJECT :
  •                                         break;
  •                         /* MMC/SDC command */
  •                                 case MMC_GET_TYPE :
  •                                         break;
  •                                 case MMC_GET_CSD :
  •                                         break;
  •                                 case MMC_GET_CID :
  •                                         break;
  •                                 case MMC_GET_OCR :
  •                                         break;
  •                                 case MMC_GET_SDSTAT :
  •                                         break;
  •                         }
  •             }else if(drv==1){
  •                         switch (ctrl)
  •                         {
  •                                 case CTRL_SYNC :
  •                                         return RES_OK;
  •                                 case GET_SECTOR_COUNT :
  •                                 return RES_OK;
  •                                 case GET_SECTOR_SIZE :
  •                                         return RES_OK;
  •                                 case GET_BLOCK_SIZE :
  •                                 return RES_OK;
  •                                 case CTRL_POWER :
  •                                         break;
  •                                 case CTRL_LOCK :
  •                                         break;
  •                                 case CTRL_EJECT :
  •                                         break;
  •                         /* MMC/SDC command */
  •                                 case MMC_GET_TYPE :
  •                                         break;
  •                                 case MMC_GET_CSD :
  •                                         break;
  •                                 case MMC_GET_CID :
  •                                         break;
  •                                 case MMC_GET_OCR :
  •                                         break;
  •                                 case MMC_GET_SDSTAT :
  •                                         break;
  •                         }
  •                 }
  •                 else{
  •                         return RES_PARERR;
  •                 }
  •                 return RES_PARERR;
  •         }

复制代码
MSD0_GetCardInfo()函数也在SPI_MSD0_Driver.c文件中实现,其中SD0_CardInfo为PMSD_CARDINFO类型的全局变量,它在SPI_MSD0_Driver.h文件中被定义。
    8、到此diskio.c这个文件中的所有函数就已经实现,下一步就是实现SPI_MSD0_Driver.c文件中的相关函数,SPI_MSD0_Driver.c文件可以在网上下载,参考的程序比较多,本工程使用的这个文件也是在网上下载并进行一定的修改过的。本文件中函数的实现方式可以参考源代码。
五、文件系统测试
    1、测试写文件
    测试代码如下:
  • //写文件测试
  •         printf("write file test......\n\r");
  •         res = f_open(&fdst, "0:/test.txt", FA_CREATE_ALWAYS | FA_WRITE);
  •         if(res != FR_OK){
  •                 printf("open file error : %d\n\r",res);
  •         }else{
  •                 res = f_write(&fdst, textFileBuffer, sizeof(textFileBuffer), &bw);               /* Write it to the dst file */
  •                 if(res == FR_OK){
  •                         printf("write data ok! %d\n\r",bw);
  •                 }else{
  •                         printf("write data error : %d\n\r",res);
  •                 }
  •                 /*close file */
  •                 f_close(&fdst);
  •         }

复制代码
注意:成功打开文件后一定要调用f_close()函数,否则数据无法写入SD卡中。
    2、测试读文件
  • //读文件测试
  •         printf("read file test......\n\r");
  •         res = f_open(&fsrc, "0:/test.txt", FA_OPEN_EXISTING | FA_READ);
  •         if(res != FR_OK){
  •                 printf("open file error : %d\n\r",res);
  •         }else{
  •                 res = f_read(&fsrc, buffer, sizeof(textFileBuffer), &br);     /* Read a chunk of src file */
  •                 if(res==FR_OK){
  •                         printf("read data num : %d\n\r",br);
  •                         printf("%s\n\r",buffer);
  •                 }else{
  •                         printf("read file error : %d\n\r",res);
  •                 }
  •                 /*close file */
  •                 f_close(&fsrc);
  •         }
继承事业,薪火相传
返回列表