当前位置:网站首页>[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 !
边栏推荐
- Solid basic basic grammar and definition function
- opencv学习笔记四--银行卡号识别
- Is JPMorgan futures safe to open an account? What is the account opening method of JPMorgan futures company?
- cmake 基本使用过程
- Qt+pcl Chapter 6 point cloud registration ICP Series 2
- The markdown editor uses basic syntax
- Opencv Learning Notes 6 -- image feature [harris+sift]+ feature matching
- leetcode:329. 矩阵中的最长递增路径
- What are the EN ISO 20957 certification standards for common fitness equipment
- Research on manually triggering automatic decision of SAP CRM organization model with ABAP code
猜你喜欢
Junda technology indoor air environment monitoring terminal PM2.5, temperature and humidity TVOC and other multi parameter monitoring
重回榜首的大众,ID依然乏力
idea中新建的XML文件变成普通文件的解决方法.
MySQL审计插件介绍
k8s部署redis哨兵的实现
Task. Run(), Task. Factory. Analysis of behavior inconsistency between startnew() and new task()
微信小程序02-轮播图实现与图片点击跳转
Filter &(登录拦截)
Task.Run(), Task.Factory.StartNew() 和 New Task() 的行为不一致分析
Summary of point cloud reconstruction methods I (pcl-cgal)
随机推荐
项目中字符串判空总结
Basic use process of cmake
Wechat applet 01 bottom navigation bar settings
swiper 轮播图,最后一张图与第一张图无缝衔接
微信小程序02-轮播图实现与图片点击跳转
做空蔚来的灰熊,以“碰瓷”中概股为生?
What if you are always bullied because you are too honest in the workplace?
如何实现时钟信号分频?
The data in the database table recursively forms a closed-loop data. How can we get these data
A unifying review of deep and shallow anomaly detection
go-zero实战demo(一)
IDEA全局搜索快捷键(ctrl+shift+F)失效修复
Flink 系例 之 TableAPI & SQL 与 Kafka 消息插入
leetcode:329. 矩阵中的最长递增路径
Tableapi & SQL and MySQL data query of Flink
厦门灌口镇田头村特色农产品 甜头村特色农产品蚂蚁新村7.1答案
《QT+PCL第六章》点云配准icp系列6
Basic operations of SQL database
Intelligent operation and maintenance practice: banking business process and single transaction tracking
微信网页订阅消息实现