介紹一種使用MAX3420作為USB控制器、ATtiny 13作為微處理器設計的Windows音量控制器。該音量控制器利用硬件SPI接口,對Windows系統的音量進行控制。詳細介紹設計系統過程中,選擇設計方案,完善程序代碼,最終實現USB接口控制的詳細過程。
關鍵詞 USB SPI HID Windows
USB技術在現代電子系統中應用得越來越廣泛。很多計算機上甚至去掉了傳統的串口,全部改用USB口的鼠標、鍵盤,甚至風扇。傳統的USB控制器在使用時,需要大量的與主控機相連的接口連線,占用了大量的CPU I/O口資源。隨著電子技術的高速發展,USB控制器向小體積、低功耗的方向發展。本文介紹如何使用MAX3420進行Windows系統HID設計的過程。
本設計的首要目的就是,尋找一種快捷的方法來調整音量或者暫停播放,而不需要移動鼠標來尋找Windows Media Player窗口。該系統插在USB端口上,只有一個旋鈕起主要作用。旋轉這個按鈕可以調節音量。按一次旋鈕暫停播放,再按一次開始播放。由于該旋鈕掌控主要的Windows音量控制,因此,它可以調節任何當前播放聲音的音量,例如,電子郵件提示音或者是游戲聲音。該音量控制器即使在Windows播放器不是當前操作窗口的情況下也仍然對其有效。為了省去設計底層驅動程序的工作,把該器件設計成USB人機接口設備(HID)。把HID接入Windows系統,它就可以工作了。
1? 低成本的USB系統
系統設計中最重要的一點是,選擇一種低成本的微控制器和USB解決方案。ATtiny13型微控制器本身并不含有USB控制器,所以使用Maxim公司的 MAX3420E型USB控制器,而且僅需要一些用于普通的串行外圍接口設備(SPI)的指令就可以與任何微處理器聯合使用。與MAX3420E對話,會占用ATtiny13中5個I/O引腳中的4個。
這里簡單介紹一下MAX3420。它是Maxim公司推出的一種全速USB(12 Mbps)外設控制器,支持USB2.0協議。MAX3420內建全速收發器,支持±15 kV的ESD保護,可以編程控制USB總線的連接和斷開;內含的串行接口引擎可以控制底層的USB協議細節,如錯誤校驗和總線重連接。MAX3420通過SPI接口操作其內部寄存器,工作頻率為26 MHz,任何支持SPI主模式的CPU只使用3~4根線便可增加USB功能。
圖1是本系統的電路原理。U1是USB控制器MAX3420E。U2是MAX6349TL,它可提供3.3 V、150 mA的輸出,具有上電復位(POR)電路,可直接與MAX3420E的RES引腳連接。在USB外設這樣的熱插拔設計中,良好的外部POR電路非常重要。與USB連接頭上的 VBUS5 V信號相連接,并且將其調整至MAX3420E和ATtiny13所需的3.3 V。旋轉編碼器和發光二極管與MAX3420E的通用I/O引腳相連接。連接器J2用于ATtiny的調試和編碼輸入。電阻R1將編程/輸入復位同系統復位隔開。上拉電阻R2確保當編程器或ICE使用調試連接器J2時,MAX3420E的SPI端口不被選中。
ATtiny13在管理MAX3420E的SPI端口時采用半雙工模式,只使用一個雙向數據引腳。電阻R3可避免在使用這種方式讀取MAX3420E寄存器數據時的爭用問題。在第8個SCLK信號上升沿到來時,MAX3420E的SPI開始對命令字節的第8位進行采樣,并在第1個數據位到來后立即驅動數據引腳。
2? 對話式SPI[1]
ATtiny13并不包含有SPI硬件單元。MAX3420E的SPI比較簡單,且可以任意速率運行,可以對ATtiny13的I/O引腳進行位響應。
MAX3420E在三線、四線或五線SPI情況下都可以工作。另外還有幾個不可省去的信號:串行時鐘信號(SCLK)、從器件選擇(SS)以及雙向數據引腳的主控制器輸出從機輸入/主控制器輸入從機輸出 (MOSI/MISO)信號。本設計中用一條4位的引線把ATtiny13的一個輸入引腳同MAX3420E的INT引腳連接起來,以便節約碼字空間并使得SPI總線通信量最小。
3? HID基礎
USB HID規范的主要思想是要定義一個可以和應用程序聯合應用的傳感器、按鈕和LED的廣泛的類型范圍。“USB器件使用者論壇”的“通用串行總線HID用法表”中詳述了數百種用法。HID協議是雙方面的協議,HID器件和Windows應用都必須同意使用HID規范中的特定碼符。HID文件是概念性的但卻有相當復雜的說明。
HID外部設備通過發送報告與Windows進行通信。HID設計的主要任務是要創造出一種可以傳達對操作系統控制意圖的報告格式。對于此項設計,需要對以下幾項進行控制:音量加、音量減、暫停、播放、下一曲目和上一曲目。這幾項中的每一項在HID用法表中都有一個描述項。
下面的程序是HID報告描述符。它是用從網站www.usb.org.上得到的HID工具程序構建的。
.DB 0x05,0x0C
;使用頁面(用戶).DB 0x09,0x01
;遠程控制.DB 0xA1,0x01.DB 0x15,0x00
;Logical Minimum = 0.DB 0x25,0x01
;Logical Maximum = 1.DB 0x09,0xE9
;VOL+.DB 0x09,0xEA
;VOL-.DB 0x09,0xB1
;Pause.DB 0x09,0xB0
;Play.DB 0x09,0xB5;檢測下一次
.DB 0x09,0xB6;檢測前一次
.DB 0x75,0x01;描述符報告大小
.DB 0x95,0x06;描述符報告數量
.DB 0x81,0x02;輸入描述符報告
.DB 0x75,0x01;描述符報告大小
.DB 0x95,0x02;描述符報告數量
.DB 0x81,0x01.DB 0xC0
當主機發出“獲取描述符報告”要求時,ATtiny13將該表返回給主機。報告描述符的格式是單字節報告,以使用(VOL+)行開頭的描述符將二進制數據集合到一個以LSB開頭的字節內。控制項只需要6位,所以該字節內的最后兩位被賦予0值。描述符報告格式如下:
當Windows識別并進行USB枚舉后,為了得到上述格式的單字節響應,操作系統開始向終端3IN發送周期性IN請求。該部件監控旋轉控制的變化情況,并且當有動作(如音量增加)請求時發送通信數據;沒有動作請求時,該固件返回0值。
MAX3420E簡化了USB修改過程,SPI主控器(即ATtiny13)將報告數據字節寫入EP3INFIFO(endpoint 3 IN FIFO)的寄存器。然后SPI主控器將數值1寫入EP3INBC(endpoint3IN byte count)寄存器,表示為了響應USB的下一個IN請求,將會傳送1個字節。傳送發生后,MAX3420E產生中斷請求,表明下一個字節的數據可以寫入EP3INFIFO了。
下面是完整的傳送程序。可以將音量控制器的HID信息傳送給PC機。看似非常簡單,但是該編碼卻包含了很多的HID控制頁面。剩余的代碼實現代碼循環。該循環會檢測旋轉控制器,然后點亮發光二極管。對任意USB外圍器件來說,USB樣板文件代碼需要進行內部處理。這個樣板文件代碼控制著器件的枚舉、懸掛、恢復以及USB總線置零等命令。
Send_byte:
idi MAX_Reg,rEP3INFIFO
mov MAX_Dat,audio_flags
clr audio_flags
rcall wreg
idi MAX_Reg, rEP3INBC
mov MAX_Dat,1
rjmp wreg
4? 讀取旋轉控制
旋轉編碼器用格雷編碼端子A和B分別表示順時針和逆時針旋轉。旋轉控制器與MAX3420E上有內置上拉電阻的GPIN引腳相連。圖2顯示的是左旋和右旋時的開關轉接狀態。鎖定位置狀態1和3是控制停止位置。控制器經過1個或3個狀態后,可到下一個鎖定位置。該固件只需對旋鈕旋轉進行譯碼,就可以實現向鎖定狀態1和3的轉換。例如,實現右旋狀態轉換需要由3到1或由2到3。
5? 完善代碼
ATtiny13有512字長的程序存儲空間。編碼需要完成以下幾項工作: 首先要對設備進行枚舉。這一步包括對MAX3420主控制器的各種類型的“獲取描述符”請求進行解碼,對對應的表數據進行定位以及對終端零值FIFO進行數據寫入,以將其傳送至固件。
編碼時也應該為隨時發生的USB總線置0以及USB總線的懸掛和恢復進行測試。必須對旋轉控制位置和按鈕開關狀態進行周期性讀取和譯碼。當主機接受了由EP3IN傳來的用于發送HID控制數據的信息包后,該代碼還必須為下一次的IN傳送進行終端的數據加載,并為下一次的數據傳輸表明控制端點。
為了減小代碼量,設計過程中采用下面的方法: 第一,省去了可選擇性USB串描述符。這些描述符是描述諸如供應商、器件類型等的文本串。這些字符串只是信息性質的,對USB外圍器件的操作來說,沒有任何價值。第二,沒有使用可選擇性USB遙控喚醒部分。這個部分實現起來并不困難(MAX3420E會承擔這項工作的絕大部分),但是卻會占用碼字空間。第三,沒有把HID報告的描述符寫入程序閃存器,而是寫入EEPROM。ATtiny13有64字節的EEPROM,可以寫入該EEPROM的任意表數據,都會保存在程序閃存器中。
6? 寫入代碼
如果只用圖符方式進行此項設計,那么可以用6引腳的J2連接AVRISP2在線程序設計器來下載這些程序模塊。如果想要研究或修改該代碼,也可以把ATJTAGICE2ND(用于AVR系列的完全在線仿真器)連接到J2上。不管使用哪種下載方式,都不要忘記把HEX文件(閃存器代碼)和EEP模塊(EEPROM數據)都寫進去。
7? 總結[2]
現在的電子應用中,USB接口幾乎已經取代了串行接口成為PC機上接口連接的首選。本設計表明:雖然USB比串行端口更為復雜,但是USB連接卻并不需要更多的代碼或者昂貴的微處理器。代碼的絕大部分是USB樣板文件,因此可以在多項設計中重復使用它。另外,USB有巨大的優勢:從電纜中獲取電源,自動的“握手”和錯誤檢測以及可以進行熱插拔。如果想要保留已有的MCU和工具,可以采用諸如MAX3420E那樣的基于SPI的USB控制器來搭建USB外圍電路。
評論
查看更多