当前位置:网站首页>[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 !
边栏推荐
- k8s部署redis哨兵的实现
- The data in the database table recursively forms a closed-loop data. How can we get these data
- [advanced ROS] lesson 5 TF coordinate transformation in ROS
- What if you are always bullied because you are too honest in the workplace?
- opencv学习笔记六--图像拼接
- 微信小程序02-轮播图实现与图片点击跳转
- What is the relationship between network speed, broadband, bandwidth and traffic?
- 《QT+PCL第六章》点云配准icp系列2
- An intrusion detection model
- SAP CRM organization Model(组织架构模型)自动决定的逻辑分析
猜你喜欢

Qt+pcl Chapter 6 point cloud registration ICP Series 2

Phpcms background upload picture button cannot be clicked

The difference between arrow function and ordinary function in JS

Written on the first day after Doris graduated

An intrusion detection model
k8s部署redis哨兵的实现

openssl客户端编程:一个不起眼的函数导致的SSL会话失败问题

Filter & (login interception)

【目标跟踪】|模板更新 时间上下文信息(UpdateNet)《Learning the Model Update for Siamese Trackers》

微信小程序03-文字一左一右显示,行内块元素居中
随机推荐
【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(三)
Solid basic structure and array, private / public function, return value and modifier of function, event
[antenna] [3] some shortcut keys of CST
Flink 系例 之 TableAPI & SQL 与 MYSQL 插入数据
Hidden rules of the workplace that must be understood before 30
What data capabilities do data product managers need to master?
opencv学习笔记六--图像特征[harris+SIFT]+特征匹配
Detailed explanation of ArrayList expansion, expansion principle [easy to understand]
Intelligent operation and maintenance practice: banking business process and single transaction tracking
MySQL审计插件介绍
Redis installation and setting up SSDB master-slave environment under Ubuntu 14.04
摩根大通期货开户安全吗?摩根大通期货公司开户方法是什么?
An intrusion detection model
购物商城6.27待完成
将ABAP On-Premises系统连接到中央检查系统以进行自定义代码迁移
Sort out the four commonly used sorting functions in SQL
点云重建方法汇总一(PCL-CGAL)
Filter &(登录拦截)
【天线】【3】CST一些快捷键
Qt+pcl Chapter 6 point cloud registration ICP series 4