【STM32学习】 基于STM32 USB存储设备的w25qxx自动判断容量检测
简介
使用STM32USB功能配置成Mass Storage Class 存储介质使用w25qxx做U盘时,发现一个比较好玩的事情。
当换不同容量的存储介质时需要改下程序,显示不同的大小。
更改usbd_storage_if.c文件下的
/* 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 */
本文介绍一种更换不同容量的w25qxx时,USB设备自动判别容量大小的做法
原理
在USB初始化时,通过读取w25qxx的ID函数,得到存储介质的信息,
之后判别信息,改写为对应的容量大小。
开头:
#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 */
初始化
/* 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 读取容量初始化
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 */
}
读写:
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 */
}
*注意bug
w25qxx的驱动一般都使用正点原子的驱动
“巴特”(but),
驱动程序有问题,这个也我在测试时发现的:
w25qxx.c文件中 读取ID函数:
uint16_t W25QXX_ReadID(void)
{uint16_t Temp = 0;uint8_t byte = 0;W25QXX_CS(0);SPIx_ReadWriteByte(0x90); //发送读取ID命令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;
}
看出问题了吗?
给你三分钟。
1min.
2min.
3min.
来揭晓答案:
.....SPIx_ReadByte(&byte, 1);Temp |= byte;Temp<<=8; //Be care of this!SPIx_ReadByte(&byte, 1);Temp |= byte;.....
正确的应该为:
uint16_t W25QXX_ReadID(void)
{uint16_t Temp = 0;uint8_t byte = 0;W25QXX_CS(0);SPIx_ReadWriteByte(0x90); //发送读取ID命令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;
}
现在就可以顺利读取芯片的ID了,之后通过读取的ID判断容量大小。
效果展示
插上w25q64
换上w25q128
人性化!
【STM32学习】 基于STM32 USB存储设备的w25qxx自动判断容量检测相关推荐
- 用 C# 编写 USB 存储设备使用痕迹检测和删除工具
编写 USB 存储设备使用痕迹检测和删除工具 (C# Windows Form 编程练习) [版权所有 邱秋 2014 metaphysis@yeah.net, 转载请注明出处] 第一节 准备知识 之 ...
- STM32学习 基于STM32F103C8t6
STM32学习 基于STM32F103C8T6 STM32F103C8T6命名规则 先对自己使用的芯片命名有所了解,才能更好的宏观掌控 STM32F103C8t6引脚命名 Keil仿真 hex文件烧录 ...
- 开始计算机USB存储功能,USB存储设备禁用怎么设置
因为有些情况下我们必须得禁止USB存储设备,特别是涉及到当文件被泄漏或者复制时,那如何设置禁用USB存储设备呢?下面是学习啦小编为大家介绍禁用USB存储设备的设置方法,欢迎大家阅读. 禁用USB存储设 ...
- 把Hyper-V Server 2008R2装进USB存储设备
把Hyper-V Server 2008R2装进USB存储设备 之前在发布了windows8的时候,有一个比较吸引人的feature就是windows to go,借助该feature可以把Windo ...
- 树莓派linux系统识别u盘启动,树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载...
简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...
- 将windows系统装到USB存储设备
将windows系统装到USB存储设备 需求: 1)一般公司比较规范,计算机系统有严格的限制策略,如果自己不懂得如何更改或者没有权限更改,将极其不便. 2)计划在家里完成在公司未完成的事,甚至异地出差 ...
- 你的计算机usb管理策略,您的计算机已经实施了USB存储设备管理策略,系统发现你使用了USB存储设备,该设备已被阻止,如有疑问请与...
满意答案 eq8276 2014.04.21 采纳率:42% 等级:9 已帮助:663人 要禁用 USB 存储设备,请根据您的具体情况使用下面的一个或多个步骤: 如果计算机上尚未安装 USB 存 ...
- linux 自动挂载usb设备,Raspberry Pi 自动挂载USB存储设备
简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...
- 计算机怎样发现路由器上u盘,360 P2 无线路由器通过电脑终端查看路由USB存储设备操作流程 路由器...
首先,将您的U盘 或 插入存储卡的读卡器 或 移动硬盘(以下称为USB存储设备),插入5G路由后面的USB接口上,如下图 插入USB存储设备后,5G路由面板上的USB指示灯(左数第三个)和后面USB卸 ...
最新文章
- anaconda重新安装pytorch,使用GPU加速
- 意大利罗马银行连环抢劫案告破 一名警察涉案
- B. Light It Up
- Pytorch —— 优化器Optimizer(二)
- Windows 10 开启有线无线802.1x脚本
- 计算机网络—信道划分与介质访问控制
- 转:HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
- modbus tcp主站和从站_实例讲解PLC实现modbus通讯
- 前端运行python代码几种方式_前端和python
- 夏昕.深入浅出Hibernate中的第一个例子体会.
- OMNeT++学习---TicToc(1)
- 8.21: Hackday、慈善x快速迭代
- 夫妻宫十星所暗示的未来另一半
- python爬取阿里云漏洞库完整版
- 又拍云存储:CDN架构探索
- 初学者基于paddle的计算机视觉快速上手项目
- linux远程管理工具:putty
- Zabbix实现企业微信报警
- 训练模型时候显存爆炸的一种可能性以及解决办法
- 基尔霍夫电流定律KCL和基尔霍夫电压定律KVL