/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file user_diskio.c * @brief This file includes a diskio driver skeleton to be completed by the user. ****************************************************************************** * @attention * *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: * www.st.com/SLA0044 * ****************************************************************************** */ /* USER CODE END Header */ #ifdef USE_OBSOLETE_W25Q_CODE_SECTION_0 /* * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0) * To be suppressed in the future. * Kept to ensure backward compatibility with previous CubeMx versions when * migrating projects. * User code previously added there should be copied in the new user sections before * the section contents can be deleted. */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ #endif /* USER CODE BEGIN DECL */ /* Includes ------------------------------------------------------------------*/ #include #include "ff_gen_drv.h" #include "obj_spi_sd_stm32.h" #include "obj_spi_w25qxx.h" #include "obj_hal_w25qxx.h" #include "obj_soft_w25qxx.h" #include "func_spi_w25qxx.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define SD_CARD 0 //SD卡,卷标为0 #define EX_FLASH 1 //外部spi flash,卷标为1 #define EX_NAND 2 //外部nand flash,卷标为2 //对于W25Q128 //#define FLASH_SECTOR_SIZE 512 //#define FLASH_SECTOR_COUNT 1024*16*2 //W25Q256,前25M字节给FATFS占用 //#define FLASH_BLOCK_SIZE 8 //每个BLOCK有8个扇区 /* Private variables ---------------------------------------------------------*/ /* Disk status */ static volatile DSTATUS Stat = STA_NOINIT; /* USER CODE END DECL */ /* Private function prototypes -----------------------------------------------*/ DSTATUS W25Q_initialize (BYTE pdrv); DSTATUS W25Q_status (BYTE pdrv); DRESULT W25Q_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count); #if _USE_WRITE == 1 DRESULT W25Q_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count); #endif /* _USE_WRITE == 1 */ #if _USE_IOCTL == 1 DRESULT W25Q_ioctl (BYTE pdrv, BYTE cmd, void *buff); #endif /* _USE_IOCTL == 1 */ Diskio_drvTypeDef W25Q_Driver = { W25Q_initialize, W25Q_status, W25Q_read, #if _USE_WRITE W25Q_write, #endif /* _USE_WRITE == 1 */ #if _USE_IOCTL == 1 W25Q_ioctl, #endif /* _USE_IOCTL == 1 */ }; /* Private functions ---------------------------------------------------------*/ /** * @brief Initializes a Drive * @param pdrv: Physical drive number (0..) * @retval DSTATUS: Operation status */ DSTATUS W25Q_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { /* USER CODE BEGIN INIT */ uint8_t res=0; func_w25q_init(); //W25QXX初始化 if(res) { return STA_NOINIT; } else { return 0; //初始化成功 } /* USER CODE END INIT */ } /** * @brief Gets Disk Status * @param pdrv: Physical drive number (0..) * @retval DSTATUS: Operation status */ DSTATUS W25Q_status ( BYTE pdrv /* Physical drive number to identify the drive */ ) { /* USER CODE BEGIN STATUS */ uint8_t res=0; if(res) { return STA_NOINIT; } else { return 0; } /* USER CODE END STATUS */ } //uint8_t data_buf[3][0x1000] = {0}; /** * @brief Reads Sector(s) * @param pdrv: Physical drive number (0..) * @param *buff: Data buffer to store read data * @param sector: Sector address (LBA) * @param count: Number of sectors to read (1..128) * @retval DRESULT: Operation result */ DRESULT W25Q_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 */ ) { uint8_t res=0; if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误 W25QXX_Read(buff, sector * SPI_FLASH_SECTOR_SIZE, count * SPI_FLASH_SECTOR_SIZE); //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res==0x00)return RES_OK; else return RES_ERROR; } /** * @brief Writes Sector(s) * @param pdrv: Physical drive number (0..) * @param *buff: Data to be written * @param sector: Sector address (LBA) * @param count: Number of sectors to write (1..128) * @retval DRESULT: Operation result */ #if _USE_WRITE == 1 DRESULT W25Q_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 */ ) { /* USER CODE BEGIN WRITE */ /* USER CODE HERE */ uint8_t res=0; if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误 W25QXX_Write((uint8_t*)buff, sector * SPI_FLASH_SECTOR_SIZE, count * SPI_FLASH_SECTOR_SIZE); //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res == 0x00) { return RES_OK; } else { return RES_ERROR; } /* USER CODE END WRITE */ } #endif /* _USE_WRITE == 1 */ /** * @brief I/O control operation * @param pdrv: Physical drive number (0..) * @param cmd: Control code * @param *buff: Buffer to send/receive control data * @retval DRESULT: Operation result */ #if _USE_IOCTL == 1 DRESULT W25Q_ioctl ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE cmd, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { /* USER CODE BEGIN IOCTL */ uint8_t res=RES_OK; res = func_w25q_disk_ioctl(pdrv, cmd, buff); //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值 if(res == 0x00) { return RES_OK; } else { return RES_ERROR; } /* USER CODE END IOCTL */ } #endif /* _USE_IOCTL == 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/