当前位置:网站首页>[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
“ 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
change w25q128
Hommization !
边栏推荐
- 榨汁机UL982测试项目有哪些
- How to realize clock signal frequency division?
- Description | Huawei cloud store "commodity recommendation list"
- Introduction to MySQL audit plug-in
- Skywalking 6.4 distributed link tracking usage notes
- Phpcms background upload picture button cannot be clicked
- Detailed explanation of ArrayList expansion, expansion principle [easy to understand]
- [Cloudera][ImpalaJDBCDriver](500164)Error initialized or created transport for authentication
- 《性能之巅第2版》阅读笔记(五)--file-system监测
- Basic use process of cmake
猜你喜欢
竣达技术丨室内空气环境监测终端 pm2.5、温湿度TVOC等多参数监测
Sort out the four commonly used sorting functions in SQL
The difference between arrow function and ordinary function in JS
【LeetCode】16、最接近的三数之和
The first technology podcast month will be broadcast soon
"Qt+pcl Chapter 6" point cloud registration ICP Series 6
《性能之巅第2版》阅读笔记(五)--file-system监测
Raytheon technology rushes to the Beijing stock exchange and plans to raise 540million yuan
如何实现时钟信号分频?
Introduction to MySQL audit plug-in
随机推荐
Junda technology - wechat cloud monitoring scheme for multiple precision air conditioners
DirectX repair tool v4.1 public beta! [easy to understand]
MySQL 服务正在启动 MySQL 服务无法启动解决途径
phpcms后台上传图片按钮无法点击
【一天学awk】函数与自定义函数
Solid basic structure and array, private / public function, return value and modifier of function, event
Flink 系例 之 TableAPI & SQL 与 MYSQL 分组统计
Storage form of in-depth analysis data in memory
go-zero实战demo(一)
leetcode:329. 矩阵中的最长递增路径
【锁】Redis锁 处理并发 原子性
Apk signature principle
The last picture is seamlessly connected with the first picture in the swiper rotation picture
A unifying review of deep and shallow anomaly detection
项目中字符串判空总结
"Qt+pcl Chapter 6" point cloud registration ICP Series 6
Survey of intrusion detection systems:techniques, datasets and challenges
Qt+pcl Chapter 6 point cloud registration ICP Series 5
Tableapi & SQL and MySQL data query of Flink
《QT+PCL第六章》点云配准icp系列5