当前位置:网站首页>[STM32 learning] w25qxx automatic judgment capacity detection based on STM32 USB storage device

[STM32 learning] w25qxx automatic judgment capacity detection based on STM32 USB storage device

2022-07-01 15:24:00 Please call me Chang Sicong

brief introduction

Use STM32USB Function configuration Mass Storage Class Storage media use w25qxx do U Disk time , Find a more interesting thing .
When changing storage media with different capacities, you need to change the program , Show different sizes .

change usbd_storage_if.c Under the document

/* USER CODE BEGIN PRIVATE_DEFINES */
#define USER_STORAGE_LUN_NBR 1
#define USER_STORAGE_BLK_NBR 512
#define USER_STORAGE_BLK_SIZ 4096
/* USER CODE END PRIVATE_DEFINES */

This paper introduces a new type of w25qxx when ,USB The method of automatically judging the capacity of equipment

principle

stay USB On initialization , By reading the w25qxx Of ID function , Get information about the storage medium ,
Then the discrimination information , Rewrite to the corresponding capacity .

start :

#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 0x10000
#define STORAGE_BLK_SIZ 0x200

/* USER CODE BEGIN PRIVATE_DEFINES */
#define USER_STORAGE_BLK_SIZ 4096
/* USER CODE END PRIVATE_DEFINES */

initialization

/* USER CODE BEGIN PRIVATE_VARIABLES */
uint32_t w25qxx_storage;
/* USER CODE END PRIVATE_VARIABLES */


int8_t STORAGE_Init_FS(uint8_t lun)
{
    
  /* USER CODE BEGIN 2 */
	W25QXX_Init();
	switch(W25QXX_TYPE)
	{
    
		case W25Q32:
			w25qxx_storage = 32;
			break;
		case W25Q64:
			w25qxx_storage = 64;
			break;
		case W25Q128:
			w25qxx_storage = 128;
			break;
		case W25Q256:
			w25qxx_storage = 256;
			break;
		default :
			w25qxx_storage = 8;
	}
	w25qxx_storage = w25qxx_storage/8*1024*1024;  
	
	// w25qxx_storage is xxMB, but USER_STORAGE_BLK_SIZ is xxByte. Be care of the unit!
	
	w25qxx_storage = w25qxx_storage/USER_STORAGE_BLK_SIZ;
  return (USBD_OK);
  /* USER CODE END 2 */
}

USB Read capacity initialization

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
    
  /* USER CODE BEGIN 3 */
	
	*block_num  = w25qxx_storage;
	*block_size = USER_STORAGE_BLK_SIZ;
  return (USBD_OK);
  /* USER CODE END 3 */
}

Reading and writing :

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
    
  /* USER CODE BEGIN 6 */
	uint16_t i = 0;

	for(i = 0;i < blk_len;i++)
	{
    
		W25QXX_Read(buf + i * USER_STORAGE_BLK_SIZ,blk_addr * USER_STORAGE_BLK_SIZ + i * USER_STORAGE_BLK_SIZ,USER_STORAGE_BLK_SIZ );
	}
  return (USBD_OK);
  /* USER CODE END 6 */
}

/** * @brief . * @param lun: . * @retval USBD_OK if all operations are OK else USBD_FAIL */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
    
  /* USER CODE BEGIN 7 */
	uint16_t i = 0;

	for(i = 0;i < blk_len;i++)
	{
    
	  W25QXX_Write((uint8_t *)(buf + i * USER_STORAGE_BLK_SIZ),blk_addr * USER_STORAGE_BLK_SIZ + i * USER_STORAGE_BLK_SIZ,USER_STORAGE_BLK_SIZ );
	}
  return (USBD_OK);
  /* USER CODE END 7 */
}

* Be careful bug

w25qxx The drive of is usually driven by punctual atoms
 Insert picture description here
“ Barthes ”(but),
There is a problem with the driver , I also found this during the test :
w25qxx.c In file Read ID function :

uint16_t W25QXX_ReadID(void)
{
    
	uint16_t Temp = 0;
	uint8_t byte = 0;
	W25QXX_CS(0);
	SPIx_ReadWriteByte(0x90); // Send read ID command 
	SPIx_ReadWriteByte(0x00);
	SPIx_ReadWriteByte(0x00);
	SPIx_ReadWriteByte(0x00);

	SPIx_ReadByte(&byte, 1);
	Temp |= byte;
	SPIx_ReadByte(&byte, 1);
	Temp |= byte;
	
	W25QXX_CS(1);
	return Temp;
}

Do you see the problem ?

Give you three minutes .

1min.

2min.

3min.

To reveal the answer :

	.....
	SPIx_ReadByte(&byte, 1);
	Temp |= byte;
	Temp<<=8; //Be care of this!
	SPIx_ReadByte(&byte, 1);
	Temp |= byte;
	.....

The correct should be :

uint16_t W25QXX_ReadID(void)
{
    
	uint16_t Temp = 0;
	uint8_t byte = 0;
	W25QXX_CS(0);
	SPIx_ReadWriteByte(0x90); // Send read ID command 
	SPIx_ReadWriteByte(0x00);
	SPIx_ReadWriteByte(0x00);
	SPIx_ReadWriteByte(0x00);

	SPIx_ReadByte(&byte, 1);
	Temp |= byte;
	Temp<<=8; //Be care of this!
	SPIx_ReadByte(&byte, 1);
	Temp |= byte;
	
	W25QXX_CS(1);
	return Temp;
}

Now you can read the chip smoothly ID 了 , After reading ID Judge the capacity .

Effect display

Plug in w25q64
 Insert picture description here
change w25q128
 Insert picture description here
Hommization !

原网站

版权声明
本文为[Please call me Chang Sicong]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/182/202207011515546788.html