基于LUFA開源框架庫(kù)對(duì)AVR芯片進(jìn)行USB終端設(shè)備開發(fā)
從示例可以看出,在LUFA框架下,bootloader的開發(fā)有了極大的效率提升。開發(fā)者可以通過(guò)簡(jiǎn)單地修改USB設(shè)備的描述頁(yè)信息,添加或修改相關(guān)的傳輸協(xié)議,即可快速開發(fā)出符合需求的bootloader模塊。
本文引用地址:http://2s4d.com/article/262220.htm● 設(shè)備開發(fā)示例說(shuō)明
對(duì)于USB設(shè)備來(lái)說(shuō),首先進(jìn)行USB枚舉設(shè)定(setup過(guò)程),然后如果沒(méi)錯(cuò)誤,就可以開始USB設(shè)備的正常工作狀態(tài)了。既然LUFA已經(jīng)為開發(fā)者做出了眾多可能的基本設(shè)置,開發(fā)者只需要知道個(gè)大概流程,大多數(shù)事情都可以留給LUFA來(lái)做了。
首先,是0號(hào)端點(diǎn)(Endpoint 0)和控制傳輸模式。0號(hào)端點(diǎn)主要用于USB設(shè)備枚舉。在枚舉過(guò)程中,主機(jī)給設(shè)備分配相應(yīng)的地址信息,同時(shí)也在讀取設(shè)備信息,如設(shè)備類型。主機(jī)通過(guò)發(fā)送相應(yīng)的控制指令給設(shè)備,設(shè)備回復(fù)相關(guān)信息給主機(jī),完成握手通信,最后完成相關(guān)的設(shè)置。LUFA基本上能全自動(dòng)地完成所有的相關(guān)工作,開發(fā)者只需要知道該怎么設(shè)置而已。如圖4。
接下來(lái),是數(shù)據(jù)傳輸過(guò)程。當(dāng)設(shè)定過(guò)程完成之后,數(shù)據(jù)傳輸過(guò)程的方向、可用端點(diǎn)的大小等基本信息已經(jīng)確定下來(lái)了。這個(gè)時(shí)候,設(shè)備和主機(jī)之間就能進(jìn)行正常的數(shù)據(jù)傳輸了。LUFA提供了多種不同的方式來(lái)接收數(shù)據(jù)包。通常來(lái)說(shuō),設(shè)備端點(diǎn)收到數(shù)據(jù)之后,會(huì)向主機(jī)返回“ACK”指令,以告知數(shù)據(jù)包已收到,但是最終的一個(gè)“ACK”指令包則不會(huì)自動(dòng)回復(fù),需要用戶在程序里面實(shí)現(xiàn)。不過(guò),對(duì)于開發(fā)者來(lái)說(shuō),只需要認(rèn)真研讀一下示例文件就可以理解,并得知實(shí)現(xiàn)方式。
以Demo/Device/ClassDriver/Keyboard/這個(gè)項(xiàng)目為例。文件Descriptors.c里面,記錄了USB設(shè)備的描述值,包括傳輸過(guò)程中的設(shè)備描述值,和枚舉階段的配置描述值,還有返回設(shè)備描述值調(diào)用的一個(gè)函數(shù)。這些相應(yīng)參數(shù),可在工程實(shí)踐中,按需修改。文件Keyboard.c里面,包含了程序的主入口main()函數(shù)。
main()函數(shù)中,SetupHardware()實(shí)現(xiàn)了基本的硬件初始化功能,值得注意的是USB_Init()函數(shù)。這個(gè)USB_Init()函數(shù),是LUFA框架實(shí)現(xiàn)的一個(gè)函數(shù)。在這個(gè)函數(shù)中,它實(shí)現(xiàn)了USB接口相關(guān)的寄存器及I/O的初始化功能,調(diào)用了USB_ResetInterface()函數(shù),以實(shí)現(xiàn)USB設(shè)備的相關(guān)設(shè)置。其中的一個(gè)功能是按照開發(fā)的需要,初始化USB設(shè)備,使其成為USB控制器或USB設(shè)備,在此示例中,初始化為USB設(shè)備,調(diào)用USB_Init_Device()函數(shù)。USB_Init_Device()函數(shù)又調(diào)用了一個(gè)需要自己按需實(shí)現(xiàn)的函數(shù)CALLBACK_USB_GetDescriptor(...)(在Descriptors.c文件中)。至此,完成USB設(shè)備的初始化過(guò)程。
完成USB設(shè)備的初始化過(guò)程之后,就開始了一個(gè)不斷循環(huán)的函數(shù)體。如果是想實(shí)現(xiàn)USB設(shè)備的相關(guān)功能,就把相關(guān)的功能模塊寫入這個(gè)函數(shù)體內(nèi)就可以了。以Demo/Device/ClassDriver/Keyboard/項(xiàng)目為例,這個(gè)循環(huán)體內(nèi)包括兩個(gè)函數(shù)模塊:HID_Device_USBTask(&Keyboard_HID_Interface)和USB_USBTask()。前者,調(diào)用了一個(gè)函數(shù)CALLBACK_HID_Device_CreateHIDReport(...),以記錄測(cè)試哪個(gè)按鍵被按下或松開,并記錄下來(lái)。后者,純粹地把相應(yīng)的按鍵信息按照USB協(xié)議的要求發(fā)送出去。實(shí)現(xiàn)相關(guān)的USB通信。
因此,如果此時(shí)需要完成一個(gè)矩陣鍵盤,那么只需要在CALLBACK_HID_Device_CreateHIDReport(...)之內(nèi),插入相應(yīng)的矩陣鍵盤掃描語(yǔ)句,延時(shí)消抖功能等,即可實(shí)現(xiàn)開發(fā)需求。其他的設(shè)備,如USB音頻設(shè)備,U盤,鼠標(biāo)等,也是類似的實(shí)現(xiàn)方式。
4 結(jié)語(yǔ)
對(duì)于開發(fā)者而言,LUFA開源框架庫(kù)不僅能幫助快速完成相應(yīng)的項(xiàng)目開發(fā),如果能細(xì)讀其代碼,還可以大大地提高相應(yīng)的編程水平。同時(shí),LUFA開源框架庫(kù)的引入,大大地降低了在AVR單片機(jī)上開發(fā)USB設(shè)備的門檻,極大地提高開發(fā)效率,并且減少了開發(fā)過(guò)程中的調(diào)試測(cè)試時(shí)間,增加了系統(tǒng)的穩(wěn)定性。其示例文檔豐富,入門容易,代碼優(yōu)美穩(wěn)定,邏輯架構(gòu)完美。因此,無(wú)論是出于項(xiàng)目開發(fā)的需要,還是能力提升的需要,都可以好好研究或閱讀LUFA開源代碼,借鑒其開發(fā)經(jīng)驗(yàn),做出更好更快更優(yōu)質(zhì)的工程項(xiàng)目。
參考文獻(xiàn):
[1]Atmel.ATmega32u4 Datasheet[M]
[2]Universal Serial Bus Revision 2.0 Specification[S]
[3]LUFA Online Documents[R/OL].(2014-03).http://www.fourwalledcubicle.com/files/LUFA/Doc/140302/
[4]Redecker C.USB Control Transfers with LUFA[R/OL].(2011-10).http://www.avrbeginners.net/new/wp-content/uploads/2011/10/avrbeginners_40_USB_Control_Transfers_with_LUFA_1.0.pdf
[5]USB in a Nutshell[R/OL].(2014-04).http://www.beyondlogic.org/usbnutshell
評(píng)論