其實早就想學(xué)習(xí)USB了,但是開始的時候由于基礎(chǔ)差點,看到USB那么多繁復(fù)的上電復(fù)位啊枚舉啊還有那么多的包啊,頭很大沒有一點思路。所以當(dāng)時只是看看資料翻翻周立功的《PDIUSBD12 USB固件編程與驅(qū)動開發(fā)》做個了解,并沒有深入。但是正如圈圈的USB小組里說的,現(xiàn)在的電子工程師不懂USB可不行,所以決心重新著手USB的進(jìn)階了。其實我以前的51實驗板和MSP430的板子上面都有USB的這一塊電路,只可惜實驗程序?qū)懙貌粔蜥槍Γ钥雌饋砗苜M勁,也提不起我的興趣?,F(xiàn)在有圈圈的板子,我想那么多有針對性并且完整的程序在等著,豈有學(xué)不會之理!
我的第一篇USB日志從硬件下手,至于基本的一些概念當(dāng)然是要先了解的,但是我以為學(xué)習(xí)應(yīng)該以實踐為主,以練帶學(xué),從中不斷積累。所以,在了解了一些基本的USB的概念和PDIUSBD12芯片以后,應(yīng)該著手實踐了。其實如果你不是做USB的芯片開發(fā),對于那一大堆理論也不是必須完全領(lǐng)會的,我也是帶著似懂非懂的狀態(tài)來操控PDIUSBD12的,對于它的一些寄存器的控制是重點,掌握了這個基本算是入了門,至于其它的一些時序上的讀寫操作什么的我想對于有基礎(chǔ)的人不是難點。
先來看一下PDIUSBD12的引腳配置和引腳分配:
圈圈的原理圖我就不貼了(不好截圖,有點亂,呵呵~~)。D0-D7口接單片機(jī)的P0口,因為實驗中不使用DMA傳輸,所以與DMA傳輸有關(guān)的DMREQ,DMACK_N,EOT_N幾個引腳被懸空或者接地了。CLKOUT,VOUT3.3和SUSPEND三個引腳由于不使用就懸空或者接地了。GL_N接一個電阻和LED指示燈用于指示通信狀態(tài),INT_N接單片機(jī)的一個中斷口,D+和D-兩個差分信號是接標(biāo)準(zhǔn)USB接口的,XTAL1和XTAL2之間接16MHz的晶振,另外VCC,GND自不必說。最后來看下幾個可以有不同接法的引腳:ALE,RD_N,WR_N,CS_N,其實這幾個引腳的不同接法是普遍性的,也就是說你可以把這幾個腳接成單片機(jī)時序控制數(shù)據(jù)地址的讀寫操作,也可以把PDIUSBD12的寄存器接成單片機(jī)的外部RAM,這樣對寄存器的尋址就和RAM一樣了,可以免去復(fù)雜的時序操作。而我們看到圈圈的電路里采用了前者,也就是用時序來讀寫D12的寄存器,因此它的電路接法是:把ALE接地,CS_N接地(片選有效),WR_N,RD_N接單片機(jī)的專用讀寫口P3.6和P3.7(采用時序讀寫操作這兩個口其實不一定非得接這兩個口,接其它任何的IO口也行),所以在程序里面我們會看到有專門的D12寄存器讀寫子程序。
我們再來討論一下后者的接法實現(xiàn),如圖:
這種接法是把D12的ALE腳與單片機(jī)的ALE腳相接,這是專用的外部RAM擴(kuò)展,詳細(xì)的說明(包括RAM擴(kuò)展接法的尋址和讀寫)在CAN學(xué)習(xí)筆記的硬件部分有介紹了。
以上兩種寄存器讀寫方式都是很有代表性的,無所謂誰好誰壞,根據(jù)個人習(xí)慣吧。其實在RAM尋址空間允許的情況下采用后者還是比較方便的。但是圈圈采用了前者,那么在以后的程序中都以此為基礎(chǔ)進(jìn)行編程。
上面分析了D12的各個管腳的分配情況,有些腳還必須接一定的電阻,如差分信號D+和D-就必須在接1K的電阻后接VCC或者GND。USB標(biāo)準(zhǔn)接口的四個信號口,中間兩個就是接差分信號的,而邊上兩個就是電源信號(從計算機(jī)接出的+5V,有時大家在設(shè)計時往往利用這個5V做系統(tǒng)電源)。
硬件電路分析到這里大概能對D12有一個初步的掌握了,下一步就應(yīng)該去熟悉一下D12內(nèi)部的一些寄存器以及這些寄存器在不同的配置狀態(tài)下都能實現(xiàn)什么樣工作。