基于LUFA开源框架库对AVR芯片进行USB终端设备开发
从示例可以看出,在LUFA框架下,bootloader的开发有了极大的效率提升。开发者可以通过简单地修改USB设备的描述页信息,添加或修改相关的传输协议,即可快速开发出符合需求的bootloader模块。
本文引用地址:https://www.eepw.com.cn/article/262220.htm● 设备开发示例说明
对于USB设备来说,首先进行USB枚举设定(setup过程),然后如果没错误,就可以开始USB设备的正常工作状态了。既然LUFA已经为开发者做出了众多可能的基本设置,开发者只需要知道个大概流程,大多数事情都可以留给LUFA来做了。
首先,是0号端点(Endpoint 0)和控制传输模式。0号端点主要用于USB设备枚举。在枚举过程中,主机给设备分配相应的地址信息,同时也在读取设备信息,如设备类型。主机通过发送相应的控制指令给设备,设备回复相关信息给主机,完成握手通信,最后完成相关的设置。LUFA基本上能全自动地完成所有的相关工作,开发者只需要知道该怎么设置而已。如图4。
接下来,是数据传输过程。当设定过程完成之后,数据传输过程的方向、可用端点的大小等基本信息已经确定下来了。这个时候,设备和主机之间就能进行正常的数据传输了。LUFA提供了多种不同的方式来接收数据包。通常来说,设备端点收到数据之后,会向主机返回“ACK”指令,以告知数据包已收到,但是最终的一个“ACK”指令包则不会自动回复,需要用户在程序里面实现。不过,对于开发者来说,只需要认真研读一下示例文件就可以理解,并得知实现方式。
以Demo/Device/ClassDriver/Keyboard/这个项目为例。文件Descriptors.c里面,记录了USB设备的描述值,包括传输过程中的设备描述值,和枚举阶段的配置描述值,还有返回设备描述值调用的一个函数。这些相应参数,可在工程实践中,按需修改。文件Keyboard.c里面,包含了程序的主入口main()函数。
main()函数中,SetupHardware()实现了基本的硬件初始化功能,值得注意的是USB_Init()函数。这个USB_Init()函数,是LUFA框架实现的一个函数。在这个函数中,它实现了USB接口相关的寄存器及I/O的初始化功能,调用了USB_ResetInterface()函数,以实现USB设备的相关设置。其中的一个功能是按照开发的需要,初始化USB设备,使其成为USB控制器或USB设备,在此示例中,初始化为USB设备,调用USB_Init_Device()函数。USB_Init_Device()函数又调用了一个需要自己按需实现的函数CALLBACK_USB_GetDescriptor(...)(在Descriptors.c文件中)。至此,完成USB设备的初始化过程。
完成USB设备的初始化过程之后,就开始了一个不断循环的函数体。如果是想实现USB设备的相关功能,就把相关的功能模块写入这个函数体内就可以了。以Demo/Device/ClassDriver/Keyboard/项目为例,这个循环体内包括两个函数模块:HID_Device_USBTask(&Keyboard_HID_Interface)和USB_USBTask()。前者,调用了一个函数CALLBACK_HID_Device_CreateHIDReport(...),以记录测试哪个按键被按下或松开,并记录下来。后者,纯粹地把相应的按键信息按照USB协议的要求发送出去。实现相关的USB通信。
因此,如果此时需要完成一个矩阵键盘,那么只需要在CALLBACK_HID_Device_CreateHIDReport(...)之内,插入相应的矩阵键盘扫描语句,延时消抖功能等,即可实现开发需求。其他的设备,如USB音频设备,U盘,鼠标等,也是类似的实现方式。
4 结语
对于开发者而言,LUFA开源框架库不仅能帮助快速完成相应的项目开发,如果能细读其代码,还可以大大地提高相应的编程水平。同时,LUFA开源框架库的引入,大大地降低了在AVR单片机上开发USB设备的门槛,极大地提高开发效率,并且减少了开发过程中的调试测试时间,增加了系统的稳定性。其示例文档丰富,入门容易,代码优美稳定,逻辑架构完美。因此,无论是出于项目开发的需要,还是能力提升的需要,都可以好好研究或阅读LUFA开源代码,借鉴其开发经验,做出更好更快更优质的工程项目。
参考文献:
[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
评论