首页 > 其他分享 >STM32 WINUSB1.0详细适配教程

STM32 WINUSB1.0详细适配教程

时间:2024-10-19 20:21:49浏览次数:3  
标签:02 03 WINUSB1.0 01 适配 00 STM32 描述符 data

废话不多说,先上一个配置好的工程,急于完成适配的可先取走。需要了解原理或者适配后有问题的可继续阅读!

通过网盘分享的文件:stm32h750_winusb.rar

https://pan.baidu.com/s/1ENncscWVfQLHsOEhbe0sXQ?pwd=dr24 提取码: dr24

说明:这个工程是基于STM32CUBEIDE 1.9.0版本开发,配置了FreeRTOS及USB HighSpeed

WINUSB适配的是WINUSB1.0的版本,即大家网上常见的会读取0xEE处字符串描述符的版本!

后续笔者将推出一个WINUSB2.0适配的方案!

一、WINUSB概述

1.1 WINUSB(WCID)简介

        TBD:

1.2 WINUSB1.0缺陷

(1)WINUSB1.0需要查询0xEE处字符串描述符,但是部分老旧的设备可能不支持这个字符串描述符的查询,从而导致USB设备枚举失败甚至死机。

(2)WINUSB虽说是免驱,但实际上只有WINDOWS8及以上系统是真正意义上的免驱,WINDOWS7系统仍然需要INF文件才能识别!

(3)WinUSB不支持Windows 2003 ( 32bit/64bit )

(4)WinUSB不支持Windows XP 64位(可以通过第三方驱动支持)

(5)SB设备版本必需是2.0或2.0以上,WinUSB不支持USB1.0和1.1

工作太忙了,时间原因,先占个坑,后续慢慢完善吧!

二、详细适配过程

        急用的同学可以先参考下这个文章,写的其实也挺详细的。再结合上面适配好的工程,相信稍微花点点时间一定能解决这个适配问题!

        STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)-CSDN博客

三、WINUSB枚举抓包

使用USB分析仪的抓包数据:

//抓包数据
//step1:预获取设备描述符
req data: 80 06 00 01 00 00 40 00
rsp data: 12 01 00 02 00 00 00 40 10 08 21 F1 00 02 01 02 03 01 
//step2:设置USB设备地址
req data:00 05 22 00 00 00 00 00
rsp data:NULL
//step3:获取设备描述符
req data: 80 06 00 01 00 00 12 00
rsp data: 12 01 00 02 00 00 00 40 10 08 21 F1 00 02 01 02 03 01
//step4:获取设备配置信息
req data: 80 06 00 02 00 00 ff 00
rsp data: 09 02 27 00 01 01 04 C0 32 09 04 00 00 03 FF 00 00 00 07 05 01 02 00 02 
          00 07 05 81 02 00 02 00 07 05 82 03 08 00 10 (39bytes)
//step5:获取字符串描述信息
req data: 80 06 03 03 09 04 ff 00
rsp data: 1A 03 33 00 31 00 36 00 39 00 33 00 34 00 37 00 44 00 33 00 35 00 33 00 
          32 00 
//step6:用户自定义请求
req data: C0 A0 00 00 04 00 10 00
rsp data: 28 00 00 00 00 01 04 00 01 00 00 00 00 00 00 00 

//step7:用户自定义请求
req data: C0 A0 00 00 04 00 28 00
rsp data: 28 00 00 00 00 01 04 00 01 00 00 00 00 00 00 00 
          00 00 57 49 4E 55 53 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
//step8:获取字符串描述符
req data: 80 06 00 03 00 00 ff 00
rsp data: 04 03 09 04 
//step9:获取字符串描述符
req data: 80 06 02 03 09 04 ff 00  
rsp data: 36 03 42 00 55 00 53 00 4D 00 55 00 53 00 54 00 20 00 55 00 53 00 42 00 
          2D 00 43 00 41 00 4E 00 28 00 46 00 44 00 29 00 20 00 46 00 61 00 6D 00 
          69 00 6C 00 79 00 
          (bumust CANFD Family)
