引言
當您設計了一塊電路板,將MAX3420E與您喜愛的微控制器整合在一起。加電,插入USB,不能正常工作...,怎么辦? 本文為您提供了答案。第一次調試USB外設器件時,會面臨很大的挑戰。要使MAX3420E能夠正常工作,首先需要按下列步驟進行檢查。
檢查USB 'B'型連接器的引腳
這是最容易出錯的地方―視圖是頂視圖還是底視圖? 引腳1在哪里? 如果您不是機械工程師,這些視圖會讓人感覺無所適從。圖1和圖2可幫您解決這一問題。
圖1. USB B型連接器內部結構
圖2. B型連接器的引腳位置,從PCB的下面看。
圖3. USB電纜線連接器
應采用歐姆表來檢查MAX3420E和USB連接器之間的連線。特別注意D+和D-。二者很容易搞反。請注意,MAX3420E與連接器D+和D-引腳之間有33電阻。對于這么小的電阻,大部分測試是否接通的儀表都會發出“嘀嘀”聲。如果需要檢查USB電纜,請參考圖3。
USB“完整性”檢查
本節闡述設備與USB的連接情況。完整性檢查給出了D+和D-線的工作情況,在沒有USB總線分析儀的情況下,這種方法非常有效。復位處理器,將電纜連接至PC USB端口,初始化代碼執行完畢后,在設置CONNECT位的語句前停止運行。該語句如下:
wreg(rUSBCTL,bmCONNECT); // Connect to USB在執行該語句之前,D+和D-應均為低電平。這是因為電纜的主機側電路通過15k電阻將這些信號下拉至地?,F在,單步執行CONNECT語句后,MAX3420E在D+和VCC (3.3V)之間接入一個1.5k內部電阻。此時,D+應變為高電平,其后會出現一些突發脈沖(圖4)。
圖4. 設置CONNECT = 1時,D+變為高電平,并出現一些突發脈沖。
上面的波形是D+,下面的是D-。該突發波形持續約18s,然后消失。D+保持高電平,D-保持低電平,然后彈出下面的Windows XP消息框(圖5):
圖5. Windows XP提示消息
怎么回事?
請注意,程序為單步執行。到目前為止所作的只是連接了D+上拉電阻。該上拉提示PC有新的USB設備剛剛插入,因此PC開始向該設備發送信號,確定設備類型。這就是圖4中的脈沖信號。由于微控制器代碼停止運行,因此不會命令MAX3420E做出任何響應。PC由于沒有收到響應信號,最終決定(18秒后)忽略該設備。D+為高電平和D-為低電平的總線狀態稱為“USB總線掛起”或者“掛起”。主機停止發送任何信號,MAX3420E的D+上拉電阻保持D+信號為高電平。
圖6. 總線工作情況說明(沒有畫出NAK)
圖6所示為利用LeCroy Instruments (LeCroy兼并了CATC,CATC是該分析儀的最初生產商)的USB總線分析儀測得的總線過程。當PC探測到設備插入后(CONNECT = 1),它發出一個USB總線復位信號(沒有畫出)。然后,在Transfer 0,它發出一個“GET_DESCRIPTOR”請求以獲取“DEVICE”類型。5.687s之后,PC發出第二個USB總線復位信號,再嘗試5.578s,要求得到設備描述符。PC第三次復位總線,再嘗試5.580s,然后掛起總線并放棄嘗試。由于沒有運行固件,設備不會聽取或應答(ACK) PC的請求。
圖7. 圖6中第一次傳輸過程展開后的數據包和NAK握手信號
為清晰起見,圖6沒有畫出MAX3420E回送的NAK (非應答)握手信號。圖7將第一次傳輸過程展開,詳細地顯示數據包?,F在可以看到Transfer 0以下面三個封包開始:
- 主機向剛剛連上的設備 在這種情況下,USB發送地址0)發送一個SETUP包(63)。
- 主機發送一個DATA包(64),包含一個8字節“操作碼”。
- 外設(MAX3420E)回送一個ACK包(65),確認無差錯地收到兩個主機封包。
接下來,主機開始發送IN請求,并從Transaction 1開始。對應每個IN請求,MAX3420E回送NAK (非應答)握手信號。這是因為還沒有運行程序,因此,與MAX3420E連接的微控制器不會收到SUDAV IRQ (Setup數據就緒中斷請求)。
注意:MAX3420E通過置位SUDAV IRQ,提示微控制器收到了SETUP包。該信息通知微控制器需要對數據包解碼,并回送要求的數據作為響應。
這些IN-NAK過程持續5.687s,此時PC會復位總線,開始第二次嘗試。圖4中的脈沖信號即是IN-NAK過程。如果仔細觀察示波器,5s后波形將略有變化―這對應總線復位(D+和D-同時置低約30ms),其后是另一個SETUP包。然后,IN-NAK再持續5s。
供參考:另一個分析儀
圖8. Beagle分析儀
產生圖6和圖7波形的USB總線分析儀可能超出了您的預算。盡管本應用筆記假設您只有一個示波器和歐姆表,我們還是強烈建議在USB開發過程中使用USB總線分析儀。我們使用的LeCroy/CATC具有多種優點,包括友好的界面和豐富的軟件,最重要的是它享有工業標準USB測量工具的美譽。通過比對CATC波形來確定實際情況,解決了許多爭論不休的問題(硬件、軟件和芯片等)??偩€總是如實反映情況。
幸虧現在有低成本USB分析儀。圖8所示為Beagle-USB的屏幕截圖。Beagle分析儀能夠以比LeCroy/CATC低很多的價格顯示總線的工作情況。如果對比圖8中的Index 10和圖6中的64字節數據包,會發現它們顯示了完全相同的SETUP數據包。
檢查進程
如果觀察到了圖4中的信號,已經可以確定USB連接器的連線是正確的,而且MAX3420E供電正常。如果還沒有觀察到該顯示,可以嘗試以下措施:- 測量MAX3420E的RES#引腳,確定其為高電平。
- 測量晶振,確保其振蕩頻率為12MHz。必須是12MHz ±0.25%才能滿足USB規范。如果超出容限,檢查所連接的負載電容是否與并聯諧振晶體所規定的電容一致(通常采用18pF)。
- 檢查VCC是否為3.3V。
- 檢查系統接口電壓VL。確保不超過3.6V。
- 如果由VBUS通過一個3.3V穩壓器對MAX3420E的VCC引腳供電,確定連接了USB。否則,MAX3420E的VCC無法供電。
注意:由于固件運行與否和USB電纜連接無關,因此,與總線供電的設計相比,調試自供電設計要簡單一些??梢韵炔捎猛獠?a target="_blank">電源對樣機供電。如果需要,以后可以再轉為總線供電。
下一步檢查您的控制器是否能夠成功地通過SPI總線與MAX3420E寄存器組進行通信。
檢查rreg()和wreg()。
編寫任何程序,無論是采用Maxim的實例代碼還是自己從頭開始編寫代碼,都需要使用讀寫MAX3420E寄存器的函數。下面的例子使用了這些函數原型:
unsigned char rreg(BYTE r); // Read a MAX3420E register byte void wreg(BYTE r,BYTE v); // Write a MAX3420E register byte在調試處理USB傳輸的代碼前,先編寫一個簡單的子程序來測試這些函數。參見圖9的例子:
圖9. 單步執行,檢查“rd” 8次,驗證SPI接口與MAX3420E的通信情況。
圖9中的測試代碼先復位MAX3420E,然后向USBIEN寄存器寫入每字節移動1位的8個字節。每個字節中有一位置位,從00000001開始,然后是00000010,最終以10000000結束。單步執行該函數,檢查“rd”值8次,確定其值為0x01,0x02,0x04,0x08,0x10,0x20,0x40和0x80。如果是這樣,則可以確定SPI接口寄存器的寫和讀操作均正常。如果能夠寫入USBIEN寄存器,并可靠的讀回其內容,那么就可以讀寫所有的MAX3420E寄存器。
圖10. 采用MAXQ2000微控制器的Rowley CrossStudio開發工具,單步執行,檢查變量值。將光標指向“rd”,其數值會彈出。
圖10所示為采用CrossStudio調試MAXQ2000微控制器的屏幕截圖。將光標指向“rd”變量時,將激活彈出窗口(截圖沒有顯示光標)。單步執行代碼時,可采用這種方式來查看任何變量。
測試代碼首先設置微處理器SPI端口。對應每種微處理器類型和特定IO引腳分配,SPI_Init()函數各不相同。然后,代碼向PINCTL寄存器寫入0x10,設置MAX3420E SPI接口為全雙工工作模式。這將置位FDUPSPI位。代碼置位CHIPRES位,然后對其清零,使MAX3420E處于已知的狀態。建議在代碼的開始部分包含芯片復位功能,從而在每一個調試周期的開始使MAX3420E處于已知的狀態。
如果圖10中的代碼沒有產生正確的結果,應檢查SPI信號,確定其工作是否正常。
圖11. 執行第一次wreg()調用
測試程序test_SPI()中的第一次wreg()調用,向MAX3420E的寄存器17寫入數值0x10。SPI總線的波形應與圖11所示一致。
注意:圖11所示的波形使用SPI模式(0,0),在SCLK的上升沿采樣SPI數據,SCLK的空閑電平為低電平。SPI接口不同,顯示的波形會有不同的脈沖持續時間,但是對應SCLK上升沿的數值應該相同。
每次訪問SPI的第一個字節是命令字節,其字節格式如圖12所示。注意圖11中對應前一部分SLCK上升沿的MOSI波形,位模式10001010指定寄存器17 (第7位至第3位是10001,數值為17)。同樣,第1位為高電平,表明是寫操作。第二個字節的位模式是00010000。這是寫入寄存器17的數據,即0x10 (只有第4位FDUPSPI寄存器位置位)。因此,該SPI訪問將0x10寫入寄存器17,置位FDUPSPI位。
圖12. MAX3420E命令字節格式
得到這些波形的一種簡單方法是設置示波器或者邏輯分析儀在SS#的下降沿觸發,單步執行wreg()調用。
圖13. 第一次寫入USBIEN寄存器(test_SPI函數)
test_SPI()中的下一條語句是rreg()函數。第一次進入循環體時,將數值0x01寫入USBIEN寄存器,如圖13所示。
圖14. 第一次調用rreg()函數
然后,test_SPI()函數讀回USBIEN寄存器的數值,第一次通過循環體時,應等于1 (圖14)。每次通過循環體時,寫入和讀回的位應向左移動一個SCLK邊沿。
MAX3420E寄存器寫和讀操作驗證完畢后,可以進一步調試程序。到目前為止所有的檢查步驟均屬于“完整性檢查”?,F在,我們開始實際處理USB通信功能的第一步:需要處理器響應不同的MAX3420E中斷請求位。
IRQ位設置
似乎應該USB總線通信開始后MAX3420E才會置位中斷請求位。實際上,當MAX3420E上電時,就會有IRQ位置位,當插入USB電纜和設置CONNECT = 1時,又有其他IRQ位置位。下面介紹該啟動過程的中斷請求情況。完成復位
當MAX3420E完成復位后,即使還沒有插入USB,某些中斷請求位就會置位。這些位是:
EPIRQ寄存器:
- IN3BAVIRQ
- IN2BAVIRQ
- IN0BAVIRQ
USBIRQ寄存器:
- OSCOKIRQ
注意:MAX3420E IRQ寄存器位不論其對應的使能位(在EPIEN和USBIEN寄存器中)是否置位,均可有效置位。使能位決定是否將請求位傳送到驅動INT引腳的邏輯電路。參見應用筆記3661,MAX3420E中斷系統,了解更詳細的信息。
USB插入后
插入USB (CONNECT = 0)后,即使USB沒有通信,仍有一些USBIRQ位會置位。EPIRQ位與上面的情況一致,但是更多的USBIRQ位將置位:
USBIRQ寄存器:
- OSCOKIRQ
- VBUSIRQ (可能)
注意:USB連接器的VBUS引腳接MAX3420E的VBCOMP輸入引腳是可選項。VBCOMP引腳不對MAX3420E內部供電。它只連接至內部VBUS比較器。
設置CONNECT = 1之后
連接USB使主機發出一個總線復位信號,產生Get_Descriptor-Device請求,最終掛起總線。這些操作會置位USBIRQ寄存器中的更多IRQ位。注意,USB總線復位將清除VBUSIRQ位。
EPIRQ寄存器:
- IN3BAVIRQ
- IN2BAVIRQ
- IN0BAVIRQ
- SUDAVIRQ (通信開始后)
- OSCOKIRQ
- URESIRQ
- URESDNIRQ
- SUSPIRQ (最后)
接下來的情況會取決于您的代碼。如果您觀察到的情況和前面吻合,則表明系統一切正常,可以繼續往下檢查您的代碼。
調試方法:通過3個步驟觸發中斷
剩下的檢查是確保固件能夠正確響應PC發出的不同USB請求命令,并由MAX3420E給出相應信號。如果啟動程序,插入USB后,什么也沒有發生(可能會出現Windows USB錯誤消息),那么可能是您的程序沒有處理中斷。下面的調試方法可以幫助解決這些中斷問題。第1步: 輪詢IRQ位
首先,編寫代碼直接輪詢IRQ位,當關心的IRQ位置位后,使處理器進行相應操作。即使主程序循環進行直接輪詢,也最好使能中斷(各IEN位 = 1和IE = 1)。這樣可以通過觀察MAX3420E INT引腳來了解其工作情況。這一步有效地取消了微控制器中斷系統(和代碼)檢查,使您能夠集中精力實現正確的USB功能。當連續讀取EPIRQ和USBIRQ寄存器時,不必擔心浪費的SPI周期―這一步的目的是使USB正常工作。
第2步: 輪詢INT引腳狀態
一旦USB工作正常后,進行第二步,修改程序來輪詢MAX3420E INT引腳狀態,檢查懸掛的中斷。如果第1步已經驗證了程序,那么在程序主循環中有部分代碼一直讀取EPIRQ和USBIRQ寄存器,檢查懸掛的中斷。插入輪詢微控制器中斷引腳狀態(連接在MAX3420E INT引腳上)的語句,修改第1步的連續檢查。如果MAX3420E INT引腳未產生中斷,可以跳過讀取EPIRQ和USBIRQ寄存器的語句。這種簡單的檢查方式極大地減少了微控制器和MAX3420E之間的SPI數據流量,這是因為只有IRQ位置位時,才對其進行測試。
第3步: 檢查微控制器中斷程序
第3步也是最后一步,將MAX3420E整合到微處理器的中斷系統中。這通常要寫一個中斷向量,以自動將程序執行位置指向MAX3420E處理程序。
評論
查看更多