利用USB控制器設(shè)計(jì)的Windows音量控制器
掃描二維碼
隨時(shí)隨地手機(jī)看文章
本設(shè)計(jì)的首要目的就是,尋找一種快捷的方法來調(diào)整音量或者暫停播放,而不需要移動(dòng)鼠標(biāo)來尋找Windows Media Player窗口。該系統(tǒng)插在USB端口上,只有一個(gè)旋鈕起主要作用。旋轉(zhuǎn)這個(gè)按鈕可以調(diào)節(jié)音量。按一次旋鈕暫停播放,再按一次開始播放。由于該旋鈕掌控主要的Windows音量控制,因此,它可以調(diào)節(jié)任何當(dāng)前播放聲音的音量,例如,電子郵件提示音或者是游戲聲音。該音量控制器即使在Windows播放器不是當(dāng)前操作窗口的情況下也仍然對(duì)其有效。為了省去設(shè)計(jì)底層驅(qū)動(dòng)程序的工作,把該器件設(shè)計(jì)成USB人機(jī)接口設(shè)備(HID)。把HID接入Windows系統(tǒng),它就可以工作了。
1 低成本的USB系統(tǒng)
系統(tǒng)設(shè)計(jì)中最重要的一點(diǎn)是,選
這里簡(jiǎn)單介紹一下MAX3420。它是Maxim公司推出的一種全速USB(12 Mbps)外設(shè)控制器,支持USB2.0協(xié)議。MAX3420內(nèi)建全速收發(fā)器,支持±15 kV的ESD保護(hù),可以編程控制USB總線的連接和斷開;內(nèi)含的串行接口引擎可以控制底層的USB協(xié)議細(xì)節(jié),如錯(cuò)誤校驗(yàn)和總線重連接。MAX3420通過SPI接口操作其內(nèi)部寄存器,工作頻率為26 MHz,任何支持SPI主模式的CPU只使用3~4根線便可增加USB功能。
圖1是本系統(tǒng)的電路原理。U1是USB控制器MAX3420E。U2是MAX6349TL,它可提供3.3 V、150 mA的輸出,具有上電復(fù)位(POR)電路,可直接與MAX3420E的RES引腳連接。在USB外設(shè)這樣的熱插拔設(shè)計(jì)中,良好的外部POR電路非常重要。與USB連接頭上的 VBUS5 V信號(hào)相連接,并且將其調(diào)整至MAX3420E和ATtiny13所需的3.3 V。旋轉(zhuǎn)編碼器和發(fā)光二極管與MAX3420E的通用I/O引腳相連接。連接器J2用于ATtiny的調(diào)試和編碼輸入。電阻R1將編程/輸入復(fù)位同系統(tǒng)復(fù)位隔開。上拉電阻R2確保當(dāng)編程器或ICE使用調(diào)試連接器J2時(shí),MAX3420E的SPI端口不被選中。
ATtiny13在管理MAX3420E的SPI端口時(shí)采用半雙工模式,只使用一個(gè)雙向數(shù)據(jù)引腳。電阻R3可避免在使用這種方式讀取MAX3420E寄存器數(shù)據(jù)時(shí)的爭(zhēng)用問題。在第8個(gè)SCLK信號(hào)上升沿到來時(shí),MAX3420E的SPI開始對(duì)命令字節(jié)的第8位進(jìn)行采樣,并在第1個(gè)數(shù)據(jù)位到來后立即驅(qū)動(dòng)數(shù)據(jù)引腳。
2 對(duì)話式SPI[1]
ATtiny13并不包含有SPI硬件單元。MAX3420E的SPI比較簡(jiǎn)單,且可以任意速率運(yùn)行,可以對(duì)ATtiny13的I/O引腳進(jìn)行位響應(yīng)。
MAX3420E在三線、四線或五線SPI情況下都可以工作。另外還有幾個(gè)不可省去的信號(hào):串行時(shí)鐘信號(hào)(SCLK)、從器件選擇(SS)以及雙向數(shù)據(jù)引腳的主控制器輸出從機(jī)輸入/主控制器輸入從機(jī)輸出 (MOSI/MISO)信號(hào)。本設(shè)計(jì)中用一條4位的引線把ATtiny13的一個(gè)輸入引腳同MAX3420E的INT引腳連接起來,以便節(jié)約碼字空間并使得SPI總線通信量最小。
圖1 音量控制器的電路原理圖
3 HID基礎(chǔ)
USB HID規(guī)范的主要思想是要定義一個(gè)可以和應(yīng)用程序聯(lián)合應(yīng)用的傳感器、按鈕和LED的廣泛的類型范圍?!癠SB器件使用者論壇”的“通用串行總線HID用法表”中詳述了數(shù)百種用法。HID協(xié)議是雙方面的協(xié)議,HID器件和Windows應(yīng)用都必須同意使用HID規(guī)范中的特定碼符。HID文件是概念性的但卻有相當(dāng)復(fù)雜的說明。
HID外部設(shè)備通過發(fā)送報(bào)告與Windows進(jìn)行通信。HID設(shè)計(jì)的主要任務(wù)是要?jiǎng)?chuàng)造出一種可以傳達(dá)對(duì)操作系統(tǒng)控制意圖的報(bào)告格式。對(duì)于此項(xiàng)設(shè)計(jì),需要對(duì)以下幾項(xiàng)進(jìn)行控制:音量加、音量減、暫停、播放、下一曲目和上一曲目。這幾項(xiàng)中的每一項(xiàng)在HID用法表中都有一個(gè)描述項(xiàng)。
下面的程序是HID報(bào)告描述符。它是用從網(wǎng)站www.USB.org.上得到的HID工具程序構(gòu)建的。
.DB 0x05,0x0C
;使用頁(yè)面(用戶).DB 0x09,0x01
;遠(yuǎn)程控制.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;檢測(cè)下一次
.DB 0x09,0xB6;檢測(cè)前一次
.DB 0x75,0x01;描述符報(bào)告大小
.DB 0x95,0x06;描述符報(bào)告數(shù)量
.DB 0x81,0x02;輸入描述符報(bào)告
.DB 0x75,0x01;描述符報(bào)告大小
.DB 0x95,0x02;描述符報(bào)告數(shù)量
.DB 0x81,0x01.DB 0xC0
當(dāng)主機(jī)發(fā)出“獲取描述符報(bào)告”要求時(shí),ATtiny13將該表返回給主機(jī)。報(bào)告描述符的格式是單字節(jié)報(bào)告,以使用(VOL+)行開頭的描述符將二進(jìn)制數(shù)據(jù)集合到一個(gè)以LSB開頭的字節(jié)內(nèi)??刂祈?xiàng)只需要6
位,所以該字節(jié)內(nèi)的最后兩位被賦予0值。描述符報(bào)告格式如下:
當(dāng)Windows識(shí)別并進(jìn)行USB枚舉后,為了得到上述格式的單字節(jié)響應(yīng),操作系統(tǒng)開始向終端3IN發(fā)送周期性IN請(qǐng)求。該部件監(jiān)控旋轉(zhuǎn)控制的變化情況,并且當(dāng)有動(dòng)作(如音量增加)請(qǐng)求時(shí)發(fā)送通信數(shù)據(jù);沒有動(dòng)作請(qǐng)求時(shí),該固件返回0值。
MAX3420E簡(jiǎn)化了USB修改過程,SPI主控器(即ATtiny13)將報(bào)告數(shù)據(jù)字節(jié)寫入EP3INFIFO(endpoint 3 IN FIFO)的寄存器。然后SPI主控器將數(shù)值1寫入EP3INBC(endpoint3IN byte count)寄存器,表示為了響應(yīng)USB的下一個(gè)IN請(qǐng)求,將會(huì)傳送1個(gè)字節(jié)。傳送發(fā)生后,MAX3420E產(chǎn)生中斷請(qǐng)求,表明下一個(gè)字節(jié)的數(shù)據(jù)可以寫入EP3INFIFO了。
下面是完整的傳送程序。可以將音量控制器的HID信息傳送給PC機(jī)。看似非常簡(jiǎn)單,但是該編碼卻包含了很多的HID控制頁(yè)面。剩余的代碼實(shí)現(xiàn)代碼循環(huán)。該循環(huán)會(huì)檢測(cè)旋轉(zhuǎn)控制器,然后點(diǎn)亮發(fā)光二極管。對(duì)任意USB外圍器件來說,USB樣板文件代碼需要進(jìn)行內(nèi)部處理。這個(gè)樣板文件代碼控制著器件的枚舉、懸掛、恢復(fù)以及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 讀取旋轉(zhuǎn)控制
旋轉(zhuǎn)編碼器用格雷編碼端子A和B分別表示順時(shí)針和逆時(shí)針旋轉(zhuǎn)。旋轉(zhuǎn)控制器與MAX3420E上有內(nèi)置上拉電阻的GPIN引腳相連。圖2顯示的是左旋和右旋時(shí)的開關(guān)轉(zhuǎn)接狀態(tài)。鎖定位置狀態(tài)1和3是控制停止位置。控制器經(jīng)過1個(gè)或3個(gè)狀態(tài)后,可到下一個(gè)鎖定位置。該固件只需對(duì)旋鈕旋轉(zhuǎn)進(jìn)行譯碼,就可以實(shí)現(xiàn)向鎖定狀態(tài)1和3的轉(zhuǎn)換。例如,實(shí)現(xiàn)右旋狀態(tài)轉(zhuǎn)換需要由3到1或由2到3。
圖2 旋轉(zhuǎn)編碼器的開關(guān)連接狀態(tài)
5 完善代碼
ATtiny13有512字長(zhǎng)的程序存儲(chǔ)空間。編碼需要完成以下幾項(xiàng)工作: 首先要對(duì)設(shè)備進(jìn)行枚舉。這一步包括對(duì)MAX3420主控制器的各種類型的“獲取描述符”請(qǐng)求進(jìn)行解碼,對(duì)對(duì)應(yīng)的表數(shù)據(jù)進(jìn)行定位以及對(duì)終端零值FIFO進(jìn)行數(shù)據(jù)寫入,以將其傳送至固件。
編碼時(shí)也應(yīng)該為隨時(shí)發(fā)生的USB總線置0以及USB總線的懸掛和恢復(fù)進(jìn)行測(cè)試。必須對(duì)旋轉(zhuǎn)控制位置和按鈕開關(guān)狀態(tài)進(jìn)行周期性讀取和譯碼。當(dāng)主機(jī)接受了由EP3IN傳來的用于發(fā)送HID控制數(shù)據(jù)的信息包后,該代碼還必須為下一次的IN傳送進(jìn)行終端的數(shù)據(jù)加載,并為下一次的數(shù)據(jù)傳輸表明控制端點(diǎn)。
為了減小代碼量,設(shè)計(jì)過程中采用下面的方法: 第一,省去了可選擇性USB串描述符。這些描述符是描述諸如供應(yīng)商、器件類型等的文本串。這些字符串只是信息性質(zhì)的,對(duì)USB外圍器件的操作來說,沒有任何價(jià)值。第二,沒有使用可選擇性USB遙控喚醒部分。這個(gè)部分實(shí)現(xiàn)起來并不困難(MAX3420E會(huì)承擔(dān)這項(xiàng)工作的絕大部分),但是卻會(huì)占用碼字空間。第三,沒有把HID報(bào)告的描述符寫入程序閃存器,而是寫入EEPROM。ATtiny13有64字節(jié)的EEPROM,可以寫入該EEPROM的任意表數(shù)據(jù),都會(huì)保存在程序閃存器中。
6 寫入代碼
如果只用圖符方式進(jìn)行此項(xiàng)設(shè)計(jì),那么可以用6引腳的J2連接AVRISP2在線程序設(shè)計(jì)器來下載這些程序模塊。如果想要研究或修改該代碼,也可以把ATJTAGICE2ND(用于AVR系列的完全在線仿真器)連接到J2上。不管使用哪種下載方式,都不要忘記把HEX文件(閃存器代碼)和EEP模塊(EEPROM數(shù)據(jù))都寫進(jìn)去。
7 總結(jié)[2]
現(xiàn)在的電子應(yīng)用中,USB接口幾乎已經(jīng)取代了串行接口成為PC機(jī)上接口連接的首選。本設(shè)計(jì)表明:雖然USB比串行端口更為復(fù)雜,但是USB連接卻并不需要更多的代碼或者昂貴的微處理器。代碼的絕大部分是USB樣板文件,因此可以在多項(xiàng)設(shè)計(jì)中重復(fù)使用它。另外,USB有巨大的優(yōu)勢(shì):從電纜中獲取電源,自動(dòng)的“握手”和錯(cuò)誤檢測(cè)以及可以進(jìn)行熱插拔。如果想要保留已有的MCU和工具,可以采用諸如MAX3420E那樣的基于SPI的USB控制器來搭建USB外圍電路。
參考文獻(xiàn)
[1] Maxim公司.MAX3420 datasheet,2005-09-26.
[2] 張弘.USB接口設(shè)計(jì)[M].西安:西安電子科技大學(xué)出版社,2002.
[3] 盧珞.羅婷. 基于SPI的USB控制器接口設(shè)計(jì)[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2006(12): 41-45.