| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /*-----------------------------------------------------------------------*/
- /* 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) 逆变换
|