AVR单片机的通用USB接口模块设计
发布时间:2008/8/8 0:00:00 访问次数:586
usb接口以其数据传输快、连接简单、易于扩展、支持热插拔等特点已成为外设与pc通信的主要方式之一。随着嵌入式系统的发展,嵌入式微处理器需增加通用的usb接口,以便实现与pc等usb主机系统的通信。针对这样的需求,这里采用philips公司的usb接口器件pdiusbd12和atmel公司的avr系列单片机atmega8设计一种通用的usb接口模块。该模块可方便为各种嵌入式微处理器增加usb接口,从而实现与usb主机系统的高速通信。
2 系统硬件设计
该系统模块的控制核心是avr高速单片机atmega8。avr单片机是新一代基于哈佛结构的高速risc微控制器,具有速度快、价格低、可靠性高,i/o口线驱动能力强和片内集成外设资源丰富等特点,其内部集成有可进行isp下载编程的flash,eeprom、熔丝位和锁定位。avr单片机的isp下载电缆制作简单、成本低廉,还有免费的下载软件(例如ponyprog)支持。pdiusbd12是一款高性价比usb接口器件,完全符合usb1.l规范,易于与各种微处理器接口。
由于avr单片机具有高速性,可利用i/o端口线以软件方式模拟pdiusbd12的时序,对其读写。这种方式可根据不同的微处理器速度灵活控制pdiusbd12的时序和地址,无需译码电路,从而简化硬件设计,降低成本。
由于atmega8片内集成了uart,spi,i2c等接口,该接口模块可利用这些接口与其他系统通信,使得该接口模块成为通用的接口转换器。
3 usb固件程序设计
本系统模块的usb固件程序采用符合ansi c标准的gcc编译器设计,结合分层次的模块化结构,可移植性强,只需稍微修改硬件接口层即可将其移植到别的硬件平台,可重复利用代码。
usb固件程序设计是基于状态机和标准的前后台式程序架构。整个同件程序的模块化层次结构如图3所示。首先编写硬件接口层hal.c和pdiusbd12器件的命令接口层,以供上层模块调用。硬件接口层含有对pdiusbd12写指令和读写数据的函数,以供上层模块调用。当cpu不同时,只需修改这些函数即可。由于cpu访问pdius-bd12与普通存储器一样,只需根据硬件连接关系,在硬件抽象层中编写对pdiusbd12写指令、写读数据的函数,供上层调用即可。实现pdiusbd12的命令接口层需调用硬件抽象层函数,供上层模块调用。再设计前后台程序及标准设备请求程序模块。
先利用c语言的共用体与位域定义一个全局状态变量如下所示:
用户可根据需要增加相应的状态标志位,如uart,spi,i2c等接口收发数据完成标志来满足各种情况下的需要,然后定义一个结构体变量用于存放usb的标准设备请求。
在前台主程序中首先初始化全局变量和其他外围设备,然后在while(1)的死循环中检测状态变量值有无变化,根据不同的状态变量值调用下层的相应函数完成相关操作。在后台的中断服务程序中,根据读取的中断寄存器值一方面将pdiusbd12接收到的数据移入cpu内存或将内存中的数据写入pdiusbd12发送端点的缓冲区;另一方面根据具体情况改变状态变量值。
以下给出了前台主程序的程序代码:以下为后台中断服务程序:
当前台主程序检测到状态变量收到setup包事件bevent_flags.bits.setup_packet为1时,该标志位清零,再调用标准设备请求模块stdreq.c的control_handler()函数完成对usb设备的枚举。
设计标准设备请求模块,首先利用结构体定义usb枚举所需的各种描述符,以供不同设备请求使用,其次编写11个标准的设备请求处理函数。本层请求模块重要函数是协议控制子程序control han-dler(),它根据controldata中标识的不同usb设备请求类型调用11个函数中的任意一个。除此之外,本层请示求模块还实现中断服务程序调用的控制端点接收与发送中断处理函数。
4 系统集成与应用
4.1 pc机驱动程序与应用程序的设计
利用该系统模块实现pc机通讯,需对pc机编写相关驱动程序和应用程序,可利用driverstudio软件生成该系统模块在windows环境下的驱动程序。应用程序的设计可使用诸如vb、vc、delphi以及应用普遍的虚拟仪器软件开发工具labview等软件开发工具,直接调用驱动程序生成的动态链接库中的api函数,可根据
usb接口以其数据传输快、连接简单、易于扩展、支持热插拔等特点已成为外设与pc通信的主要方式之一。随着嵌入式系统的发展,嵌入式微处理器需增加通用的usb接口,以便实现与pc等usb主机系统的通信。针对这样的需求,这里采用philips公司的usb接口器件pdiusbd12和atmel公司的avr系列单片机atmega8设计一种通用的usb接口模块。该模块可方便为各种嵌入式微处理器增加usb接口,从而实现与usb主机系统的高速通信。
2 系统硬件设计
该系统模块的控制核心是avr高速单片机atmega8。avr单片机是新一代基于哈佛结构的高速risc微控制器,具有速度快、价格低、可靠性高,i/o口线驱动能力强和片内集成外设资源丰富等特点,其内部集成有可进行isp下载编程的flash,eeprom、熔丝位和锁定位。avr单片机的isp下载电缆制作简单、成本低廉,还有免费的下载软件(例如ponyprog)支持。pdiusbd12是一款高性价比usb接口器件,完全符合usb1.l规范,易于与各种微处理器接口。
由于avr单片机具有高速性,可利用i/o端口线以软件方式模拟pdiusbd12的时序,对其读写。这种方式可根据不同的微处理器速度灵活控制pdiusbd12的时序和地址,无需译码电路,从而简化硬件设计,降低成本。
由于atmega8片内集成了uart,spi,i2c等接口,该接口模块可利用这些接口与其他系统通信,使得该接口模块成为通用的接口转换器。
3 usb固件程序设计
本系统模块的usb固件程序采用符合ansi c标准的gcc编译器设计,结合分层次的模块化结构,可移植性强,只需稍微修改硬件接口层即可将其移植到别的硬件平台,可重复利用代码。
usb固件程序设计是基于状态机和标准的前后台式程序架构。整个同件程序的模块化层次结构如图3所示。首先编写硬件接口层hal.c和pdiusbd12器件的命令接口层,以供上层模块调用。硬件接口层含有对pdiusbd12写指令和读写数据的函数,以供上层模块调用。当cpu不同时,只需修改这些函数即可。由于cpu访问pdius-bd12与普通存储器一样,只需根据硬件连接关系,在硬件抽象层中编写对pdiusbd12写指令、写读数据的函数,供上层调用即可。实现pdiusbd12的命令接口层需调用硬件抽象层函数,供上层模块调用。再设计前后台程序及标准设备请求程序模块。
先利用c语言的共用体与位域定义一个全局状态变量如下所示:
用户可根据需要增加相应的状态标志位,如uart,spi,i2c等接口收发数据完成标志来满足各种情况下的需要,然后定义一个结构体变量用于存放usb的标准设备请求。
在前台主程序中首先初始化全局变量和其他外围设备,然后在while(1)的死循环中检测状态变量值有无变化,根据不同的状态变量值调用下层的相应函数完成相关操作。在后台的中断服务程序中,根据读取的中断寄存器值一方面将pdiusbd12接收到的数据移入cpu内存或将内存中的数据写入pdiusbd12发送端点的缓冲区;另一方面根据具体情况改变状态变量值。
以下给出了前台主程序的程序代码:以下为后台中断服务程序:
当前台主程序检测到状态变量收到setup包事件bevent_flags.bits.setup_packet为1时,该标志位清零,再调用标准设备请求模块stdreq.c的control_handler()函数完成对usb设备的枚举。
设计标准设备请求模块,首先利用结构体定义usb枚举所需的各种描述符,以供不同设备请求使用,其次编写11个标准的设备请求处理函数。本层请求模块重要函数是协议控制子程序control han-dler(),它根据controldata中标识的不同usb设备请求类型调用11个函数中的任意一个。除此之外,本层请示求模块还实现中断服务程序调用的控制端点接收与发送中断处理函数。
4 系统集成与应用
4.1 pc机驱动程序与应用程序的设计
利用该系统模块实现pc机通讯,需对pc机编写相关驱动程序和应用程序,可利用driverstudio软件生成该系统模块在windows环境下的驱动程序。应用程序的设计可使用诸如vb、vc、delphi以及应用普遍的虚拟仪器软件开发工具labview等软件开发工具,直接调用驱动程序生成的动态链接库中的api函数,可根据