STM32F107 USB作為device的插拔檢測
在USB的協(xié)議里,只有主機(jī)和HUB具有設(shè)備移出檢測功能,作為從設(shè)備(device)往往不具有設(shè)備斷開連接的檢測,需要自己設(shè)計(jì)一種檢測機(jī)制,判斷USB主設(shè)備是否與之?dāng)嚅_。STM32的USB是OTG設(shè)備,既可以作為主機(jī)也可以作為設(shè)備,當(dāng)其作為設(shè)備通過USB與PC通信時(shí),可能會需要STM32檢測是否與PC斷開連接,這時(shí)候不可以向PC發(fā)數(shù)據(jù),在PC連接上時(shí),可以繼續(xù)USB通信。
檢測USB斷開連接的方法有多種,USB在斷開時(shí)會有SUSPEND中斷,但是USB總線上沒有數(shù)據(jù)時(shí),主機(jī)也可以將其掛起,產(chǎn)生SUSPEND中斷,所以這種方法不可靠,另外就是PC定時(shí)向USB device發(fā)送數(shù)據(jù),當(dāng)USB device沒有收到數(shù)據(jù)時(shí)即可認(rèn)為USB斷開連接,但是這種方法要想提高實(shí)時(shí)性,就需要傳輸大量的握手?jǐn)?shù)據(jù),占用USB總線,不利于USB數(shù)據(jù)的高效率、高速度的傳輸。最好的方法是通過硬件實(shí)現(xiàn),在USB的VBUS上做文章,USB主機(jī)會像device供電,STM32可以檢測該電源引腳,在USB連接時(shí)產(chǎn)生上升沿,斷開時(shí)產(chǎn)生下降沿,據(jù)此可以快速判斷是否與USB主機(jī)斷開連接。
在方案設(shè)計(jì)中遇到的問題是USB斷開沒問題,STM32可以檢測的到,并且CPU正常工作,但是USB連接上時(shí),STM32立馬假死,即CPU仍在工作,只是USB的中斷太頻繁了,程序無法執(zhí)行,產(chǎn)生這種原因不是很清楚,但是可以將中斷關(guān)閉后過段時(shí)間再打開來解決