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