硬汉嵌入式论坛

 找回密码
 立即注册
查看: 795|回复: 3
收起左侧

[SPI/QSPI] 关于spi flash 模拟U盘的问题

[复制链接]

9

主题

78

回帖

105

积分

初级会员

积分
105
发表于 2022-5-13 10:01:24 | 显示全部楼层 |阅读模式
本帖最后由 悠悠三千载 于 2022-5-13 10:06 编辑

请教一下,SPI Flash 模拟U盘,插上电脑后,显示如下图片(图片1),没有读出信息,使用的时cubemx生成的代码,按照网上教程来的,在模拟之前,flash写过数据,之后模拟的时候,使用了芯片擦除,但是模拟的时候没有初始化提示,加了文件系统后,可以正常模拟了,看网上教程不是可以不需要文件系统吗?还是说哪里有问题?
[C] 纯文本查看 复制代码
/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file           : usbd_storage_if.c
 * @version        : v1.0_Cube
 * @brief          : Memory management layer.
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2022 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "usbd_storage_if.h"

/* USER CODE BEGIN INCLUDE */
#include "bsp_soft_spi.h"
#include "bsp_spi_w25qxx.h"
/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
 * @brief Usb device.
 * @{
 */

/** @defgroup USBD_STORAGE
 * @brief Usb mass storage device module
 * @{
 */

/** @defgroup USBD_STORAGE_Private_TypesDefinitions
 * @brief Private types.
 * @{
 */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
 * @}
 */

/** @defgroup USBD_STORAGE_Private_Defines
 * @brief Private defines.
 * @{
 */

#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  4096
#define STORAGE_BLK_SIZ                  4096

/* USER CODE BEGIN PRIVATE_DEFINES */

/* USER CODE END PRIVATE_DEFINES */

/**
 * @}
 */

/** @defgroup USBD_STORAGE_Private_Macros
 * @brief Private macros.
 * @{
 */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
 * @}
 */

/** @defgroup USBD_STORAGE_Private_Variables
 * @brief Private variables.
 * @{
 */

/* USER CODE BEGIN INQUIRY_DATA_HS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_HS[] =
{/* 36 *//* LUN 0 */0x00, 0x80, 0x02, 0x02, (STANDARD_INQUIRY_DATA_LEN - 5),
		0x00, 0x00, 0x00, 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
		'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '.', '0', '1' /* Version      : 4 Bytes */
};
/* USER CODE END INQUIRY_DATA_HS */

/* USER CODE BEGIN PRIVATE_VARIABLES */

/* USER CODE END PRIVATE_VARIABLES */

/**
 * @}
 */

/** @defgroup USBD_STORAGE_Exported_Variables
 * @brief Public variables.
 * @{
 */

extern USBD_HandleTypeDef hUsbDeviceHS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
 * @}
 */

/** @defgroup USBD_STORAGE_Private_FunctionPrototypes
 * @brief Private functions declaration.
 * @{
 */

static int8_t STORAGE_Init_HS(uint8_t lun);
static int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num,
		uint16_t *block_size);
static int8_t STORAGE_IsReady_HS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_HS(uint8_t lun);
static int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr,
		uint16_t blk_len);
static int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr,
		uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_HS(void);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
 * @}
 */

USBD_StorageTypeDef USBD_Storage_Interface_fops_HS =
{ STORAGE_Init_HS, STORAGE_GetCapacity_HS, STORAGE_IsReady_HS,
		STORAGE_IsWriteProtected_HS, STORAGE_Read_HS, STORAGE_Write_HS,
		STORAGE_GetMaxLun_HS, (int8_t*) STORAGE_Inquirydata_HS };

/* Private functions ---------------------------------------------------------*/

/**
 * @brief  Initializes the storage unit (medium).
 * @param  lun: Logical unit number.
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
int8_t STORAGE_Init_HS(uint8_t lun)
{
	/* USER CODE BEGIN 9 */
	UNUSED(lun);

	SPI_Init();

	return (USBD_OK);
	/* USER CODE END 9 */
}

