打印
[STM32F1]

USB HID正常运行过程中,USB复位了,PC如何响应与处理

[复制链接]
7999|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mjj123|  楼主 | 2015-6-27 23:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mjj123 于 2015-6-28 15:21 编辑

设备插在电脑上,USB HID正常枚举成功,而且读写输入都正常,
但在运行过程中,USB被复位了,此时地址复位成0,一切都初始化了,PC该如何响应与处理,
因此此时没有拔插USB的动作,PC不会检测到有新的USB插入电脑的行为,

当PC与USB设备通信中,出现失败时,PC会如何处理这种情况,是重新枚举没?(但没有重新拔插的动作)

谢谢各位解惑
---------------------------------------------------------------------------  USB 枚举过程 简介 ---------------------------------------------------------------------------------------------
关于USB枚举的过程:
1,2,5阶段  不需要STM32 应用程序操作
1.主机集线器检测到新设备
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。(有的是单片机控制的,有的是直接接了上拉电阻,设备上电之后,直接上拉了,我的板卡就是这种情况。);当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)
2.主机发送Get_Status请求
每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。
3.4阶段,需要STM32 应用程序操作
3.主机发送Set_Feature请求,集线器重启端口 ,(即使USB自身复位)
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重启端口。集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。
STM32通过USB中断,复位USB设备,此时应用驱动程序开始执行操作
4.集线器在设备和主机之间建立一个信号通路 (完成复位)
主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于默认状态了,设备已经准备好通过Endpoint 0 的默认流程响应控制传输,即设备现在使用默认地址0x0与主机通信。
5.集线器检测设备速度
集线器通过测定哪根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。

之后阶段,开始获取配置描述符,设备描述符,端口描述符,报告描述符等,当然中间可以还会出现复位情况

由以上USB枚举过程来看,仅在第一阶段 1.主机集线器检测到新设备 时,PC才发起一次枚举行为,
(当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。) ,如果 主机集线器监视着每个端口的信号电压没有变化,则PC是不会枚举的;

当然除非PC软件强制枚举操作,这个没研究;

故,单片机软件复位(nSYSRESET = 1)因发的复位操作,不影响DP+的电压变化,PC也检测不到变化,不会枚举------------------------------------------------------------  STM32 软件复位之后的 USB的初始化工作 -------------------------

1. 时钟的配置,执行函数 void SystemInit (void),工作时钟初始化完成
2. USB时钟配置: 分频与时能         
        RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);//72M/1.5 = 48M
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
3. USB中断操作:使能中断,配置中断优先级
4. USB HID初始化:由函数  void CustomHID_init(void)完成
    1)Get_SerialNum(); 设备字符串序列,此与驱动的安装有关,不同的USB设备,此序号不同,区别不同的HID设备
    2)USB强制复位,清中断,使能中断等操作
    3)标记此设备处于未连接状态    bDeviceState = UNCONNECTED;  此变量bDeviceState仅为状态标记,无实际用途

以上为USB初始化的过程,重点问题是  USB强制复位,复位了哪些寄存器?
沙发
598330983| | 2015-6-28 00:08 | 只看该作者
是提醒你该设备无法识别

使用特权

评论回复
板凳
john_lee| | 2015-6-28 10:10 | 只看该作者
单片机复位了?那么复位后到 USB 重新初始化之前,应该是拔出状态,初始化之后为插入状态,PC 是可以检测到一个拔出后再插入的动作,然后 PC 自然会重新枚举该 USB 设备的。

使用特权

评论回复
地板
huangqi412| | 2015-6-28 11:04 | 只看该作者
楼主自己实验一下

使用特权

评论回复
5
彩虹超新星| | 2015-6-28 11:11 | 只看该作者
无疑,这是要重新枚举的,复位之后原来枚举设备的信息都没有了,所以要重新枚举设备!

使用特权

评论回复
6
mark0668| | 2015-6-28 11:36 | 只看该作者
不会枚举了,是因为有个上拉电阻在那上拉了,这个可以用个信号来控制这个上拉就行了。

使用特权

