/*-----------------------------------------------------------------------*/ /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */ /*-----------------------------------------------------------------------*/ /* If a working storage control module is available, it should be */ /* attached to the FatFs via a glue function rather than modifying it. */ /* This is an example of glue functions to attach various exsisting */ /* storage control modules to the FatFs module with a defined API. */ /*-----------------------------------------------------------------------*/ #include "diskio.h" /* FatFs lower layer API */ #include "sdmmc_sdcard.h" #include "w25qxx.h" #include "malloc.h" ////////////////////////////////////////////////////////////////////////////////// /****************************************************************/ //FATFS底层(diskio) 驱动代码 //STM32H7工程模板-HAL库函数版本 //DevEBox 大越创新 //淘宝店铺:mcudev.taobao.com //淘宝店铺:shop389957290.taobao.com /****************************************************************/ ////////////////////////////////////////////////////////////////////////////////// #define SD_CARD 0 //SD卡,卷标为0 #define EX_FLASH 1 //外部spi flash,卷标为1 //对于W25Q256 //前25M字节给fatfs用,25M字节后,用于存放字库,字库占用6.01M. 剩余部分,给客户自己用 #define SPI_FLASH_SECTOR_SIZE 512 #define SPI_FLASH_SECTOR_COUNT 1024*25*2 //W25Q256,前25M字节给FATFS占用 #define SPI_FLASH_BLOCK_SIZE 8 //每个BLOCK有8个扇区 //获得磁盘状态 DSTATUS disk_status ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { return RES_OK; } //初始化磁盘 DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { u8 res=0; switch(pdrv) { case SD_CARD: //SD卡 res=SD_Init(); //SD卡初始化 break; default: res=1; } if(res)return STA_NOINIT; else return 0; //初始化成功 } //读扇区 //pdrv:磁盘编号0~9 //*buff:数据接收缓冲首地址 //sector:扇区地址 //count:需要读取的扇区数 DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { u8 res=0; if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误 switch(pdrv) { case SD_CARD://SD卡 res=SD_ReadDisk(buff,sector,count); while(res)//读出错 { SD_Init(); //重新初始化SD卡 res=SD_ReadDisk(buff,sector,count); //printf("sd rd error:%d\r\n",res); } break; default: res=1; } //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res==0x00)return RES_OK; else return RES_ERROR; } //写扇区 //pdrv:磁盘编号0~9 //*buff:发送数据首地址 //sector:扇区地址 //count:需要写入的扇区数 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to write */ ) { u8 res=0; if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误 switch(pdrv) { case SD_CARD://SD卡 res=SD_WriteDisk((u8*)buff,sector,count); while(res)//写出错 { SD_Init(); //重新初始化SD卡 res=SD_WriteDisk((u8*)buff,sector,count); //printf("sd wr error:%d\r\n",res); } break; default: res=1; } //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res == 0x00)return RES_OK; else return RES_ERROR; } //其他表参数的获得 //pdrv:磁盘编号0~9 //ctrl:控制代码 //*buff:发送/接收缓冲区指针 DRESULT disk_ioctl ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE cmd, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { DRESULT res; if(pdrv==SD_CARD)//SD卡 { switch(cmd) { case CTRL_SYNC: res = RES_OK; break; case GET_SECTOR_SIZE: *(DWORD*)buff = 512; res = RES_OK; break; case GET_BLOCK_SIZE: *(WORD*)buff = SDCardInfo.CardBlockSize; res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD*)buff = SDCardInfo.CardCapacity/512; res = RES_OK; break; default: res = RES_PARERR; break; } } else res=RES_ERROR;//其他的不支持 return res; }