最新单片机USB接口驱动和应用程序的开发
- 格式:doc
- 大小:996.50 KB
- 文档页数:64
一、USB的“JoyStickMouse”例程结构分析1、例程的结构(1)底层结构包括5个文件:usb_core.c(USB总线数据处理的核心文件),usb_init.c,usb_int.c(用于端点数据输入输入中断处理),usb_mem.c(用于缓冲区操作),usb_regs.c(用于寄存器操作)。
它们都包含了头文件“usb_lib.h”。
在这个头文件中,又有以下定义:#include "usb_type.h"#include "usb_regs.h"#include "usb_def.h"#include "usb_core.h"#include "usb_init.h"#include "usb_mem.h"#include "usb_int.h"usb_lib.h中又包含了七个头文件,其中usb_type.h中主要是用typedef为stm32支持的数据类型取一些新的名称。
usb_def.h中主要是定义一些相关的数据类型。
还有一个未包含在usb_lib.h中的头文件,usb_conf.h用于USB设备的配置。
(2)上层结构上层结构总共5个文件:hw_config.c(用于USB硬件配置)、usb_pwr.c(用于USB连接、断开操作)、usb_istr.c(直接处理USB中断)、usb_prop.c(用于上层协议处理,比如HID协议,大容量存储设备协议)、usb_desc.c(具体设备的相关描述符定义和处理)。
可见,ST的USB操作库结构十分清晰明了,我先不准备直接阅读源代码。
而是先利用MDK的软件模拟器仿真执行,先了解一下设备初始化的流程。
2、设备初始化所做的工作(1)Set_System(void)这个是main函数中首先调用的函数,它位于hw_config.c文件中。
USB接口在单片机通信中的设计应用[摘要]51系列芯片的串口通信速率较低,会在其串口通信中形成一个速度瓶颈。
通用串行总线(USB)作为一种新的微机总线接口规范,具有便捷、易扩展、低成本、低干扰等特点,非常适合作为主机和外设之间的通信接口。
本文介绍了一种比较简单方便设计USB设备的方法,设计采用51单片机和USB接口芯片组成的单片机最小系统来实现一个完整的USB设备,大大提高了通信速率。
在设计中,采用的控制器是51单片机AT89S52,USB电气接口则是PHILIPS公司的USB接口芯片PDIUSBD12。
单片机控制器作为下位机,通过USB电气接口芯片和USB总线与PC机交换数据,并实现USB设备的逻辑功能。
系统开发的最终硬件成果是一个带有USB接口的设备,通过USB电缆与PC机相连接,能够实现主机对设备的列举,以及和PC机交换数据,并实现其扩展功能。
[关键词] USB;单片机系统;PDIUSBD12;AT89S52;接口技术USB interface in the design of communication[Abstract]The communication rate of the series 51 chip is lower and it forms a tare bottle neck in serial communication. This paper introduced a simple and convenient method to design a USB apparatus, that is to say, to realize an intact USB apparatus with a minimum system of single-chip computer that made of 51 single-chip computer and USB interface, the circuit greatly improves communication rate. In this system, I adopted 51 one-chip computers AT89S52 as its controller, the chip PDIUSBD12 of PHILIPS Company as its electric interface. The one-chip computer as the next machine, exchanges the data with the PC, through the USB bus and USB electric interface chip, and it realizes the logic function of USB apparatus. It can exchange data with PC, and realize its expanding function, through connecting with PC.[Key words]single-chip computer system;interface technology;PDIUSBD12;AT89S52;USB目录0 引言 ------------------------------------------------------------------ 1 0.1 选题现状、研究意义以及发展趋势 ----------------------------------- 10.2 系统实现功能 ----------------------------------------------------- 21 USB技术--------------------------------------------------------------- 4 1.1 USB总线概述------------------------------------------------------ 4 1.1.1 USB总线简介-------------------------------------------------- 4 1.2.2 USB总线的优点------------------------------------------------ 4 1.2 USB协议简介------------------------------------------------------ 5 1.2.1 USB物理体系结构---------------------------------------------- 5 1.2.2 USB设备逻辑结构---------------------------------------------- 6 1.2.3 USB传输类型-------------------------------------------------- 8 1.2.4 USB低层通信协议---------------------------------------------- 81.3 USB接口技术----------------------------------------------------- 102 系统硬件电路设计 ----------------------------------------------------- 11 2.1 设备电路系统概述 ------------------------------------------------ 11 2.2 51系列单片机最小系统-------------------------------------------- 11 2.2.1 AT89S52单片机的介绍和选用----------------------------------- 11 2.2.2 AT89S52与PDIUSBD12构建的最小系统--------------------------- 15 2.2.3 AT89S52和外围器件------------------------------------------- 16 2.3 PDIUSBD12外围电路及其与单片机的连接设计------------------------- 17 2.3.1 PDIUSBD12介绍----------------------------------------------- 17 2.3.2 USB外围电路及其与单片机连接--------------------------------- 21 2.4 扩展功能电路的设计 ---------------------------------------------- 22 2.4.1 PS/2串行接口的扩展设计-------------------------------------- 23 2.4.2 Flash存储器的扩展设计--------------------------------------- 23 2.4.3 LPT并行接口的扩展设计--------------------------------------- 253 系统软件设计 --------------------------------------------------------- 27 3.1 固件程序的设计与实现 -------------------------------------------- 27 3.1.1 描述符 ------------------------------------------------------ 27 3.1.2 固件程序的结构 ---------------------------------------------- 29 3.2 驱动程序的设计与实现 -------------------------------------------- 32 3.2.1 驱动程序概述 ------------------------------------------------ 32 3.2.2 WDM设备驱动程序结构----------------------------------------- 33 3.2.3 驱动程序开发的工具软件 -------------------------------------- 33 3.2.4 用Win Driver开发驱动程序 ----------------------------------- 34 3.3 系统应用程序开发 ------------------------------------------------ 35 3.3.1 应用程序的实现的功能 ---------------------------------------- 353.3.2 利用Win Driver实现应用程序 --------------------------------- 354 系统调试 ------------------------------------------------------------- 37 4.1 系统硬件测试 ---------------------------------------------------- 37 4.2 系统软件调试及系统测试 ------------------------------------------ 37 结论 -------------------------------------------------------------------- 39 致谢语 ------------------------------------------------------------------ 40 参考文献 ---------------------------------------------------------------- 41 附录一:原理图 ---------------------------------------------------------- 42 附录二:程序 ------------------------------------------------------------ 43 附录三:英文原文 -------------------------------------------------------- 53 附录四:英文译文 -------------------------------------------------------- 630 引言0.1 选题现状、研究意义以及发展趋势USB(Universal Serial Bus)即通用串行总线,是现在非常流行的一种快速、双向、廉价、可以进行热插拔的接口,在现在的每一台PC机上都可以找到一对USB接口。
单片机应用系统开发利用串口驱动数码管显示设计实现该设计的关键是使用串口通信协议进行数据传输,并通过单片机控制数码管的显示。
以下是一个示例设计过程:1. 硬件设计:选择合适的单片机开发板,如STC89C52RC或ATmega328P等。
将数码管与单片机相连,通过使能引脚和数据引脚实现控制。
同时连接串口引脚,将其连接到单片机的串口通信接口。
2. 软件开发:选择合适的集成开发环境(IDE),如Keil或Arduino,进行编程开发。
通过串口通信协议进行数据传输和接收,并控制数码管的显示。
3.串口通信协议:在单片机和外部设备之间建立通信协议是实现数据传输的关键。
可以使用标准的串口通信协议,如UART(通用异步收发器)协议。
根据需要,可以自定义协议,定义数据帧的格式和通信规则。
4.数据显示控制:通过串口接收到的数据来控制数码管的显示。
将接收到的数据解析,根据不同的数据值,设置数码管的段码来实现不同的显示效果。
控制数码管的驱动方式通常使用共阴极或共阳极驱动方式,并通过适当的电平控制进行刷新。
5.软件调试:在编程完成后,进行系统调试。
通过串口终端工具或上位机软件发送不同的数据进行测试,观察数码管的显示效果。
根据需要,可以添加一些辅助功能,如亮度调节、显示模式切换等。
6.系统优化:完成基本功能后,对系统进行一些性能优化和功能扩展。
优化可以包括提高数据传输速率、增加数据校验系统、加强错误处理等。
功能扩展可以加入更多的外设控制,如LED灯、按键等,增加系统的灵活性和功能性。
总之,单片机应用系统开发利用串口驱动数码管显示是一种常见的嵌入式系统开发应用。
通过串口通信协议进行数据传输,控制数码管的显示,可以实现丰富的显示效果和交互功能。
这种设计适用于各种场景,具有广泛的应用前景。
[摘要]本文研究并设计了基于单片机的USB转并口设备,并利用该模块研究了USB 设备驱动程序的设计方法。
[关键词]USB ECP Driver Studio 设备驱动程序[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0029-021 引言由于现在大多数计算机没有并行口而具有多个USB接口,因此很多并行口设备无法和计算机直接连接使用。
利用基于单片机STC11F32XE的USB 转 ECP 模式并行口可以连接其他ECP 模式并口设备,以达到让具有ECP接口的设备可以和没有并口的PC进行数据通信的目的。
并口采用的是IEEE 1284-A接口, USB 接口驱动芯片采用Philips 半导体公司的PDIUSBD12,该芯片的数据端口D0-D7接单片机的P0 口,引脚WR_N、RD_N、及A0 分别接单片机的P6、P7、P5 引脚。
整个硬件电路图如图 1 所示。
当 USB 设备硬件设计完成之后,接着就必须根据硬件特点和需要完成的功能,设计出合乎产品的USB驱动程序,否则,设备将无法被PC机识别,不能正常使用。
2 WDM型的USB驱动程序结构USB设备的驱动程序是一种典型的WDM驱动程序。
WDM驱动程序是分层的。
对于USB设备驱动程序来说,其驱动程序包括两个层次:设备(功能)驱动程序层和总线(底层)驱动程序层。
USB底层驱动程序由操作系统提供,不要开发者自己编写,它位于USB功能驱动程序的下面,负责与实际的USB硬件打交道,实现复杂而繁琐的底层通信;USB功能驱动程序必须要由开发者编写,它不与实际的USB硬件打交道,是把包含URB(USB Request Block,USB 请求块)的IRP 发送到USB底层驱动程序,来实现对USB设备信息的发送和接收。
(图2) 给出了USB 驱动程序的结构模型。
3 USB驱动开发编程环境的建立开发一个WMD 驱动程序,必须要搭建合适的开发环境以此来减小开发难度。
嵌入式系统中USB接口固件编程和驱动开发的研究与实现的开题报告一、选题背景随着计算机应用领域的不断扩大,嵌入式系统的使用越来越广泛。
嵌入式系统具有体积小、功耗低、价格合理、可靠性高等优点,因此嵌入式系统在各种电子产品和智能设备中得到广泛应用,如手机、数码相机、智能家居、车载导航等。
随着嵌入式系统中外围设备的不断增多,USB接口作为一种常见的外围设备接口,在嵌入式系统中得到广泛应用。
因此,在嵌入式系统中进行USB接口的固件编程和驱动开发,对于实现各种USB设备的接入和使用非常重要。
同时,由于嵌入式系统的特殊性,与传统的PC机不同,因此在USB接口的固件编程和驱动开发中也存在着一些特殊的问题和挑战。
二、研究目的和意义本研究旨在探讨嵌入式系统中USB接口的固件编程和驱动开发的问题并尝试解决这些问题,以实现嵌入式系统中各种USB设备的接入和使用。
具体目的如下:1. 研究嵌入式系统中USB接口的固件编程方法和原理,分析其特点和优缺点。
2. 探讨嵌入式系统中USB驱动的开发方法和原理,分析其特点和优缺点。
3. 研究和实现在嵌入式系统中使用USB接口进行数据传输的方法和技术。
4. 通过实践掌握嵌入式系统中USB接口的固件编程和驱动开发技术,实现简单的USB设备接入和使用。
5. 探讨和解决在USB接口的固件编程和驱动开发中可能遇到的问题和挑战,提高嵌入式系统中USB接口的使用效率和可靠性。
三、研究内容和方法本研究主要包括以下内容:1. 嵌入式系统中USB接口的固件编程方法和原理的研究。
主要研究USB接口的工作原理、通信协议、数据传输方式和接口规范等内容,分析USB接口的固件编程特点和技术要求。
2. 嵌入式系统中USB驱动的开发方法和原理的研究。
主要研究USB 驱动程序的框架结构、通信方式、设备接口和底层驱动开发等内容,分析USB驱动程序的特点和技术要求。
3. 在嵌入式系统中使用USB接口进行数据传输的方法和技术的研究和实现。
实验一:单片机调试软件安装和ISP下载软件的安装与下载实验内容与要求:1、学会USB取电线和串行口USB-232 ISP线的物理连接。
2、USB转232串口(H340驱动)USB设备驱动程序安装,STC串口下载软件STC-ISP V38A的安装。
3、学会利用STC-ISP V38A下载软件将事先准备好的HEX文件烧写入STC89C52RC单片机芯片,观察实验结果。
4、撰写实验报告,并说明观察到的实验结果实验讲义:一、学会USB取电线和串行口USB-232 ISP线的物理连接1、将USB方口取电方口一头连接入实验班方口母座,另一头接电脑USB,见下图蓝方框USB转232串口线,9芯一头接实验班RS232母座,另一头接电脑USB,见下图红色方框二、USB转232串口(H340驱动)USB设备驱动程序安装连接好以后。
会出现,下图安装提示选择从列表或指定位置安装,选择下一步会出现如下图提示选择,在搜索中包括这个位置,点击浏览,会出现浏览文件窗口,如下图点击右侧树形结构,将“+”展开,选择USB转串口线驱动文件夹下面的R340文件夹,点击确定。
下面将返回“找到新硬件向导”窗口如下图。
选择下一步。
USB转RS232驱动程序安装完成。
方口USB不需要安装驱动。
下面在桌面右键单击我的电脑,在弹出的菜单中,选择”管理”,如下图在出现的计算机管理界面中,展开左侧的目录,选择,“系统工具”下面的“设备管理器”,在右侧窗口中,展开“端口”,出现USB-SERIAL (COM5),(注意COM5只是随机的,会根据你插入USB设备的情况而改变,也有可能是COM1 COM3)双击USB-SERIAL (COM5),出现下面“USB-SERIAL (COM5)属性”窗口选侧“端口设置”,看到每秒位数为9600(注USB-SERIAL (COM5)属性只做查看用,它提供了两个信息,通信口为COM5,每秒位数为9600,这在后面下载程序的时候需要用到)三、学会利用STC-ISP V38A下载软件将事先准备好的HEX文件烧写入STC89C52RC单片机芯片在文件夹中找到,并打开“stc-isp-v3.8a非安装版”文件夹找到STC-ISP V38A,双击鼠标左键运行它。
51单片机与USB芯片PDIUSBD12接口固件程序关键词:USB固件程序此函数库可以直接使用PHILIPS的Demo驱动D12TEST以下只用了端点1进行控制传输,端点2的数据传输自己添加,没有使用DMA功能,为简单的固件程序/************************************************************* *************PHILIPS PDIUSBD12 FIRMWARECOPYRIGHT (c) 2005 BY JJJ.-- ALL RIGHTS RESERVED --File Name: D12_USB.hAuthor: Jiang Jian JunCreated: 2005/4/3Modified: NORevision: 1.0************************************************************** *************/#ifndef __D12_USB_H_REVISION_FIRST__#define __D12_USB_H_REVISION_FIRST__#include <REGX51.H>sbit SUSPEND = P3^5;#define D12_INT_ENDP0OUT 0x0001 //中断寄存器位定义#define D12_INT_ENDP0IN 0x0002#define D12_INT_ENDP1OUT 0x0004#define D12_INT_ENDP1IN 0x0008#define D12_INT_ENDP2OUT 0x0010#define D12_INT_ENDP2IN 0x0020#define D12_INT_BUSRESET 0x0040#define D12_INT_SUSPENDCHANGE 0x0080#define D12_INT_EOT 0x0100#define D12_SETUPPACKET 0x20 //读最后处理状态寄存器的设置信息包0010, 0000b#define EP0_PACKET_SIZE 16 //p0最大16byte#define USB_ENDPOINT_DIRECTION_MASK 0x80 //设备请求类型,传输方向D 7 1000,0000b#define USB_REQUEST_TYPE_MASK 0x30 //bmRequest的设置#define USB_REQUEST_MASK 0x0f#define USB_STANDARD_REQUEST 0x00 //5,6位的定义#define USB_VENDOR_REQUEST 0x20#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 //描述符类型设备描述符01h,配置描述符02,接口描述符04,端点描述符05#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02#define CONFIG_DESCRIPTOR_LENGTH 0x002E //配置描述符总长度//************************************************************ **************//Port And Macros And Structure And Union Definitions#define SWAP(x) ((((x) & 0x00FF) << 8) | (((x) >> 8) & 0x00FF)) //交换高低8位#define MSB(x) (((x) >> 8) & 0x00FF) //取数据高8位#define LSB(x) ((x) & 0x00FF) //取数据低8位typedef union _Event_Flags_ //定义USB事件标志数据类型{struct _Bit_Flags_{unsigned char Timer : 1; //定时器益出事件标记unsigned char BusReset : 1; //USB总线复位标志unsigned char Suspend : 1; //USB器件挂起标志unsigned char SetupPacket : 1; //收到SETUP包标志unsigned char RemoteWakeup : 1; //远程唤醒标志unsigned char InISR : 1; //USB中断服务标志unsigned char ControlState : 2; //控制端点处理状态//0:IDEL 空闲状态//1:TRANSMIT 数据发送状态//2:RECEIVE 数据接受状态unsigned char Configuration : 1; //配置标志(0:未配置;1:已配置) unsigned char Port1RxDone : 1; //端口1收到数据标志unsigned char Port2RxDone : 1; //端口2收到数据标志unsigned char Port1TxFull : 1; //端口1输出缓冲区满标志unsigned char Port2TxFull : 1; //端口2输出缓冲区满标志unsigned char Reserve : 3; //保留,未使用}Bits;unsigned short int Value;}EVENT_FLAGS; //事件标志数据类型typedef struct _DEVICE_REQUEST_{unsigned char bmRequestType; //请求类型unsigned char bRequest; //USB请求unsigned short wValue; //USB请求值unsigned short wIndex; //USB请求索引unsigned short wLength; //记数长度}DEVICE_REQUEST;#define MAX_CONTROLDATA_SIZE 8typedef struct _control_xfer{DEVICE_REQUEST DeviceRequest; //USB请求结构体unsigned short wLength; //传输数据的总字节数unsigned short wCount; //传输字节数统计unsigned char * pData; //传输数据指针unsigned char dataBuffer[MAX_CONTROLDATA_SIZE]; //请求的数据}CONTROL_XFER;static EVENT_FLAGS EventFlags; //定义为全局变量,用于与主程序的通信static CONTROL_XFER ControlData; //保存SETUP包请求类型和请求数据unsigned char idata EndPoint1Buffer[4]; //控制端点缓存unsigned char idata EndPoint2Buffer[64];//主端点缓存//************************************************************ **************//硬件提取层,多路地址/数据总线方式读写void Outportb(unsigned int Addr, unsigned char Data){*((unsigned char xdata *) Addr) = Data;}unsigned char Inportb(unsigned int Addr){return *((unsigned char xdata *) Addr);}void USB_Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}//************************************************************ **************#define D12_DATA 0#define D12_COMMAND 1//PDIUSBD12命令接口函数void D12_SetMode(unsigned char bConfig,unsigned char bClkDiv){Outportb(D12_COMMAND,0xF3);Outportb(D12_DATA,bConfig);Outportb(D12_DATA,bClkDiv);}//设置端点void D12_SetEndpointStatus(unsigned char bEndp,unsigned char bStalled) {Outportb(D12_COMMAND,0x40+bEndp);Outportb(D12_DATA,bStalled);}//应答!!!!!void D12_AcknowledgeEndpoint(unsigned char endp){Outportb(D12_COMMAND,endp);Outportb(D12_COMMAND,0xF1);if(endp==0)Outportb(D12_COMMAND,0xF2);}//设置地址使能void D12_SetAddressEnable(unsigned char bAddress,unsigned char bEnable) {Outportb(D12_COMMAND,0xd0);if(bEnable) bAddress |= 0x80;Outportb(D12_DATA,bAddress);}//设置端点使能void D12_SetEndpointEnable(unsigned char bEnable){Outportb(D12_COMMAND,0xD8);if(bEnable)Outportb(D12_DATA,1);elseOutportb(D12_DATA,0);}//读中断寄存器unsigned short D12_ReadInterruptRegister(void){unsigned char b1;unsigned int j;Outportb(D12_COMMAND,0xF4);b1=Inportb(D12_DATA);j=Inportb(D12_DATA);j<<=8;j+=b1;return j;}//读取端点状态unsigned char D12_ReadEndpointStatus(unsigned char EndPoint){unsigned char BackValue;if(EventFlags.Bits.InISR == 0)EA = 0;Outportb(D12_COMMAND, 0x80 + EndPoint);//读取端点状态BackValue = Inportb(D12_DATA);if(EventFlags.Bits.InISR == 0)EA = 1;return BackValue;}//读端点最后处理状态unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp){Outportb(D12_COMMAND,0x40+bEndp);return Inportb(D12_DATA);}//读端口unsigned char D12_ReadEndpoint(unsigned char endp,unsigned char len,un signed char *buf){unsigned char i,j;Outportb(D12_COMMAND,endp);if((Inportb(D12_DATA)&0xff)==0)//" define D12_FULLEMPTY as 0xFF by newerreturn 0;Outportb(D12_COMMAND,0x80+endp);i=Inportb(D12_DATA);i=i&0x60;Outportb(D12_COMMAND,0xF0);j=Inportb(D12_DATA);j=Inportb(D12_DATA);if(j>len)j=len;for(i=0;i<j;i++)*(buf+i)=Inportb(D12_DATA);Outportb(D12_COMMAND,0xF2);return j;}unsigned char D12_ReadEndpoint_Int(unsigned char endp,unsigned char le n,unsigned char *buf){unsigned char i,j;Outportb(D12_COMMAND,endp);if((Inportb(D12_DATA)&0xff)==0)//" define D12_FULLEMPTY as 0xFF by newerreturn 0;Outportb(D12_COMMAND,0x80+endp);i=Inportb(D12_DATA);i=i&0x60;Outportb(D12_COMMAND,0xF0);j=Inportb(D12_DATA);j=Inportb(D12_DATA);if(j>len)j=len;for(i=0;i<j;i++)*(buf+i)=Inportb(D12_DATA);Outportb(D12_COMMAND,0xF2);return j;}unsigned char D12_WriteEndpoint(unsigned char endp,unsigned char len,un signed char * buf){unsigned char i;Outportb(D12_COMMAND,endp);Inportb(D12_DATA);Outportb(D12_COMMAND,0xF0);Outportb(D12_DATA,0);Outportb(D12_DATA,len);for(i=0;i<len;i++)Outportb(D12_DATA,*(buf+i));Outportb(D12_COMMAND,0xFA);return len;}unsigned char D12_WriteEndpoint_Int(unsigned char endp,unsigned char le n,unsigned char * buf){unsigned char i;Outportb(D12_COMMAND,endp);Inportb(D12_DATA);Outportb(D12_COMMAND,0xF0);Outportb(D12_DATA,0);Outportb(D12_DATA,len);for(i=0;i<len;i++)Outportb(D12_DATA,*(buf+i));Outportb(D12_COMMAND,0xFA);return len;}void DisconnectUSB(void){D12_SetMode(0x02,0x03);//SET TO ONE? by newer}void InitialUSBInt(void);void ConnectUSB(void){EventFlags.Value = 0x0000;InitialUSBInt();D12_SetMode(0x16,0x03);}void ReconnectUSB(void){SUSPEND = 0;DisconnectUSB();USB_Delay1ms(1000);ConnectUSB();}//************************************************************ **************//中断服务程序void InitialUSBInt(void){IT1=0; //低电平中断触发EX1=1; //允许外部中断PX1=0; //优先级低EA =1;}void EP0_Out(void){unsigned char ep_last,i;ep_last=D12_ReadLastTransactionStatus(0);//interrupt symbolif(ep_last&D12_SETUPPACKET){ //recieved SETUP packet ---by newerControlData.wLength=0;ControlData.wCount=0;if(D12_ReadEndpoint_Int(0,sizeof(ControlData.DeviceRequest),(unsigned ch ar *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST)){D12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,1);EventFlags.Bits.ControlState=0; //should define USB_IDLE first --by newerreturn;}acket=1;EventFlags.Bits.ControlState=0; //by newer}else{if(ControlData.DeviceRequest.wLength>16)//最大传16byte{EventFlags.Bits.ControlState=0; //by newerD12_SetEndpointStatus(0,1);D12_SetEndpointStatus(1,1);}else{EventFlags.Bits.ControlState=2;//by newer}}}}else if(EventFlags.Bits.ControlState==2){i=D12_ReadEndpoint_Int(0,EP0_PACKET_SIZE,ControlData.dataBuffer+Con trolData.wCount);ControlData.wCount+=i;if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength){EventFlags.Bits.SetupPacket=1;EventFlags.Bits.ControlState=0;}}elseEventFlags.Bits.ControlState=0;}void EP0_In(void){short i=ControlData.wLength-ControlData.wCount;D12_ReadLastTransactionStatus(1);if(EventFlags.Bits.ControlState!=1) return;if(i>=EP0_PACKET_SIZE){D12_WriteEndpoint_Int(1,EP0_PACKET_SIZE,ControlData.pData+ControlDat a.wCount);ControlData.wCount+=EP0_PACKET_SIZE;EventFlags.Bits.ControlState=1;return;}if(i!=0){D12_WriteEndpoint_Int(1,i,ControlData.pData+ControlData.wCount);ControlData.wCount+=i;EventFlags.Bits.ControlState=0;return;}D12_WriteEndpoint_Int(1,0,0);EventFlags.Bits.ControlState=0;}void EP1_Out(void){unsigned char Length;D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */Length = D12_ReadEndpoint_Int(2, sizeof(EndPoint1Buffer),EndPoint1Buffe r);if(Length != 0)EventFlags.Bits.Port1RxDone = 1;}void EP1_In(void){D12_ReadLastTransactionStatus(3);}void EP2_Out(void){unsigned char Length,EP2Status;D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */EP2Status = D12_ReadEndpointStatus(4);EP2Status&=0x60;Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer); if(EP2Status==0x60)Length = D12_ReadEndpoint(4,sizeof(EndPoint2Buffer),EndPoint2Buffer); if(Length != 0)EventFlags.Bits.Port2RxDone = 1;}void EP2_In(void){D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */}//************************************************************ **************//请求处理typedef struct _usb_device_descriptor{unsigned char bLength;unsigned char bDescriptorType;unsigned int bcdUSB;unsigned char bDeviceClass;unsigned char bDeviceSubClass;unsigned char bDeviceProtocol;unsigned char bMaxPacketSize0;unsigned int idVendor;unsigned int idProduct;unsigned int bcdDevice;unsigned char iManufacturer;unsigned char iProduct;unsigned char iSerialNumber;unsigned char bNumConfiguations;}USB_DEVICE_DESCRIPTOR;code USB_DEVICE_DESCRIPTOR DeviceDescr={sizeof(USB_DEVICE_DESCRIPTOR),0x01,//USB_DEVICE_DESCRIPTOR_TYPE,SWAP(0x0100),0xDC,//USB_CLASS_CODE_TEST_CLASS_DEVICE,0, 0,EP0_PACKET_SIZE,SWAP(0x0471),SWAP(0x0666),SWAP(0x0100),0, 0, 0,25};//配置描述符typedef struct _usb_configuration_descriptor{unsigned char bLength[0x2e];}USB_CONFIGURATION_DESCRIPTOR;code USB_CONFIGURATION_DESCRIPTOR ConfigDescr={0x09,0x02,0x2e,0x00,0x01,0x01,0x00,0xa0,0x32,0x09,0x04,0x00,0x00,0x04,0xdc,0xa0,0xb0,0x00,0x07,0x05,0x81,0x03,0x02,0x00,0x0a,0x07,0x05,0x01,0x03,0x02,0x00,0x0a,0x07,0x05,0x82,0x02,0x40,0x00,0x0a,0x07,0x05,0x02,0x02,0x40,0x00,0x0a};//code_tramsitvoid code_transmit(unsigned char code *pRomData,unsigned short len) {ControlData.wCount=0;if(ControlData.wLength>len)ControlData.wLength=len;ControlData.pData=pRomData;if(ControlData.wLength>=EP0_PACKET_SIZE)D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData);ControlData.wCount+=EP0_PACKET_SIZE;EA = 0;EventFlags.Bits.ControlState=1;EA = 1;}else{D12_WriteEndpoint(1,ControlData.wLength,pRomData);ControlData.wCount+=ControlData.wLength;EA = 0;EventFlags.Bits.ControlState=0;EA = 1;}}//获取描述符void get_descriptor(void){if(MSB(ControlData.DeviceRequest.wValue)==USB_DEVICE_DESCRIPTOR_T YPE){code_transmit((unsigned char code*)&DeviceDescr,sizeof(USB_DEVICE_DE SCRIPTOR));return;}if(MSB(ControlData.DeviceRequest.wValue)==USB_CONFIGURATION_DESCR IPTOR_TYPE){if(ControlData.DeviceRequest.wLength>CONFIG_DESCRIPTOR_LENGTH)ControlData.DeviceRequest.wLength=CONFIG_DESCRIPTOR_LENGTH;//标识符总大小2E byte,第二次请求时wlength=0x00ff}//这里的ConfigDescr其实应该包括其他标识符!code_transmit((unsigned char code*)&ConfigDescr,ControlData.DeviceRequ est.wLength);return;}}//single transmitvoid single_transmit(unsigned char *buf,unsigned char len){if(len<=EP0_PACKET_SIZE){D12_WriteEndpoint(1,len,buf);}}//设置地址void set_address(void){D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &0xff),1);//比如wValue是"02 00" 应该得到02single_transmit(0,0);}//设置配置void set_configuration(void){if(ControlData.DeviceRequest.wValue==0){single_transmit(0,0);EventFlags.Bits.Configuration=0;D12_SetEndpointEnable(0);}else if(ControlData.DeviceRequest.wValue==1){single_transmit(0,0);D12_SetEndpointEnable(0);D12_SetEndpointEnable(1);EventFlags.Bits.Configuration=1;}}//读取配置void get_configuration(void){unsigned char c=EventFlags.Bits.Configuration;single_transmit(&c,1);}//读取设备接口信息void get_interface(void){unsigned char txdat=0;single_transmit(&txdat,1);}static code void (*StandardDeviceRequest[])(void)= {0,0,0,0,0,set_address,get_descriptor,0,get_configuration,set_configuration,get_interface,0,0,0,0,0};static code void (*VendorDeviceRequest[])(void)={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};void ControlHandler(void){unsigned char type,req;type=ControlData.DeviceRequest.bmRequestType&USB_REQUEST_TYPE_MA SK;//0011,0000breq=ControlData.DeviceRequest.bRequest&USB_REQUEST_MASK;//0000,11 11bif(type==USB_STANDARD_REQUEST)(*StandardDeviceRequest[req])();else if(type==USB_VENDOR_REQUEST)(*VendorDeviceRequest[req])();}void USB_ISR(void) interrupt 2{unsigned int i_st;EA = 0;EventFlags.Bits.InISR=1;i_st=D12_ReadInterruptRegister();if(i_st!=0){if(i_st&D12_INT_ENDP0OUT)EP0_Out();if(i_st&D12_INT_ENDP0IN)EP0_In();if(i_st&D12_INT_ENDP1OUT)EP1_Out();if(i_st&D12_INT_ENDP1IN)EP1_In();if(i_st&D12_INT_ENDP2OUT)EP2_Out();if(i_st&D12_INT_ENDP2IN)EP2_In();}EventFlags.Bits.InISR=0;EA = 1;}//************************************************************ **************#endif//简单主程序文件,自己按需要改写#include <REGX51.H>#include "D12_USB.h"extern EVENT_FLAGS EventFlags; //事件信号extern unsigned char idata EndPoint1Buffer[4];main(){ReconnectUSB();while(1){if(EventFlags.Bits.SetupPacket){EA = 0;EventFlags.Bits.SetupPacket = 0; ControlHandler();EA = 1;}if(EventFlags.Bits.Timer){EventFlags.Bits.Timer = 0;}if(EventFlags.Bits.Port1RxDone){EventFlags.Bits.Port1RxDone = 0; }}}那么可以写5个函数:void print();void copy();void delete();void quit();void help();然后用一个函数指针数组把他们存在一起:void (*p[])() = {print, copy, delete, quit, help}; 然后根据用户入0,1,2,3,4来直接叫函数cin >> index;p[index]();。
USB接口在单片机通信中的设计应用[摘要]51系列芯片的串口通信速率较低,会在其串口通信中形成一个速度瓶颈。
通用串行总线(USB)作为一种新的微机总线接口规范,具有便捷、易扩展、低成本、低干扰等特点,非常适合作为主机和外设之间的通信接口。
本文介绍了一种比较简单方便设计USB设备的方法,设计采用51单片机和USB接口芯片组成的单片机最小系统来实现一个完整的USB设备,大大提高了通信速率。
在设计中,采用的控制器是51单片机AT89S52,USB电气接口则是PHILIPS公司的USB接口芯片PDIUSBD12。
单片机控制器作为下位机,通过USB电气接口芯片和USB总线与PC机交换数据,并实现USB设备的逻辑功能。
系统开发的最终硬件成果是一个带有USB接口的设备,通过USB电缆与PC机相连接,能够实现主机对设备的列举,以及和PC机交换数据,并实现其扩展功能。
[关键词] USB;单片机系统;PDIUSBD12;AT89S52;接口技术USB interface in the design of communication[Abstract]The communication rate of the series 51 chip is lower and it forms a tare bottle neck in serial communication. This paper introduced a simple and convenient method to design a USB apparatus, that is to say, to realize an intact USB apparatus with a minimum system of single-chip computer that made of 51 single-chip computer and USB interface, the circuit greatly improves communication rate. In this system, I adopted 51 one-chip computers AT89S52 as its controller, the chip PDIUSBD12 of PHILIPS Company as its electric interface. The one-chip computer as the next machine, exchanges the data with the PC, through the USB bus and USB electric interface chip, and it realizes the logic function of USB apparatus. It can exchange data with PC, and realize its expanding function, through connecting with PC.[Key words]single-chip computer system;interface technology;PDIUSBD12;AT89S52;USB目录0 引言 ------------------------------------------------------------------ 1 0.1 选题现状、研究意义以及发展趋势 ----------------------------------- 10.2 系统实现功能 ----------------------------------------------------- 21 USB技术--------------------------------------------------------------- 4 1.1 USB总线概述------------------------------------------------------ 4 1.1.1 USB总线简介-------------------------------------------------- 4 1.2.2 USB总线的优点------------------------------------------------ 4 1.2 USB协议简介------------------------------------------------------ 5 1.2.1 USB物理体系结构---------------------------------------------- 5 1.2.2 USB设备逻辑结构---------------------------------------------- 6 1.2.3 USB传输类型-------------------------------------------------- 8 1.2.4 USB低层通信协议---------------------------------------------- 81.3 USB接口技术----------------------------------------------------- 102 系统硬件电路设计 ----------------------------------------------------- 11 2.1 设备电路系统概述 ------------------------------------------------ 11 2.2 51系列单片机最小系统-------------------------------------------- 11 2.2.1 AT89S52单片机的介绍和选用----------------------------------- 11 2.2.2 AT89S52与PDIUSBD12构建的最小系统--------------------------- 15 2.2.3 AT89S52和外围器件------------------------------------------- 16 2.3 PDIUSBD12外围电路及其与单片机的连接设计------------------------- 17 2.3.1 PDIUSBD12介绍----------------------------------------------- 17 2.3.2 USB外围电路及其与单片机连接--------------------------------- 21 2.4 扩展功能电路的设计 ---------------------------------------------- 22 2.4.1 PS/2串行接口的扩展设计-------------------------------------- 23 2.4.2 Flash存储器的扩展设计--------------------------------------- 23 2.4.3 LPT并行接口的扩展设计--------------------------------------- 253 系统软件设计 --------------------------------------------------------- 27 3.1 固件程序的设计与实现 -------------------------------------------- 27 3.1.1 描述符 ------------------------------------------------------ 27 3.1.2 固件程序的结构 ---------------------------------------------- 29 3.2 驱动程序的设计与实现 -------------------------------------------- 32 3.2.1 驱动程序概述 ------------------------------------------------ 32 3.2.2 WDM设备驱动程序结构----------------------------------------- 33 3.2.3 驱动程序开发的工具软件 -------------------------------------- 33 3.2.4 用Win Driver开发驱动程序 ----------------------------------- 34 3.3 系统应用程序开发 ------------------------------------------------ 35 3.3.1 应用程序的实现的功能 ---------------------------------------- 353.3.2 利用Win Driver实现应用程序 --------------------------------- 354 系统调试 ------------------------------------------------------------- 37 4.1 系统硬件测试 ---------------------------------------------------- 37 4.2 系统软件调试及系统测试 ------------------------------------------ 37 结论 -------------------------------------------------------------------- 39 致谢语 ------------------------------------------------------------------ 40 参考文献 ---------------------------------------------------------------- 41 附录一:原理图 ---------------------------------------------------------- 42 附录二:程序 ------------------------------------------------------------ 43 附录三:英文原文 -------------------------------------------------------- 53 附录四:英文译文 -------------------------------------------------------- 630 引言0.1 选题现状、研究意义以及发展趋势USB(Universal Serial Bus)即通用串行总线,是现在非常流行的一种快速、双向、廉价、可以进行热插拔的接口,在现在的每一台PC机上都可以找到一对USB接口。
第28卷 第3期2005年9月 电 子 器 件Ch inese Jou rnal of E lectron D evicesV o l128N o.3Sep.2005D esign of D r iver and Appl ica tion i n PC Ba sed on M CU w ith USB I n terfaceW U P eng,TA O Z heng2su,H U Y u2z hen(D ep a rt m en t of Instrum en ts E ng ineering,S hang ha i J iaotong U n iversity,S hang ha i200030,Ch ina)Abstract:T he design of softw are under W indow s in PC link ing51M CU w ith U SB in terface is p resen ted. the p rocess of the driver p roduced by D riverStudi o,the dynam ic link lib rary com p iled by V isual C++and the app licati on i m p lem en ted w ith V isual B asic are in troduced.T he functi on of data comm un icati on betw een PC and M CU th rough PD I U SBD12is realized.Key words:U SB in terface;driver;dynam ic link lib rary;app licati onEEACC:1220基于单片机USB接口的PC主机驱动程序和应用程序设计吴 鹏,陶正苏,胡宇贞(上海交通大学信息检测技术与仪器系,上海200030)摘 要:介绍了与51单片机U SB接口的PC主机在W indow s环境下软件设计过程。
USB接口类单片机特点及应用清华Freescale Semiconductor单片机应用开发研究中心邵森龙程天宇USB接口已经在无线接入设备、电子商务、安全钥、PDA及计算机便携式外设上有了广泛的应用。
本次‘Freescale杯’设计竞赛推荐的有两款单片机带有USB接口,它们是支持高速、全速USB传输的MC9S12UF32和支持低速USB传输的MC68HC908JB8/16。
MC9S12UF32 单片机MC9S12UF32是16位单片机中低价位、高性能HCS12家族中的一员。
由S12内核(Star Core CPU),加其它标准的片上模块组成,包括32K字节FLASH EEPROM,3.5K字节RAM,1.5K队列QRAM,高速USB2.0(480Mb/S)接口,给USB批量数据传输使用的集成队列控制器(IQUE),ATA5接口(PCI 总线接口),U盘类FLASH接口(Compact FLASH),SD/MMC接口,智能多媒体接口,记忆棒接口,一个16位8通道定时器,串行通讯接口,73个独立的数字I/O通道和2个输入通道。
系统集成模块(SIM)负责管理系统资源的映射,时钟产生,中断控制和总线接口。
MC9S12UF32系统总线为16位宽。
外部总线可以在8位窄模式下工作,这使得在低成本系统中可以使用单个8位宽存储器。
特别地,IQUE模块控制了一条专门的内部总线,这条总线使得从存储接口到USB模块可以保持每秒60M字节的传输率。
可以说这款单片机是专门为高速USB存储设备接口设计的。
使用这款芯片的主要模块是集成队列控制器(IQUE)、USB2.0接口和众多存储控制器接口(如ATA5)中的一个或多个。
CPU本身起到了对系统的配置和控制作用,真正的数据传输通过IQUE作为中介完成,不需要CPU的干预,这是利用这款芯片进行产品设计时的思路。
集成队列模块IQUE由三个主要部分组成:QUE控制器、QUE集成模块(QIM)和1.5K字节,宽度可定义为16位的静态队列RAM(QRAM)。
USB应用程序开发1 前言USB开发跟其他文件设备(如串口)开发一样,难点是找到该USB设备的路径,本文以DDK里src/usb/bulkusb例子为参考,阐述一个非HID的USB调试器软件的开发过程。
2 设备GUID一般设备会有两个GUID, 一个为Class GUID, 在INF文件中,另一个为Device GUID,在SYS文件中。
CreateFile使用的是SYS中的GUID,想得到它有两个办法:1 跟设备的提供者索要。
2在注册表里找,一般在:HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Control/DeviceClasses/3 设备路径根据设备GUID,枚举所有USB HOST,找匹配的USB设备,然后获取其路径。
3.1 头文件 usbport.h#define WINVER 0x0500#include <windows.h>#include <setupapi.h>#include <basetyps.h>#include <usbdi.h>#include <initguid.h>#include <stdio.h>#pragma comment(lib,"setupapi.lib")#pragma comment(lib,"hid.lib")#pragma comment(lib,"comctl32.lib")#ifndef BULKUSBH_INC#define BULKUSBH_INC#define BULKUSB_IOCTL_INDEX 0x0000#defineIOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, /BULKUSB_IOCTL_INDE X,/METHOD_BUFFERED, / FILE_ANY_ACCESS)#define IOCTL_BULKUSB_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN, / BULKUSB_IOCTL_INDE X+1,/METHOD_BUFFERED, / FILE_ANY_ACCESS)#define IOCTL_BULKUSB_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN, /BULKUSB_IOCTL_INDE X+2,/METHOD_BUFFERED, / FILE_ANY_ACCESS)extern HANDLE open_file(char *filename);extern int GetUsbPath(char *path);extern int WriteUsb(HANDLE hUsb,char *Outbuff, int len); extern int ReadUsb(HANDLE hUsb,BYTE inbuff[],DWORD&nBytesRead,int nToRead);3.2 源文件 usbport.cpp#include "usbport.h"//8a3bf75d-83c7-440e-8276-5ae3f3ea6e77DEFINE_GUID(GUID_CLASS_I82930_BULK,0x8a3bf75d, 0x83c7, 0x440e,0x82,0x76, 0x5a, 0xe3, 0xf3, 0xea, 0x6e, 0x77);BOOL GetUsbDeviceFileName( LPGUID pGuid, char *outNameBuf); HANDLE OpenUsbDevice( LPGUID pGuid, char *outNameBuf); HANDLE OpenOneDevice (HDEVINFO HardwareDeviceInfo,PSP_INTERFACE_DEVICE_DATA DeviceInfoData,char *devName);int GetUsbPath(char *path);int WriteUsb(HANDLE hUsb,char *Outbuff, int len);int ReadUsb(HANDLE hUsb,BYTE inbuff[], DWORD&nBytesRead,int nToRead);/*名称:open_file功能:打开USB设备参数:filename 定义为”PIPE00” pipe name for bulk input pipe on our test board ,”PIPE01” pipe name for bulk output pipe on our test board。
一文入门usb设备的驱动编写方法USB设备驱动编写入门USB(通用串行总线)是一种广泛使用的协议,用于在计算机和外围设备之间建立通信渠道。
编写USB设备驱动程序需要对USB规范以及操作系统提供的底层机制有深入的理解。
1. 理解USB规范USB规范定义了设备之间的通信协议、设备类型和描述符格式等方面。
理解规范对于编写符合标准且能够与其他USB设备交互的驱动程序至关重要。
2. 选择操作系统平台不同操作系统对USB设备驱动程序的要求有所不同。
为Windows环境编写驱动程序与为Linux或macOS编写驱动程序具有不同的方法。
了解目标操作系统的特定要求至关重要。
3. 设置开发环境设置开发环境包括安装必要的工具和库。
这可能需要安装USB 开发工具包或编译器。
阅读操作系统的文档以设置正确的环境。
4. 创建USB描述符USB描述符是描述设备功能和配置的数据结构。
驱动程序需要创建这些描述符才能注册设备并向操作系统公开其功能。
5. 实现USB端点USB端点是设备与计算机之间的数据传输通道。
驱动程序需要实现端点处理程序来处理数据传输和控制请求。
6. 处理USB事件驱动程序需要处理各种USB事件,例如设备插入、拔出和配置更改。
实现事件处理程序来响应这些事件并更新设备状态。
7. 使用USB堆栈操作系统提供USB堆栈,为驱动程序提供与底层USB硬件接口的抽象层。
了解USB堆栈的API和功能对于与硬件交互至关重要。
8. 调试驱动程序调试USB设备驱动程序需要专门的工具和技术。
使用调试器、日志记录和分析工具来识别并解决问题。
9. 测试驱动程序在不同环境和条件下全面测试驱动程序至关重要。
执行功能测试、兼容性测试和压力测试以验证驱动程序的可靠性和稳定性。
10. 提交并分发驱动程序开发完成后,需要向操作系统供应商提交驱动程序以进行认证和分发。
遵守供应商的准则并提供必要的文档。
USB设备接口驱动程序设计开发
陆洲
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2015(0)18
【摘要】基于USB总线的良好通用性,USB设备已得到了广泛的应用.介绍了一款USB设备接口的完整开发流程,包括芯片选择、硬件设计,详细介绍了Linux下该设备的USB驱动程序的编写.
【总页数】2页(P28-29)
【作者】陆洲
【作者单位】包头轻工职业技术学院,内蒙古包头014035
【正文语种】中文
【相关文献】
B接口加密存储设备驱动程序的研究与开发 [J], 莫林利;汤文亮
2.用DriverWorks开发GPS手持终端中USB接口的设备驱动程序 [J], 陈军根;郑建生;庞恩林
3.使用C8051F32X带USB接口的单片机进行数据采集和USB接口通信(四)——单片机编译软件、开发工具及USB通信驱动软件 [J], 史晓楠;杨钧友
4.基于USB接口设备的驱动程序设计 [J], 涂望明;魏友国;段道聚;梁季程;张学志;谢存
5.基于EZ_USB接口的快速USB驱动和用户程序开发 [J], 张进
因版权原因,仅展示原文概要,查看原文内容请购买。
51单片机控制S L811H S的U S B主机底层驱动51单片机控制SL811HS的USB主机底层驱动技术分类:通信微处理器与DSP消费电子设计 | 2006-08-14来源:电子设计应用 | 作者:华南理工大学微电子研究所陈智荣李斌引言基于USB接口的设备使用方便,性价比高,因此在人们的工作和生活中得到了广泛的应用,如U盘、移动硬盘、移动光驱、USB摄像头、USB鼠标键盘等。
同时,51 系列单片机以其成熟的技术和高性价比吸引了大量国内用户,被广泛应用于测控和自动化领域。
因此,如果在51 单片机系统中增加USB 主机接口,实现对USB 从机设备的控制,则该单片机系统可充分利用现有的各种USB从机设备,大大扩展单片机系统的功能。
本设计实现了在51单片机系统中增加USB主机功能,采用普通51单片机外接专用USB接口芯片的方案。
这种方案虽然会使系统传输速度受到限制,而且在稳定性方面有所欠缺,但此方案设计灵活性高,且易于移植,为低成本产品的开发提供了广阔前景。
设计中采用的51单片机是Atmel公司的AT89S52芯片,USB主机功能的扩展通过外接专用USB接口芯片SL811HS实现。
CYPRESS公司的USB接口芯片SL811HS可以工作在主机或从机模式,支持USB1.1的全速和低速数据传输。
工作在主机模式时,SL811HS可以自动检测外设的插拔动作,可以按照外处理器(如单片机)的要求自动把数据整合为USB协议数据包进行数据传输。
图 1 系统硬件示意图本文将介绍单片机AT89S52控制SL811HS的硬件设计和底层驱动的编写,其中重点讲述底层驱动的设计。
硬件设计系统的硬件原理图如图1所示。
AT89S52的供电电压为5V,SL811HS的为3.3V。
尽管供电电压不同,但根据芯片引脚的信号噪声容限参数分析可知,AT89S52与SL811HS之间的引脚可以直接相连,不需要电平转换或缓冲。
表1 USB主机枚举操作驱动的层次关系软件设计USB主机驱动是一个高低层子程序的组合,实现USB传输和控制的过程是较高层子程序调用较低层子程序的过程。
单片机U S B接口驱动和应用程序的开发北方民族大学学士学位论文论文题目:AT89C51单片机USB接口驱动和应用程序的开发院(部)名称:电信学院学生姓名:杨闯专业:测控技术与仪器学号:20060249指导教师姓名:周春艳论文提交时间: 2010年5月24日论文答辩时间:2010年5月29日学位授予时间:北方民族大学教务摘要通用串行总线USB是一种新兴的并逐渐取代其他接口标准的数据通信标准。
USB,由于速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。
本论文以基于USB总线的数据采集系统的研制过程为主要内容,阐述了利用CH372与ATMEL的AT89C51等组成的一套数据采集系统的设计方案、开发方法和开发过程,并给出了具体实现方案。
论文首先简要介绍了USB总线的相关内容,然后介绍了数据采集系统的设计。
数据采集系统的设计包括硬件设计、固件程序开发、驱动程序开发和应用程序开发四部分。
在硬件设计部分,首先介绍了设计中所用的CH372的性能和特点,然后给出了具体硬件设计方案,并对设计中应该注意的问题进行了说明。
驱动和应用程序主要完成USB设备的读写和即插即用功能,并提供一个友好的人机界面,对数据采集系统进行控制并显示采集后的数据。
本论文已完成了基于USB总线的数据采集系统的设计,用其实现了基本的数据采集功能。
使用USB总线传输数据,为数据采集系统与计算机之间的通讯开辟了新的道路。
关键词:USB、驱动程序、应用程序、AT89C51、CH372AbstractUniversal serial bus USB is one kind of emerging and replace other interface standards of data communication standards. USB, due to fast, convenient and flexible easy to expand, to support plug and play, low cost advantages, such as widelyapplication.The paper is mainly concerned with design process of data acquisition system that is based on USB bus. The design scheme, developing method and developing process of a suit of data acquisition system used with CH372 and ATMEL’s AT89C51 are expatiate. In addition, the paper also gives the material realization scheme.At fist, the paper introduces the protocol of USB bus in brief, and then discusses the design of data acquisition system, which includes four parts, hardware design, firmware design, device driver and application program. In hardware part, the performance of CH372 is fistly described; then the hardware scheme are given in detail; the questions which should be paid attention to in design is explained. Drivers and applications of the main equipment and USB plug and play function, and provide a friendly human-machine interface, control of data acquisition system and display the data collection.The paper has finished the design of data acquisition system based on USB bus and realized the basal data acquisition foundation. Using USB bus to transfer data blazed a way in communication between data acquisition system and computer. Keywords: USB、Drive、Applications、AT89C51、CH372目录第1章绪论 (4)1.1 引言 (4)1.2 USB的特点 (5)1.3 USB实时数据采集系统的实现方案 (6)第2章 USB体系简介 (7)2.1 体系概述 (7)2.2 USB的传输类型 (9)2.3 USB的设备状态 (11)第3章 USB数据采集系统的硬件设计 (14)3.1 USB 接口方案 (14)3.2 USB接口的硬件设计 (15)3.2.1 CH372简介 (15)3.2.2 USB接口的硬件电路设计 (20)3.3 USB接口硬件的实现 (21)3.3.1时钟电路 (21)3.3.2复位电路 (22)3.3.3 A/D转换电路 (22)3.3.4 CH372接口电路 (23)3.3.5 单片机扩展RAM接口电路 (24)第4章 USB数据采集系统设备固件编写 (25)4.1 固件设计方案及工作流程 (25)4.1.1固件的设计思想 (25)4.1.2固件的工作流程 (25)4.2固件开发 (26)4.2.1主循环模块(MAINLOOP.C) (26)4.2.2外接口模块 (26)4.2.3 CH375_INIT初始化模块 (27)4.2.4上传数据块模块 (27)4.2.5上传中断数据模块 (27)第5章 USB设备驱动程序及应用程序 (28)5.1驱动开发工具的选择 (28)5.2 WDM概述 (28)5.3 主要模块设计 (29)5.3.1 初始化模块 (29)5.3.2 即插即用管理模块 (30)5.3.3I\O控制模块 (32)5.4 应用程序设计与实现 (32)5.4.1 操作例程及初始化 (32)5.4.2 设备读写接口程序的实现 (33)5.4.3 数据传输程序的设计和实现 (34)5.5 用户应用程序的具体实现 (38)结束语 (39)致谢 (40)参考文献 (41)附录1 (42)附录2 (43)第1章绪论1.1 引言现代工业生产和科学研究对数据采集系统的要求日益提高,目前比较通用的方法已逐渐不能适应其要求。
例如在PC机及工控机内安装数据采集板卡,如A/D卡、422卡或485卡等。
这些数据采集系统存在以下缺陷:安装麻烦;价格昂贵;受计算机插槽数量、地址、终端资源的限制,可扩展性差;在一些电磁干扰性强的测试现场,无法专门对其做电磁屏蔽,导致采集的数据失真等。
USB是Universal Serial Bus的简称,译为通用串行总线。
USB是一种外设总线,所不同的是,它是由Intel、Compaq、Digital、IBM、Microsoft、NEC及Northern Telecom等几家计算机和通信公司联合制订的,并成为了行业标准。
目前USB 1.1标准得到了广泛支持。
2000年初,USB 2.0标准问世,USB 2.0以480Mb/s的传输速率得到了广泛关注,在一定基础上代表了计算机接口的发展趋势。
1.2 USB的特点USB作为新一代的计算机接口,具备如下特点:(1)低成本。
为了把外围设备连接到计算机上去,USB提供了一种低成本的解决方案,所有系统的智能机制都驻留在主机并嵌入芯片组中,方便了外设的制造。
(2)热插拔。
USB实现了真正的“即插即用”功能。
设备连接后由USB自检测,并且由软件自动配置,完成后立刻就能使用,不需要用户进行干涉。
在操作系统方面,由主机负责扫描总线上的所有接口,自动识别USB设备的插拔,并相应的加载或卸载设备驱动程序,实现了即插即用功能。
(3)单一的连接器类型。
USB定义了一种简单的连接器,仅使用一个四芯电缆,即可用来连接任何一个USB设备。
多个连接器可以通过USB集线器连接。
(4)最多可通过网络连接127个设备,每个USB总线支持127个设备的连图1.1 树形拓扑结构示意图接,其树形拓扑结构如图1.1所示。
在图1.1中,每个Hub集线器可向上连接到另一个Hub,深度可达5层。
由于协议中规定使用8位数据寻址,因此每一个主机最多可连接127个设备。
(其中0x00地址用于缺省地址,在设备刚入网或复位时使用)(5)如图1.1所示,无论多少个设备连接在系统中,主机只给USB主控制器分配固定的I/O地址和中断向量,不会额外占用系统资源。
(6)USB有两种设备传输率:1.5Mb/s和12Mb/s,并且两种速率能够自适应转换。
USB 2.0的传输速率可达480Mb/s。
(7)独立供电。
USB设备提供总线供电和自供电两种方式,通过集线器向设备提供电源。
当外设的电源要求电压为5伏且电源小于500mA时,可以直接从USB总线获取电源,这样USB设备就无需专用电源线,从而降低了设备的成本。
(8)错误检测和恢复。
USB事物处理包括错误检测机制,它们用于确保数据无错误发送。
在发生错误时,事物处理可以重新进行。
(9)电源保护。
如果连续3ms没有总线活动,则USB会自动进入挂起状态,处于挂起状态的设备消耗的电流不超过500uA。
(10)支持四种类型的传输方式。
USB定义了四种不同的传输类型来满足不同设备的需求,这些传输类型包括等待传输、块传输、中断传输和控制传输。
基于USB总线的数据采集系统,充分利用了USB总线的优点,有效解决了传统数据采集系统的缺陷,是数据采集系统设计的一种较好选择。
1.3 USB实时数据采集系统的实现方案USB数据采集系统的硬件模块包括多路模拟开关、A/D转换器、微控制器和USB接口芯片等。
硬件总体结构如图1.2所示。
路信号图1.2 USB实时数据采集系统的硬件模块系统的模拟开关、A/D转换器均采用传统的设计方法,根据系统功能、采集的精度、速率、通道数等诸元素选择合适的芯片。