/** * @brief 片选中SD卡,使其工作 * @param * @retval 1 选中成功 0 选中失败 */ u8 SD_Select(void) { /* 片选设备 */ SPI_SoftwareSELCmd(HT_SPI0, SPI_SEL_ACTIVE); if(SD_WaitReady()) //等待成功 return 1; else //等待失败 { SD_DisSelect(); return 0; } }
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; // only supports single disk operation, or return parameter error } // FATFS only deal with the current version of CTRL_SYNC, GET_SECTOR_COUNT, GET_BLOCK_SIZ three commands switch(ctrl) { case CTRL_SYNC: MSD_CS_ENABLE(); if(SD_WaitReady()==0) { res = RES_OK; } else { res = RES_ERROR; } MSD_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; }
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; }
DRESULT disk_ioctl ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE cmd, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { DRESULT res; int result; switch (cmd) { case CTRL_SYNC: SD_CS = 0; if(0 == SD_WaitReady()) { res = RES_OK; } else { res = RES_ERROR; } SD_CS = 1; break; case GET_SECTOR_SIZE: *(DWORD*)buff = SD_SECTOR_SIZE; res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD*)buff = SD_GetSectorCount(); res = RES_OK; break; case GET_BLOCK_SIZE: *(DWORD*)buff = 8; res = RES_OK; break; default: res = RES_PARERR; } return (res); }
DRESULT disk_ioctl (BYTE drv,BYTE ctrl,void* buff)//哪个盘,控制命令(0刷新缓存,3获取块大小,1获取磁盘容量),块大小和磁盘容量存放的指针 { 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; }
/** * @name SD_SendBlock * @description 向sd卡写入一个数据包的内容,共512字节 * @param buf 数据缓存区 cmd 指令 * @return 1 发送成功 0 发送失败 * @notice */ u8 SD_SendBlock(u8 *buf, u8 cmd) { u16 cnt; u8 r1; if(!SD_WaitReady()) return 0; //等待准备失效 SD_SPI_ReadWriteByte(cmd); if(cmd != 0XFD)//不是结束指令 { for(cnt = 0;cnt < 512;cnt++) SD_SPI_ReadWriteByte(buf[cnt]); SD_SPI_ReadWriteByte(0xFF);//忽略crc SD_SPI_ReadWriteByte(0xFF); r1 = SD_SPI_ReadWriteByte(0xFF);//接收响应 if((r1 & 0x1F) != 0x05) return 0; //响应错误 } return 1; //写入成功 }
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: SD_CS_Clr(); if(SD_WaitReady()==0)res = RES_OK; else res = RES_ERROR; SD_CS_Set(); break; case GET_SECTOR_SIZE: *(WORD*)buff = 512; res = RES_OK; break; case GET_BLOCK_SIZE: *(WORD*)buff = 8; res = RES_OK; break; case GET_SECTOR_COUNT: *(DWORD*)buff = SD_GetSectorCount(); res = RES_OK; break; default: res = RES_PARERR; break; } }else res=RES_ERROR;//其他的不支持 return res; }