简介

使用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自动判断容量检测相关推荐

  1. 用 C# 编写 USB 存储设备使用痕迹检测和删除工具

    编写 USB 存储设备使用痕迹检测和删除工具 (C# Windows Form 编程练习) [版权所有 邱秋 2014 metaphysis@yeah.net, 转载请注明出处] 第一节 准备知识 之 ...

  2. STM32学习 基于STM32F103C8t6

    STM32学习 基于STM32F103C8T6 STM32F103C8T6命名规则 先对自己使用的芯片命名有所了解,才能更好的宏观掌控 STM32F103C8t6引脚命名 Keil仿真 hex文件烧录 ...

  3. 开始计算机USB存储功能,USB存储设备禁用怎么设置

    因为有些情况下我们必须得禁止USB存储设备,特别是涉及到当文件被泄漏或者复制时,那如何设置禁用USB存储设备呢?下面是学习啦小编为大家介绍禁用USB存储设备的设置方法,欢迎大家阅读. 禁用USB存储设 ...

  4. 把Hyper-V Server 2008R2装进USB存储设备

    把Hyper-V Server 2008R2装进USB存储设备 之前在发布了windows8的时候,有一个比较吸引人的feature就是windows to go,借助该feature可以把Windo ...

  5. 树莓派linux系统识别u盘启动,树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载...

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

  6. 将windows系统装到USB存储设备

    将windows系统装到USB存储设备 需求: 1)一般公司比较规范,计算机系统有严格的限制策略,如果自己不懂得如何更改或者没有权限更改,将极其不便. 2)计划在家里完成在公司未完成的事,甚至异地出差 ...

  7. 你的计算机usb管理策略,您的计算机已经实施了USB存储设备管理策略,系统发现你使用了USB存储设备,该设备已被阻止,如有疑问请与...

    满意答案 eq8276 2014.04.21 采纳率:42%    等级:9 已帮助:663人 要禁用 USB 存储设备,请根据您的具体情况使用下面的一个或多个步骤: 如果计算机上尚未安装 USB 存 ...

  8. linux 自动挂载usb设备,Raspberry Pi 自动挂载USB存储设备

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

  9. 计算机怎样发现路由器上u盘,360 P2 无线路由器通过电脑终端查看路由USB存储设备操作流程 路由器...

    首先,将您的U盘 或 插入存储卡的读卡器 或 移动硬盘(以下称为USB存储设备),插入5G路由后面的USB接口上,如下图 插入USB存储设备后,5G路由面板上的USB指示灯(左数第三个)和后面USB卸 ...

最新文章

  1. anaconda重新安装pytorch,使用GPU加速
  2. 意大利罗马银行连环抢劫案告破 一名警察涉案
  3. B. Light It Up
  4. Pytorch —— 优化器Optimizer(二)
  5. Windows 10 开启有线无线802.1x脚本
  6. 计算机网络—信道划分与介质访问控制
  7. 转:HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)...
  8. modbus tcp主站和从站_实例讲解PLC实现modbus通讯
  9. 前端运行python代码几种方式_前端和python
  10. 夏昕.深入浅出Hibernate中的第一个例子体会.
  11. OMNeT++学习---TicToc(1)
  12. 8.21: Hackday、慈善x快速迭代
  13. 夫妻宫十星所暗示的未来另一半
  14. python爬取阿里云漏洞库完整版
  15. 又拍云存储:CDN架构探索
  16. 初学者基于paddle的计算机视觉快速上手项目
  17. linux远程管理工具:putty
  18. Zabbix实现企业微信报警
  19. 训练模型时候显存爆炸的一种可能性以及解决办法
  20. 基尔霍夫电流定律KCL和基尔霍夫电压定律KVL

热门文章

  1. 【随笔】新浪微博分析
  2. mysql mof提权_三、mysql 之mof提权学习
  3. 关于应届毕业生签署三方协议有关注意事项
  4. Windows 7 开机无需密码自动登录设置
  5. 学习笔记9--智能驾驶的功能安全设计之功能安全设计
  6. 利用JMP ESP植入SHELLCODE
  7. 红米Note 5 全网独家首发ROM 独家支持一键刷机
  8. Python +Echarts +PyQt5设计股票期货自动交易系统 二、软件界面响应(二)
  9. 孟岩对话元道:通证经济将在两个方向上闯出新路
  10. 当支付有了“智慧” 未来我们将体验到什么样的智慧城市?