评论回复
7
mjj123|  楼主 | 2015-6-28 13:29 | 只看该作者
john_lee 发表于 2015-6-28 10:10
单片机复位了?那么复位后到 USB 重新初始化之前,应该是拔出状态,初始化之后为插入状态,PC 是可以检测到 ...

只是STM32 MCU软件复位, 也就是系统复位(复位控制寄存器中的SYSRESETREQ位置1), 而且USB的 DM,DP两个数据引脚,DP是直接上拉到3.3V上去的,STM32没有引脚控制DP引脚的电压,即上电之后DP+引脚电压即为3.3V高电平;

此时,PC应该检测不到USB拔出的状态吧?

使用特权

评论回复
8
gaoyang9992006| | 2015-6-28 15:45 | 只看该作者
这个要看驱动程序如何处理了。

使用特权

评论回复
9
mjj123|  楼主 | 2015-6-28 15:56 | 只看该作者
本帖最后由 mjj123 于 2015-6-29 23:33 编辑

https://bbs.21ic.com/icview-110280-1-1.html  中

香水城  版主 的答复
USB模块复位后,它不再响应PC来的属于旧连接的请求,PC收不到设备的响应就会自动地从新复位枚举,你不需要做特别的操作。

也就是说,我PC端程序一直处于尝试连接中,PC端尝试连接过程中收不到USB设备的响应,则PC回重新复位USB并重新枚举

如果是这样的话,枚举的开启条件不仅仅是 拔插USB设备的物理触发了, PC也可以通过尝试与原地址USB设备通信,得不到响应,二使得PC复位与重新枚举?

那这样的话 ,从PC端也可以解决此问题了
-----------------------------------------------------------------------------------------------------------------------------------------------------------
USB规划上的一句话:
一旦在中断通道上检测到一个引起中止的条件 或收到设备发来的 STALL 握手信号 所有正等待的 I R P 都会中止 由软件通过独立的控制通道来消除中止条件 清除后 设备和主机都复位到 D at a 0的状态 如果总线上出现了一个影响传送的错误 则中断处理事务会停止。
USB复位之后,设备的地址变为0,且USB自己挂起了,PC主机发送数据USB HID设备不再响应,则在中断通道上会检测到一个错误,没任何响应,且等待超时,此时PC会重新枚举
-----------我测试的测试为: 按下按键时,软件复位MCU STM32芯片,在调试中,MCU RESET之后,首先进入USB的RESET中断,之后进入枚举过程;

这是PC端对USB无响应的自动处理,复位重新枚举,枚举成功则OK,不成功也不再显示无法识别的设备或者驱动安装失败等等的提示

使用特权

评论回复
10
mjj123|  楼主 | 2015-6-28 16:07 | 只看该作者
本帖最后由 mjj123 于 2015-6-29 23:47 编辑

https://bbs.21ic.com/icview-110280-1-1.html  中
楼主 xing6507 的方法如下:

情况是这样的
当初设计时为了少用一个IO口,直接D+上拉1.5K到3.3V的,现在
麻烦了,不用IWDG又担心干扰问题。
不过复位后,端口1的HID的输出好像没问题,但端口0的请求不能响应。
可不可以在IWDG复位时将D+配置成普通IO,强制输出0,延时
一段时间,再重新配置为USB D+功能,以模拟D+的上拉为低电平?

即软件复位后,强制D+引脚做一个拉低,拉高的过程,使电脑PC能检测到一个USB设备的断开与连接,
之后再配置USB外设,这样PC就认为有一个新的设备连接上,则重新枚举

这种从底层STM32端解决的方式也可能可以,但有待于验证-----------------------------------------------------------------------------------------------------------------------------
经测试, PA12首先配置为 输出管脚,并拉低后拉高
         GPIO_ResetBits(GPIOA,GPIO_Pin_12);
        Delay_s();
         GPIO_SetBits(GPIOA,GPIO_Pin_12);
PC首先检查到USB断开,接着检查到USB新连接上,做USB插入 枚举操作 ;此种方法是可行的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

54

帖子

0

粉丝