/*-----------------------------------------------------------------------*/ /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */ /*-----------------------------------------------------------------------*/ /* This is a stub disk I/O module that acts as front end of the existing */ /* disk I/O modules and attach it to FatFs module with common interface. */ /*-----------------------------------------------------------------------*/ //#include "Config.h" #include "diskio.h" #include "SPI-SD/SD/sddriver.h" /*-----------------------------------------------------------------------*/ /* Correspondence between physical drive number and physical drive. */ #define BlockSize 512 /* Block Size in Bytes [这里的block含义是“扇区”,SD卡的每个扇区为512字节]*/ #define BufferWordsSize (BlockSize >> 2) //128,含义参考MAIN中的解释,是128个32位的缓冲区,存放512个字节 /* Inidialize a Drive */ DSTATUS disk_initialize ( BYTE drv /* Physical drive nmuber (0..) */ ) { BYTE state; u8 i=0; if(drv) { return STA_NOINIT; //仅支持磁盘0的操作 } state = SD_Init(); do { state = SD_Init(); }while(state&&(i++<20)) ; if(state == STA_NODISK) { return STA_NODISK; } else if(state != 0) { return STA_NOINIT; //其他错误:初始化失败 } else { return RES_OK; //初始化成功 } } /*-----------------------------------------------------------------------*/ /* Return Disk Status */ DSTATUS disk_status ( BYTE drv /* Physical drive nmuber (0..) */ ) { if(drv) { return STA_NOINIT; //仅支持磁盘0操作 } return RES_OK; } /*-----------------------------------------------------------------------*/ /* Read Sector(s) */ DRESULT disk_read ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to read (1..255) */ ) { u8 res=0; if (drv || !count) { return RES_PARERR; /*仅支持单磁盘操作,count不能等于0,否则返回参数错误*/ } if(count==1) /*1个sector的读操作 */ { res = SD_ReadSingleBlock(sector<<9 ,(&buff[0]));; } else /*多个sector的读操作 */ { res = SD_ReadMultiBlock(sector<<9,(&buff[0]),count); } /* 处理返回值,将sddriver.c的返回值转成ff.c的返回值 */ if(res == 0x00) { return RES_OK; } else { return RES_ERROR; } } /*-----------------------------------------------------------------------*/ /* Write Sector(s) */ #if _READONLY == 0 DRESULT disk_write ( BYTE drv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to write (1..255) */ ) { u8 res; if (drv || !count) { return RES_PARERR; /* 仅支持单磁盘操作,count不能等于0,否则返回参数错误 */ } // 读写操作 if(count == 1) { res = SD_WriteSingleBlock(sector<<9, buff); } else { res = SD_WriteMultiBlock(sector<<9, buff, count); } // 返回值转换 if(res == 0) { return RES_OK; } else { return RES_ERROR; } } #endif /* _READONLY */ /*-----------------------------------------------------------------------*/ /* Miscellaneous Functions */ DRESULT disk_ioctl ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE ctrl, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { DRESULT res; if (drv) { return RES_PARERR; /*仅支持单磁盘操作,参数错误 */ } /*FATFS目前版本仅需处理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三个命令*/ switch(ctrl) { case CTRL_SYNC: SD_CS_ENABLE(); if(SD_WaitReady()==0) { res = RES_OK; } else { res = RES_ERROR; } SD_CS_DISABLE(); break; case GET_BLOCK_SIZE: *(WORD*)buff = 512; res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD*)buff = SD_GetCapacity(); res = RES_OK; break; default: res = RES_PARERR; break; } return res; } /*-----------------------------------------------------------------------*/ /* User defined function to give a current time to fatfs module */ /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ DWORD get_fattime (void) { return 0; } //得到文件Calendar格式的建立日期,是DWORD get_fattime (void) 逆变换