STM32的OTG_HS笔记
当OTG HS模块检测到以B型设备插入主机时,就会驱使设备进入Powered状态。OTG_HS会自动连接DP的上拉电阻, 以告知主机本设备为全速设备。同时产生一个请求会话中断(session request interrupt, GINTSTS.SRQINT)。
在Powered状态下,OTG_HS只接受来自主机的reset指令。当接收到reset指令后,将产生一个中断(GINTSTS.USBRST)。 reset结束后就会产生一个枚举结束中断(enumeration done interrupt, GINTSTS.ENUMDNE),同时设备进入Default状态。
我们可以通过OTG_HS_DCTL的SDIS位,断开DP的上拉电阻从而移除设备,此时即使没有真的把设备从USB口中拔出, 也相当于断开了连接,设备退出Powered状态。
在Default状态下,OTG_HS只接受来自主机的SET_ADDRESS指令。在接收到分配的地址后,由应用程序将之写到OTG_HS_DCTL的DAD位中。 OTG_HS进入Addressed状态,主机可以通过刚分配的地址访问OTG_HS。
OTG_HS会一直监视着USB总线的活动,当总线上持续3ms处于空闲状态,就会产生一个将要挂起的中断(early suspend interrupt, GINTSTS.ESUSP)。在3ms之后将产生一个挂起中断(suspend interrupt, GINTSTS.USBSUSP),OTG_HS进入挂起状态, 同时置位状态寄存器的挂起位(OTG_HS_DSTS.SUSPSTS)。
应用程序可以通过置位控制寄存器的远程唤醒位(OTG_HS_DCTL.RWUSIG),并在1到15ms后清除,就可以自动退出挂起状态。
主机也可以通过发送一个resume的信号,唤醒设备,此时将产生一个resume中断(GINTSTS.WKUPINT)。