//step10:获取设备描述符
req data: 80 06 00 01 00 00 12 00
rsp data: 12 01 00 02 00 00 00 40 10 08 21 F1 00 02 01 02 03 01
//step11:预获取配置描述符0
req data: 80 06 00 02 00 00 09 00 
rsp data: 09 02 27 00 01 01 04 C0 32 
//step12:获取配置描述符
req data: 80 06 00 02 00 00 27 00 
rsp data: 09 02 27 00 01 01 04 C0 32 09 04 00 00 03 FF 00 00 00 07 05 01 02 00 02 
          00 07 05 81 02 00 02 00 07 05 82 03 08 00 10 
//step13:获取状态Get Status
req data: 80 00 00 00 00 00 02 00 
rsp data: 01 00
//step14:Set Config 1
req data: 00 09 01 00 00 00 00 00
rsp data: 00
//step15:获取字符串描述符0
req data: 80 06 00 03 00 00 ff 00
rsp data: 04 03 09 04
//step16:获取字符串描述符1
req data: 80 06 01 03 09 04 ff 00
rsp data: 10 03 42 00 55 00 53 00 4D 00 55 00 53 00 54 00 
          (busmust)
//step17:获取字符串描述符2
req data: 80 06 02 03 09 04 ff 00  
rsp data: 36 03 42 00 55 00 53 00 4D 00 55 00 53 00 54 00 20 00 55 00 53 00 42 00 
          2D 00 43 00 41 00 4E 00 28 00 46 00 44 00 29 00 20 00 46 00 61 00 6D 00 
          69 00 6C 00 79 00 
          (bumust CANFD Family)
//step18:预获取配置描述符0
req data: 80 06 00 02 00 00 09 00 
rsp data: 09 02 27 00 01 01 04 C0 32
//step19:获取配置描述符0
req data: 80 06 00 02 00 00 27 00 
rsp data: 09 02 27 00 01 01 04 C0 32 09 04 00 00 03 FF 00 00 00 07 05 01 02 00 02 
          00 07 05 81 02 00 02 00 07 05 82 03 08 00 10

四、常见问题解决

4.1 bcd版本号的要求

        USB设备描述符的bcd版本号必须设置为0x0200,大于0x0200会被当做WINUSB2.0,小于0x0200,无法被WINDOWS当做WINUSB设备。

4.2 正确适配后,还是无法正常被识别为WINUSB设备

winusb1.0首先通过判断USB bcd版本号是否为0x0200来决定是否查询0xEE处字符串描述符。

读取到符合WINUSB1.0标准的0xEE处字符串描述符后,再读取厂商自定义描述0x04、0x05!

由于读取0xEE处字符串描述的方式,并不属于USB规范的范畴,所以市面上部分设备在收到0xEE处字符串描述符的读取指令时,会发生枚举失败或设备卡死的情况!

为了解决上述这个问题,微软在设备第一次接入时会查询0xEE处的描述符,并将这一次的查询结果写入注册表。后续同样PIV VID的设备再接入时,windows不再查询0xEE处的描述符,而是根据注册表的记录信息来决定是否查询厂商自定义描述符!

所以,如果WINUSB设备初次枚举失败时,后续如果仍然想让设备查询0xEE处的描述符,必须将如下路径下的注册表信息OSVC删除:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\usbflags\0810F12A0504

注意,上述路径中的0810F12A0504对应VID PID 为0810 F12A的设备,不同USB设备要根据自己的USB VID PID来删除对应的OSVC注册表信息!

五、调试工具

有条件的同学可以淘一个USB分析仪,可以用来抓取PC和STM32之间的USB通讯数据。包括枚举阶段、正常通讯阶段的数据等。有个仪器通常会事半功倍。笔者推荐一款自用的型号,支持USB Packet View软件,价格也比市面上带软件支持的一些款式亲民很多!

https://item.taobao.com/item.htm?abbucket=16&id=840316491660

