用單片機(jī)實(shí)現(xiàn)USB/PS2 MOUSE的設(shè)計(jì)
引言
USB 低速設(shè)備的設(shè)計(jì)發(fā)展到現(xiàn)在已經(jīng)有了相當(dāng)?shù)某墒於取?各家IC公司都推出了USB DEVICE端的解決方案, 一般以8 BIT CPU CORE + USB SIE為主流構(gòu)架。 SH69P04是中穎電子(Sinowealth)本著豐富USB產(chǎn)品應(yīng)用,降低USB IC成本而設(shè)計(jì)的4BIT OTP單片機(jī), 用以開(kāi)發(fā)USB DEVICE設(shè)備。
SH69P04的功能及特點(diǎn)
圖1
如圖1, SH69P04集成了USB SIE, 支持USB和PS2端口復(fù)用。 內(nèi)建1.5K可控上拉電阻為用戶(hù)節(jié)約成本, 并能建立和PC穩(wěn)定的通訊。 專(zhuān)門(mén)為MOUSE設(shè)計(jì)的I/O端口。 雙CLOCK系統(tǒng)使IC耗電更少, 輕易滿(mǎn)足USB-IF對(duì)SUSPEND電流的要求。 8K×16 BIT的OTP ROM, 方便用戶(hù)開(kāi)發(fā)。 最大可支持40×8 的LCD顯示或31個(gè)I/O, 滿(mǎn)足用戶(hù)的各種應(yīng)用。 另外還內(nèi)建Watch Dog, Low Power Detect功能。
1. USB和PS2端口共用
通過(guò)寄存器實(shí)現(xiàn)USB端口和PS2端口的切換
PS2PU = 1: 如果PS2IS = 1, 則內(nèi)部PS2專(zhuān)用上拉電阻起作用。當(dāng)需要使用USB端口時(shí), 只要讓PS2IS = 0即能關(guān)閉PS2端口及其上拉電阻。
2. 1.5KΩ可控上拉電阻
如圖2, 有了這個(gè)1.5KΩ可控上拉電阻一方面可以節(jié)約成本, 另一方面可以實(shí)現(xiàn)軟開(kāi)關(guān), 確保PC認(rèn)出DEVICE。
當(dāng)USB DEVICE和PC相連后由于內(nèi)部1.5KΩ上拉電阻并未打開(kāi), 所以PC不認(rèn)為有新的設(shè)備連接。 在打開(kāi)上拉電阻前用戶(hù)可以放心的完成程序初始化及其它客戶(hù)程序, 而不必?fù)?dān)心需要及時(shí)響應(yīng)USB總線(xiàn)上的信號(hào)。 這是因?yàn)槿绻麤](méi)有可控的上拉電阻而是直接外加, 那么當(dāng)DEVICE和PC相連后, PC馬上就會(huì)知道有新的設(shè)備連接, 在一定時(shí)間后就會(huì)向DEVICE發(fā)送信號(hào), 如果DEVICE連續(xù)幾次通訊失敗的話(huà), PC就認(rèn)為該DEVICE出錯(cuò)而不會(huì)再和它通訊。
另外結(jié)合Watch Dog可以進(jìn)一步確保DEVICE的連接。 用戶(hù)可以事先計(jì)算一下整個(gè)USB初始化過(guò)程所需的時(shí)間, 并設(shè)置Watch Dog。 萬(wàn)一USB初始化出錯(cuò)就可以產(chǎn)生Watch Dog Reset, 1.5KΩ上拉就被關(guān)閉, 程序重新開(kāi)始。 PC就會(huì)認(rèn)為DEVICE有了一次插拔動(dòng)作。程序死鎖也可以用這種方法來(lái)解決。
3. 專(zhuān)為MOUSE設(shè)計(jì)的I/O端口
如圖3, 原理分析時(shí)Q1.1和Q1.3是輸出方波。 實(shí)際上由于Photo Transistors是采用光敏三極管, 當(dāng)光柵轉(zhuǎn)動(dòng)時(shí), 光敏三極管受到的光線(xiàn)也是連續(xù)變化的, 所以輸出的波形也是連續(xù)變化的。 又因?yàn)楣鈻艧o(wú)法完全阻隔光線(xiàn), 所以會(huì)產(chǎn)生一個(gè)OFFSET電平。 實(shí)際波形如圖4。
圖中VIH表示一旦輸入電平高于VIH, 那么MCU就認(rèn)為是高電平。 VIL表示一旦輸入電平低于VIL, 那么MCU就認(rèn)為是低電平。 在圖4所示的這種狀態(tài)下MCU可以很方便的讀到光柵轉(zhuǎn)動(dòng)的情況。 但是由于干擾或者元器件老化等原因造成OFFSET電平發(fā)生變化, 使得輸入信號(hào)的電平無(wú)法和VIH、VIL相交(如圖5), MCU就會(huì)認(rèn)為輸入的信號(hào)一直為高或一直為低。
SH69P04為每一個(gè)MOUSE的端口提供三檔下拉電阻(如圖4)來(lái)控制OFFSET電平。 通過(guò)寄存器來(lái)選擇下拉電阻的阻值, 用以解決由于OFFSET電平的變化而引起的錯(cuò)誤。
軟件設(shè)計(jì)
USB協(xié)議雖然很復(fù)雜, 但是MOUSE端需要編寫(xiě)的程序卻十分有限。 用戶(hù)很容易就能和PC建立聯(lián)系。(Windows端HID驅(qū)動(dòng)程序由操作系統(tǒng)提供)
1. USB/PS2端口的監(jiān)測(cè)
第一步: 上電, delay 50ms 第二步: 在2ms的時(shí)間內(nèi)監(jiān)測(cè)D-的電平, 如果有4次為高電平, 就是PS2接口。 否
則進(jìn)入第三步第三步: 打開(kāi)USB上拉電阻, delay500us, 反復(fù)監(jiān)測(cè)D+和D-的電平, 直到其中有一個(gè)出現(xiàn)高電平。 如果D+是高電平, 則為PS2接口。 如果D-是低電平, 則進(jìn)入第4步。第四步: 關(guān)閉USB上拉電阻, delay 100us。 如果D+/D-都為低電平, 則為USB接口。
否則就是PS2接口。
2. USB Enumeration過(guò)程
整個(gè)過(guò)程有點(diǎn)像做測(cè)試題。 PC問(wèn), MOUSE回答。 其中關(guān)鍵是要告訴PC, 自身是一個(gè)MOUSE, 支持HID協(xié)議。 由于篇幅有限, 就不詳細(xì)列出了。
3. 把MOUSE的信息傳給PC
在Enumeration過(guò)程中, MOUSE會(huì)告訴PC后續(xù)X,Y,Z,按鍵這些信息的格式。 當(dāng)MOUSE有動(dòng)作時(shí), 只要按這個(gè)格式把數(shù)據(jù)返回給PC就可以了。 剩下的事情PC端HID驅(qū)動(dòng)程序會(huì)去完成。
評(píng)論