基于LUFA开源框架库对AVR芯片进行USB终端设备开发
内SRAM,1KB的片内EEPROM,2个带预分频的8位定时/计数器,2个带预分频的16位定时/计数器,带看门狗定时器等,还支持ISP和IAP编程,带有符合IEEE 1149.1标准的JTAG接口。其USB接口,可工作在全速/低速设备模式下。对于控制传输方式,端点0最大能支持64b的数据包。对于块传输、中断传输和同步传输方式,有6个可编程端点,最大能支持256b的数据包。
在启动阶段,可以通过对熔丝位HWBE(上划线)置0,并下拉HWB(上划线)引脚,使得系统先进入引导区程序,以方便固件更新。启动流程部分,请参考图2。
● bootloader开发示例
对于AVR微处理器来说,出厂的时候都预先烧录了Atmel DFU (Device Firmware Update)进bootloader区。如果不需要进行bootloader区编程,可以省却外部编程器。当需要更新固件程序时,无需外部编程器的参与,只需使系统运行在bootloader环境下,就可以利用USART、SPI或者USB接口,进行固件更新烧录。
在LUFA开源框架库中,有好几种不同的bootloader示例。如支持AVR109协议的自编程框架,支持USB DFU协议的自编程框架,或者其他。在开发过程中,作为开发者,只要能理解其相关原理,即可灵活运用。
从示例中可以看出,整个软件的工作流程如图3所示。在启动过程中,系统先调用初始化程序对相关的I/O口进行输入/输出定义及参数初始化;接着,进入bootloader循环。在bootloader循环中,系统不断的检测USB接口下的Endpoint,读取数据,返回指令信息等。直到收到结束通信的指令(AVR109和DFU协议均有相关指令),才退出bootloader应用。最后断开这次USB连接,程序指针跳转到0x0000位置,也就是应用程序的开始点。如图3。
从示例可以看出,在LUFA框架下,bootloader的开发有了极大的效率提升。开发者可以通过简单地修改USB设备的描述页信息,添加或修改相关的传输协议,即可快速开发出符合需求的bootloader模块。
● 设备开发示例说明
对于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_CreateHIDRepor
LUFA AVR USB MCU 单片机 201409 相关文章:
- Flash损耗均衡的嵌入式文件系统设计(06-01)
- 锁相环控制及初始化简析(08-27)
- 基于AVR单片机的ISP1362OTG设计(09-06)
- 基于AVR单片机的串口转FSK的通信模块设计(01-23)
- 案例分析:基于AVR32的隧道环境监测系统(03-18)
- 科技帮我们远离灾难:灾难检测飞行器(03-18)