六、参考链接

6.1 github上的开源适配例程

https://github.com/MichaelTien8901/STM32WINUSB

标签:02,03,WINUSB1.0,01,适配,00,STM32,描述符,data
From: https://blog.csdn.net/Dreamer_young/article/details/143061828

相关文章

  • 【TFT彩屏移植】STM32F4移植1.8寸TFT彩屏简明教程
    目录一.移植说明二.移植1.例程    物理接口:    延时函数:     底层驱动文件:    GUI界面文件:    测试demo:2.移植至F4创建工程:        调试接口选择SW:        RCC中HSE选择外部晶振:        GPIO配......
  • stm32是世界上最简单的
    例一include"stm32f10x.h"include"generic.h"//1.打开时钟2.配置3.初始化例子:点gpioa的第一个灯voidpin_init(GPIO_TypeDef*GPIOx,,uint16_tGPIO_Pin,GPIOMode_TypeDefGPIO_Mode){//直接调用这个函数if(GPIOx=GPIOA)RCC_APB2PeriphClockCdm(RCC_APB2Perph_GPIO......
  • 二、STM32F103C8T6-定时器
    STM32F103C8T6定时器概述STM32F103C8T6作为一款广泛使用的微控制器,内置多个定时器,能够支持多种计时和控制功能,如精确延时、脉冲宽度调制(PWM)、捕获比较(Capture/Compare)、输入捕获和输出比较等。这些功能在电机控制、信号测量、周期性事件触发等应用中非常常用。STM32F103C8T......
  • 解决一下、在学习江协科技stm32f103开发板操作寄存器无法点亮小灯,但是可以正常熄灭遇
    目录 本人问题:目前搜集网上有关信息有两种解决方案: 本人问题:问题:学习江协科技用操作寄存器的方式进行点亮小灯,代码正确,但是点亮小灯无法点亮,需要重新拔下来下载器再插入电脑USB口才可以点亮。但是熄灭小灯可以正常实现。本人代码:点亮:#include"stm32f10x.h"......
  • STM32 ADC实例解析(1)-寄存器方式
    文章目录一、寄存器列表二、示例代码三、总结优点:缺点:在很长的一段时间里我在项目中都是使用寄存器方式一、寄存器列表__IOuint32_tSR;/!<ADC状态寄存器,地址偏移量:0x00/__IOuint32_tCR1;/!<ADC控制寄存器1,地址偏移量:0x04/__IOuint32_tCR2;/!<ADC控制寄存......
  • STM32 ADC实例解析(1)-HAL+DMA方式
    文章目录一、STM32ADC与DMA的结合使用初始化ADC:配置DMA:启动DMA传输:中断处理(可选):二、示例代码初始化GPIO设置中断设置三、应用优势高效性:减轻CPU负担:灵活性:易用性:随着开发项目的累计,将ADC与DMA结合使用,可以实现高效的数据采集和处理。一、STM32ADC与DMA的结合......
  • 10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说
    10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说明书+proteus)功能描述:直流电机的调速器设计设计,需要设计一个调速与控制系统,是设备可以直接控制和读取信息,并且显示。①设计直流电机转速控制系统;②通过按键调节直流电机转速;③可以在......
  • 10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说
    10093-基于STM32的无线串口小型直流电机调速器设计(仿真+原理图+源代码工程+详细介绍说明书+proteus)功能描述:直流电机的调速器设计设计,需要设计一个调速与控制系统,是设备可以直接控制和读取信息,并且显示。①设计直流电机转速控制系统;②通过按键调节直流电机转速;③可以在......
  • 【设计模式】适配器模式
    设计模式【设计模式】工厂方法模式【设计模式】抽象工厂模式【设计模式】单例模式【设计模式】策略模式【设计模式】观察者模式【设计模式】装饰模式【设计模式】适配器模式 一、介绍适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。适配器可......
  • STM32(二十):PWR电源控制
    PWR(PowerControl)电源控制        PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能        可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务   ......