USB复位问题

以下电阻是GW3323芯片内部电阻。
在这里插入图片描述

一、现象描述:个别电脑在缺纸3分钟后出现USB重新复位。(不应答主机,过3分钟后出现重新枚举过程)数据如下:
在这里插入图片描述
URB:USB请求块。
USBD:USB状态代码。
在这里插入图片描述
D-(DM)被拉到0.5V。
在这里插入图片描述
PC发给GW3323:1b40…(GW3323收到了,所以回复的是ack)
但GW3323实行USB流控,未调用ude_rx_ack()
所以PC再给芯片发数据:0000…(芯片回复nack)
等芯片合盖后,调用ude_rx_ack(),PC再给芯片发数据:0000…(芯片回复ack)

二、分析与结论
猜想一:芯片休眠造成的复位
关闭USB低功耗唤醒,cfg_bt_sniff_mode_dis =true;—未打开低功耗,也会reset。

猜想二:USB的阻抗匹配,用22Ω电阻。

猜想三:添加PortSatus回复----依旧会reset。
ITF:xxxx REQ:xxxx

**猜想四:**多读几次usbchk_connect()函数能解决,极海USB代码内部逻辑上分析
在这里插入图片描述
此现象的原因分析如下:
枚举成功后,usbchk_connect()读DM电平,为低(低于1.27V),返回connnect(2);为高(高于2.03V),返回disconnect(0),如果碰巧DM每次统计都是高电平那就会误检。
dev_offline_filter内只对软件状态防抖(40次轮询*5ms=200ms),如果usbchk_connect真的出现一次误检,但即可又恢复connect,那这次误检测会被dev_offline_filter过滤掉。pc_remove只是清理状态变量,但usb_device_exit会重新初始化包括io在内的usb配置。
在这里插入图片描述
在160MHz情况下,芯片每20ms读取一下msg状态。
func_usbdev_exit();//在160MHz主频下需要131us
pc_remove();//在160MHz主频下需要600ns
并不符合异常波形中350ms的低电平,且芯片无法把D+\D-都拉到低电平。
在这里插入图片描述
四、改善方法
方法1:检测VUSB电平+DM电平。插上时VUSB为高,DM为低;拔下时,VUSB为低,DM为高。(不适用于硬件上Vbus不接VUSB的电路)//(RTCCON&0x100000)为非0,表示Vbus已接上5V。
方法2:连续采DM电平(PB4),间隔时间为3us。(降低整个代码执行效率)
方法3:每5.11ms检测1s,依旧滤波40次。(影响5ms内其他函数的标记,或要新添一个线程)
在这里插入图片描述
原usr_tmr5ms_thread整个线程不足2us,要是把时间延长,会影响代码的执行效率。
在这里插入图片描述

五、理论基础知识

SOF包(Start Of Frame,全速USB每1ms发送一个,高速USB则是125µs发送一个

在这里插入图片描述
在这里插入图片描述

拔出检测流程图标志说明:
(1)在USB处于从机状态时,3ms内未收到SOF包,触发SUSPEND事件,会开启一个定时器,如果在2S内未收到SOF包,则判断为USB拔出,挂起OTG,发送device out 事件,此处理主要是解决一些HUB的兼容性问题。设备接HUB,HUB插入PC,在HUB拔出时,DM仍为低电平,检测不到USB拔出;
(2)在USB处于从机状态时,会有一个定时器,50ms执行一次,DM的电平和SOF包的读取,都是这个定时器,如果连续三次读取到DM为高电平,并且没有收到SOF包,则判断为USB拔出。此参数TCFG_OTG_SLAVE_OFFLINE_CNT配置读取次数;
(3)只要主机设备检测到DM,DP的电平异常,认为有断连,就会发送reset信号到从机;
在这里插入图片描述
在这里插入图片描述
六、Bus Hound抓包软件的设置
在这里插入图片描述
注意子HID设备不勾选,否则采出来的数据与芯片usb收发函数看到的不一致。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值