STM32的USB在作为DEVICE使用的时候经常需要识别到插拔状态。有个VBUS引脚可以检测电压识别。
检测到B-session有效电压,自动使能D+的上拉电阻;触发设备中断:SRQINT@GINTSTS
??检测到Vbus低于B-session有效电压,自动断开上拉电阻;触发设备中断:SEDET@GOTGINT?检测到有效电压会触发HAL_PCD_ConnectCallback回调函数,如下:
HAL_PCD_IRQHandler? ————>
? HAL_PCD_ConnectCallback
检测到无效电压会触发HAL_PCD_DisconnectCallback回调函数,如下:
HAL_PCD_IRQHandler?————>
? HAL_PCD_DisconnectCallback
还可以根据数据传输状态是否空闲检测连接状态。
总线空闲3ms—>触发设备中断:ESUSP@GINTSTS 。3ms—>
触发设备中断:USBSUSP@GINTSTS 。检测到连接状态:
HAL_PCD_IRQHandler————>
? PCD_EP_OutSetupPacket_int————>
? ? HAL_PCD_SetupStageCallback————>
? ? ? USBD_LL_SetupStage————>
? ? ? ? USBD_StdDevReq————>
? ? ? ? ? USBD_SetConfig————>
? ? ? ? ? ? pdev->dev_state = USBD_STATE_CONFIGURED
检测到空闲(挂起)状态:
HAL_PCD_IRQHandler————>
? HAL_PCD_SuspendCallback————>
? ? USBD_LL_Suspend————>
? ? pdev->dev_state == USBD_STATE_SUSPENDED
这两个都可以用于检测USB连接状态。如果都使能的话按照时间轴的顺序看连接:
VBUS检测到有效电压——>数据检测到连接状态。
断开的话,得看VBUS端有没有比较大的电容之类的,受放电时间影响,可能是先检测到空闲——>VBUS检测到无效电压。
阅读全文