/**
 * @brief  Returns the medium capacity.
 * @param  lun: Logical unit number.
 * @param  block_num: Number of total block number.
 * @param  block_size: Block size.
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num,
		uint16_t *block_size)
{
	/* USER CODE BEGIN 10 */
	UNUSED(lun);

	*block_num = STORAGE_BLK_NBR;
	*block_size = STORAGE_BLK_SIZ;

	return (USBD_OK);
	/* USER CODE END 10 */
}

/**
 * @brief   Checks whether the medium is ready.
 * @param  lun:  Logical unit number.
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
int8_t STORAGE_IsReady_HS(uint8_t lun)
{
	/* USER CODE BEGIN 11 */
	UNUSED(lun);

	//FLASH_Init();

	if (Flash_ReadFlashID() == FLASH_ID)
	{
		return (USBD_OK);
	}
	else
	{
		return USBD_FAIL;
	}

	/* USER CODE END 11 */
}

/**
 * @brief  Checks whether the medium is write protected.
 * @param  lun: Logical unit number.
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
int8_t STORAGE_IsWriteProtected_HS(uint8_t lun)
{
	/* USER CODE BEGIN 12 */
	return (USBD_OK);
	/* USER CODE END 12 */
}

/**
 * @brief  Reads data from the medium.
 * @param  lun: Logical unit number.
 * @param  buf: data buffer.
 * @param  blk_addr: Logical block address.
 * @param  blk_len: Blocks number.
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr,
		uint16_t blk_len)
{
	/* USER CODE BEGIN 13 */
	UNUSED(lun);
	UNUSED(buf);
	UNUSED(blk_addr);
	UNUSED(blk_len);

	FLASH_BufferRead(buf, blk_addr * STORAGE_BLK_SIZ,
			blk_len * STORAGE_BLK_SIZ);

	return (USBD_OK);
	/* USER CODE END 13 */
}

/**
 * @brief  Writes data into the medium.
 * @param  lun: Logical unit number.
 * @param  buf: data buffer.
 * @param  blk_addr: Logical block address.
 * @param  blk_len: Blocks number.
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr,
		uint16_t blk_len)
{
	/* USER CODE BEGIN 14 */
	UNUSED(lun);
	UNUSED(buf);
	UNUSED(blk_addr);
	UNUSED(blk_len);

	FLASH_SectorErase(blk_addr * STORAGE_BLK_SIZ);
	FLASH_BufferWrite(buf, blk_addr * STORAGE_BLK_SIZ,
			blk_len * STORAGE_BLK_SIZ);

	return (USBD_OK);
	/* USER CODE END 14 */
}

/**
 * @brief  Returns the Max Supported LUNs.
 * @param  None
 * @retval Lun(s) number.
 */
int8_t STORAGE_GetMaxLun_HS(void)
{
	/* USER CODE BEGIN 15 */
	return (STORAGE_LUN_NBR - 1);
	/* USER CODE END 15 */
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

/**
 * @}
 */

/**
 * @}
 */


这个是相关的接口实现

图片1

图片1
回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-5-13 11:42:40 | 显示全部楼层
额,可以识别到,就是非常慢,插上电脑后要几分钟才弹出格式化窗口,这是代码哪里有问题吗?芯片用的STM32H7B0VBT6,代码运行在外置flash中
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2022-5-14 09:52:25 | 显示全部楼层
这个是我们的QSPI Flash模拟U盘案例,可以参考下。

基于STM32H7驱动QSPI Flash的FatFS文件系统 + QSPI Flash虚拟U盘实现,读速度24.6MB/S(2019-03-28)
https://www.armbbs.cn/forum.php? ... 1634&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

9

主题

78

回帖

105

积分

初级会员

积分
105
 楼主| 发表于 2022-5-16 09:20:10 | 显示全部楼层
eric2013 发表于 2022-5-14 09:52
这个是我们的QSPI Flash模拟U盘案例,可以参考下。

基于STM32H7驱动QSPI Flash的FatFS文件系统 + QSPI F ...

嗯,参考的是这个例子,谢谢硬汉的回复,之前我这边软件上写的有问题,现在改好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 17:31 , Processed in 0.301688 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表