基于51单片机的USB控制器的硬件设计与实现

合集下载

基于51单片机的USB键盘设计与实现

基于51单片机的USB键盘设计与实现

基于51单片机的USB键盘设计与实现
一、背景介绍
USB键盘是近些年来随着计算机科技发展而出现的一种新型输入设备。

它采用USB接口,是电脑设备接口标准由PS/2接口更换而来的,可以满
足现代电脑日益增长的输入需要。

现代联想主板,微星主板都采用了USB
接口出现,同时USB接口也可以有效投放鼠标、USB外置设备等。

是一种
非常有效的替代方案。

本文的主要目的是基于51单片机的USB键盘设计与实现,在此基础上,可以得出一个具有良好性能的USB键盘,它将成为计算机用户所不可
或缺的输入设备之一
二、功能要求
B键盘的硬件部分,采用51单片机作为核心,屏幕模块和按键
模块作为主要的输入设备。

2.支持USB1.1/2.0标准,能够兼容主流的主板及不同接口的设备,
实现多种输入功能并支持多种操作系统。

3.按键部分及其他硬件设计,需考虑到键盘的灵敏度、机械结构的耐
用性、按键的设计及密度等多方面因素,以提高使用者的操作方便性。

4.软件设计,在51单片机上实现USB键盘的驱动程序,在根据不同
接口的主板及设备对应的协议、功能及数据格式等配置相应的控制程序,
以保证其能够实现对应的输入功能。

三、硬件设计
1.主控:采用51单片机作为主控。

基于单片机的USB研究与设计

基于单片机的USB研究与设计

基于单片机的USB研究与设计【摘要】USB 总线具有高速传输、热拔插、即插即用等特点,已经在高速数据采集系统之中得到了越来越广泛的应用。

本文基于串口通讯的原理,分析和讨论了计算机与单片机如何通过USB接口使用相关的通讯协议实现串行通信的。

【关键词】USB 总线;串行通信;单片机计算机同外界信息交流叫做通信,是指系统利用线路来进行数据的交流,目的是将数据从一端传送到另一端,实现数据的交换。

主要方式为:串行通信、并行通信。

数据的位传送,按位顺序进行,仅仅需要一根传输线即可完成完成,成本低、传送速度迅速,距离可适当调节。

在工业与生活中常常运用计算机对设备等等方面来控制操作。

其中最杰出简单实用的串行通信不仅仅结构简单,而且执行速度快、抗干扰能力强,已被广泛应用。

B通信原理概述USB是以因特尔为主,并有其它七家公司共同制定的一项简单的串行接口标准,1994年拟定最初的草案,1996年发布了USB比较规范的第一个版本1.0。

USB能够把众多的设备与pc系统连接,全部的设备都可以通过协议来共享USB,对于我们的键盘,鼠标等运用速度不算很快的设备室完全够用的。

同时总线的功能可以消除掉PC上过多的I/O端口,而单单的以一个串行通道来代替,使PC 与外设之间的连接更容易。

USB的主要设备包括HUB以及功能设备,其中的功能设备细分为定位设备、字符设备等等。

USB连接类型简单,容易使用。

这样外部的设计就简化了很多,同时也简化了用户在判断插头对应时更简便可识别度高,实现了单一的数据通用接口,节省了时间也充分提高了利用效率。

USB总线的物理连接是一种分层很明确的菊花链式,集线器是结构的中心集合。

用户可以将外设与之相连。

附加的Hub可以连接另外的外设以及下层HUBusb。

支持最多5个HUB层以及127个外部的设备设。

2.PC与单片机通过USB的通信设计在我们日常的生活或者工程运作中,通常都是利用一台电脑与单片机构成简单的系统运作,来完成简单的数据采集以及运用,利用pc机来显示,最后打印报表等等。

基于51单片机的USB键盘设计与实现

基于51单片机的USB键盘设计与实现

三江学院本科生毕业设计(论文)题目基于51单片机的USB键盘设计与实现高职院院(系)电气工程及其自动化专业学生姓名梁邱一学号 G*********指导教师孙传峰职称讲师指导教师工作单位三江学院起讫日期 2013年12月10日至2014年4月12日摘要随着计算机技术的不断更新和多媒体技术的快速发展,传统的计算机外设接口因为存在许多缺点已经不能适应计算机的发展需要。

比起传统的AT,PS/2,串口,通用串行总线USB,具有速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。

本论文阐述了51系列单片机和USB的相关内容,详细介绍了系统的一些功能设计,包括硬件设计和软件设计。

在程序调试期间用简单的串口通信电路,通过串口调试助手掌握了USB指令的传输过程,这对整个方案的设计起到了很大的指导作用。

论文以单片机最小系统配合模拟键盘组成的USB键盘硬件系统,通过对D12芯片的学习与探索,在其基本命令接口的支持下,结合硬件进行相应的固件程序设计,使其在USB协议下,实现USB模块与PC的数据通信,完成USB键盘的功能模拟。

总结论文研究工作有阐述USB总线的原理、对本设计的系统要求作出了分析、根据要求选定元件和具体编程方案、针对系统所要实现的功能对相关芯片作了详细介绍以及在硬件部分设计了原理图。

关键词:USB;D12;PCAbstractWith the rapid development of computer technology and multimedia technology constantly updated, traditional computer peripheral interface because there are many shortcomings have been unable to meet the development needs of thepared to traditional AT, PS / 2, serial, Universal Serial Bus USB, with fast, flexible and easy to use, easy to expand, support Plug and Play, a series of advantages, such as low cost, has been widely used.This paper describes the 51 series and USB related content, detailing some of the features of the system design, including hardware and software design.During debugging a simple serial communication circuit, through the serial port debugging assistant master USB transfer instructions, which designed the entire program has played a significant role in guiding.Thesis smallest single-chip system consisting of analog keyboard with a USB keyboard hardware system, by learning and explorationD12 chips, with the support of its basic command interface, in conjunction with the corresponding hardware firmware design, making it in the USB protocol, USB module data communication with the PC, the USB keyboard to complete the functional simulation.This paper summarizes research work has elaborated the principle of the USB bus, the system is designed to require the analysis, components and solutions based on the specific requirements of the selected programming for the system to achieve the function of the relevant chips are described in detail in the hardware part of the design as well as the principle of Figure.Keywords:USB;D12;PC目录第一章绪论 (1)1.1 PC接口简介 (1)1.2 USB 接口分析 (1)1.3 USB 器件的选择 (1)第二章系统分析 (3)2.1 USB总线简介 (3)2.2 USB技术指标 (3)2.3 USB系统构成 (4)第3章系统硬件设计 (6)3.1 STC89C52单片机简介及最小系统 (6)3.1.1 单片机发展概况及发展方向 (6)3.1.2 单片机特点及结构 (6)3.1.3 复位电路设计 (8)3.1.4 单片机最小系统硬件设计 (9)3.2 PDIUSBD12接口芯片设计 (9)3.2.1 USB接口芯片简介 (9)3.2.2 USB接口芯片引脚配置 (11)3.2.3 USB接口芯片硬件设计 (14)3.2.4 USB接口芯片端点描述 (14)3.2.5 USB接口芯片命令 (16)3.3 USB键盘硬件设计 (18)第4章系统软件设计 (19)4.1 固件编程的实现 (20)4.1.1 USB接口芯片工作流程图 (20)4.1.2 PDIUSBD12命令接口----PDIUSBD12.C (21)4.1.3 USB中断服务程序----USBISR.C (21)4.1.4 按键处理流程图 (21)4.1.5 USB键盘处理程序---KEY.C (22)4.1.6 USB主循环程序----MAIN.C (23)4.2 实物演示 (25)结束语 (27)致谢 (28)参考文献 (29)附录A (30)附录B (37)第一章绪论1.1 PC接口简介PC中的接口有两类:串行接口和并行接口。

嵌入USB控制器的51系列单片机EZ—USB

嵌入USB控制器的51系列单片机EZ—USB
题 这 些 问 题 大 致 可 以 归 结 到 成 本 、 配
置 以 及 个 人 电 脑 的 连 接 等 几 个 方 面 , 而
US 正 是 为 了解 决 这 些 问 题 而 出 现 的 一 B
种 方 案 。 简 而 言 之 . US 的 出现 不 仅解 B 决 了 I 插 口不够 的 问题 , 而 且还 建 立 了 / O
在 每 一 个 u s 设 备 中 都 有 一 个 串 行 接 口引 擎 B (I) I SE 。SE与U B数据线的D+ D 两个引脚相连, S 和 -
●—l
№o 柏^E曲d 出 3 。 晡 曲 钾删 9
维普资讯
与 us 设 备 进 行 字 节 传 送 。 图 2表 示 B
维普资讯
嵌人 UB 军雷 达 学 院 颜 荣 江 一 空军雷达兵 第 l 4团 阴大 兴
摘 要
主 要介 绍嵌 入 u B控 制 核 的 5 系列 单 片机 E — B 的特 性 及 传输 与控 制 机 理 。 该 内棱可 S 1 z u S 帮助 0 B外 设 开 发者 完成 U B协议 中规 定 的 8 譬 9 的通 信 工作 S S O~ O 是 US 外设研 制 者 的理 想 B



S B响 5 S N 62 B D s Dl D SD2 次 US B块 传输 ,时 间顺 序 从左 到 右 。 芯片型号 U S 2 2 U B 0 NE 提8 P n『B 1 P ⅡlB 1 制造商 朗讯 松下 N  ̄h e" i p P ⅡmS H P 肌 S S E对 P D信 息包进行解码 ,井通过传 速 度 / ・ _ I I Mb s 。 1 2 1 2 1 2 l 2 1 2 送 的 CR 位 对 数 据进 行错 误 检 测 , 然 C 端 点 数 1 5 7 6 7 7 最大包太小 1— o 4 6 12 8瑚 6 4 8 1/418 5 / 6 2 后 , 将 有效 数 据 送 到 US 设 备 。如 果 B Mc 接 口 U 并行 并 行或 并行 并 行

51单片机与USB芯片PDIUSBD12接口固件程序

51单片机与USB芯片PDIUSBD12接口固件程序

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]();。

基于C51单片机的USB接口课程设计

基于C51单片机的USB接口课程设计

摘要:本课程设计实现具有按键输入、数据储存、数据通信等功能的单片机系统。

该系统基于C51单片机的USB接口设计,该系统由最小C51单片机系统、USB接口模块组成。

系统实现按键输入数据保存至E2PROM后,可通过USB接口传送至上位机功能。

通过对系统的仿真及实物调试,完成了系统设计,实现了课程设计的要求。

关键字:USB,数据通信,单片机,按键输入,E2PROMAbstract:This course designs the single slice of machine system that the realization has a keystroke, the data functions, such as storage and data correspondence...etc..That system connects a people's design according to USB of C51 single slice of machine, that system from the minimum C51 single slice of machine system, and USB pick up a people mold piece constitute.The system carries out a keystroke data to keep to E2 PROMs, can connect a highest of a people's transmission through USB machine function.Passing is true to imitating of system and the real object adjust to try, completed a system design and carried out the request of course design.Key words:USB, data correspondence, single slice of machine, keystroke, E2PROM目录前言 (1)1.总体设计方案 (2)1.1接口设计方案 (2)1.1.1独立模式即(USB接口芯片外接C51芯片) (2)1.1.2 USB接口芯片集成了MCU (2)1.2系统设计方案 (2)2.系统设计原理 (3)2.1 USB接口简介 (3)2.2 I2C总线简介 (3)3.单元模块设计 (4)3.1 USB硬件电路设计 (4)3.1.1电源电路模块 (4)3.1.2单片机最小系统模块 (5)3.1.3 E2PROM模块: (6)3.1.4 USB接口模块 (7)3.2 USB软件设计 (9)3.2.1主程序介绍: (9)3.2.2 E2PROM写程序: (10)3.2.3 E2PROM读程序: (13)3.2.4 USB接口程序 (14)4.系统功能调试 (15)4.1调试用的软件简介: (15)4.2模块调试过程及结果: (15)5.设计总结 (18)6.参考文献 (19)前言USB是英文Universal Serial BUS的缩写,中文含义是“通用串行总线”。

51单片机控制SL811HS的USB主机底层驱动,51单片机要点

51单片机控制SL811HS的USB主机底层驱动,51单片机要点

51单片机控制SL811HS的USB主机底层驱动,51单片机,SL811HS,USB主机,传输事务引言基于USB接口的设备使用方便,性价比高,因此在人们的工作和生活中得到了广泛的应用,如U盘,移动硬盘,光驱,USB摄像头,USB鼠标键盘等,同时,51系列单片机以其成熟的技术和高性价比吸引了大量国内用户,被广泛应用于测控和自动化领域,因此,如果在51单片机系统中增加USB主机接口,实现对USB从机设备的控制,则该单片机系统可以充分利用现有的各种USB从机设备,大大扩展单片机系统功能。

本设计实现了在51单片机系统中增加USB引言基于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协议数据包进行数据传输。

本文将介绍单片机AT89S52控制SL811HS的硬件设备和底层驱动的编写,其中重点讲述底层驱动的设计。

51单片机-ch375

51单片机-ch375

51单片机usb(CH375)的设计1.1 系统功能简介本设计主要完成U盘的识别和数据的读取,并将U盘中读取的MP3文件解码播放出流畅的音乐,完成.MP3播放器的存储与解码的分离。

系统功能主要包括读取U盘数据和MP3解码播放2部分。

实现设计功能需要USB接口芯片、MP3解码芯片、主控制器和其他外围电路。

考略难易程度和实际实现程度,这里的MP3只提供从u盘的根目录读取MP3格式的文件(不包括wma,wmv,midi格式),而且u盘的文件格式必须为F AT32。

再者,考略到单片机的运行速度较慢,如果文件的采样频率额过高,可能会造成播放断断续续,因此读取的MP3文件的采样频率事先转化为频率64k ps,这样可以获得较好的音质。

2.主要芯片的选取2.1.单片机的选取由于解码和播放有很高的速度要求,且需要单片机有较大的ROM和RAM,这里我们选取了STC12C5A60S2。

STC12C5A60S2是新一代51单片机,是传统51单片机的升级换代产品,可实现“1个时钟/机器周期”,在同等晶振下运行速度可以达到传统单片机的12倍。

在这里,我们采用22.1184M.2.2.USB总线接口芯片的选取通过比较部分参数,我们选择南京沁恒电子生产的一款USB通用接口芯片CH375。

CH375是一个USB总线的通用接口芯片,CH375芯片支持HOST主机方式和DEV IC E设备方式,在本地端,CH375具有8位数据总线和读、写、片选控制线以及终端输出,可以方便地挂接到单片机等控制器的系统总线上。

最重要的是,该芯片内置固件处理海量存储设备的专用通讯协议,可以使我们的编程难度大大减小。

内部集成了PLL倍频器、主从USB接口、数据缓冲区、被动并行接口、异步串行接口、命令解释器、控制传输的协议处理器、通用的固件程序等。

2.3.音频解码芯片的选取音频解码芯片选择芬兰VLSI公司生产的VSl003。

VSl003具有MP3/wMA /MIDI解码和ADPCM编码功能,他内部包含一个高性能、低功耗的DSP处理核(VSD一SP),为用户应用提供5KB的指令RAM和0.5kb的数据RAM。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大连东软信息学院
本科毕业设计(论文)开题报告
系所:
电子工程系
专业:
班级:
姓名:
学号:
开题日期:2013年11月22日
论文
题目
基于51单片机的USB控制器的硬件设计与实现











由于多媒体技术的发展,对外设与电脑主机之间的数据传输率有了更高的需求,因此,USB总线技术应运而生。从USB的诞生到现在已经有了很大的进步,从最初的USB1.0到现在的USB3.0的技术发展,USB的使用变得越来越广泛。近年来,USB接口以其快速、即插即用、使用安装方便等优点逐渐成为现代数据传输的发展趋势。与老式的计算机接口相比,USB总线具有诸多优点,因此USB己经成为计算机相关外围设备的主流接口。从国外的发展情况来看,人们对USB技术极为关注,这从USB规范的改进速度和国际市场上基于USB产品普及程度可以看出。由于USB的各种协议都是国外提出的,国内目前对USB系统的研究主要在实际应用方面,例如国内现在生产的计算机都配置了USB接口,一些以往的计算机通用外设和主流的数码产品中也广泛采用USB技术。另外,现在飞速发展的嵌入式系统中也广泛使用USB技术,并成为当今嵌入式开发和应用中的一个热点。
机与设备的设计[J].微计算机信息,2005,(11).
[7]路永坤.基于USB接口的数据采集模块的设计与实现〔J].自动
化仪表,2005,26(2):3 5一37.
指导教师评语及改进意见
□同意开题□不同意开题
指导教师签字:年月日
系评语及改进意见
□同意开题□不同意开题
系主任签字(盖章):年月日
方案二:单片机采用STC89C52RC,USB芯片采用PDIUSBD12。
方案二优点:成本低,且两种芯片搭配使用的成功案例较多。
方案二缺点:STC89C52RC性能有限,在数据处理上会略显吃力。
综上所述,本设计以测试为主,选择方案二即可。









使用单片机采用STC89C52RC和USB芯片采用PDIUSBD12实现一个假U盘设备。当设备连接到电脑上后,设备被电脑识别为一个大容量存储设备,采用USB供电,插到电脑上后进入“我的电脑”,可以看到多出一块磁盘。里面会有一个测试文本文件TEST.TXT,占用了一定存储空间,这是在单片机固件程序中模拟的一个文件,文本文件内的内容是在固件代码中设置好的,可以对这个文件进行读写。以此来实现模拟U盘的控制。就是在单片机的内部模拟一个FAT16的文件系统,做一个假U盘。
一个扇区也叫引导扇区,它含有对文件系统识别的关键信息。根目录区存放目录项,每个目录项为32个字节,记录一个文件或目录的信息。FAT区即文件分配表,操作系统分配磁盘空间按簇来分配的。同一个文件的数据并不一定完整地存放在磁盘的一个连续的区
域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号,对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT表的对应表项中记录着它所代表的簇的有关信息:诸如是否空,是否是坏簇,是否已经是某个文件的尾簇等。目录项所占的最后一个扇区之后,便是真正存放文件数据的位置了。



度计Βιβλιοθήκη 划主要参



[1]Cypressse miconductorco rporation.S L811H Sd ates heet[M ] .2002.
[2] Microsoftco rporation.F ATF ileS ystemS pecification[M ] .19 99.
[3]Compaq,In ter,M icorsoft,NEC.U niversalS erialB usS pecification









U盘属于大容量存储设备,当U盘枚举成功后,主机与USB设备通过BULK-ONLY传输方式传输数据,所有的通信数据都通过BULK-IN和BULK-OUT端点传输。在这种传输方式下,有CBW,CS W和普通数据三种类型的数据在USB和设备之间传送。命令块包CBW (command block wrapper)是从USB Host发送到设备的命令,命令格式遵从接口bInterfaceSub-Class中所指定的命令块,这里为SCSI传输命令集。USB设备需要将SCSI命令从CBW中提取出来,执行相应的命令,完成以后,向Host发出反映当前命令执行状态的CSW,H ost根据CSW来决定是否继续发送下一个CBW或是数据。Host要求USB设备执行的命令可能为发送数据,则此时需要将特定数据传送出去,完毕后发出CSW,以使Host进行下一步的操作。U盘一般支持FAT16文件系统,它可以分成保留区、FAT区、根目录区、数据区4个部分保留区的第
[M ]. Re visionl.1 ,19 98.
[4]史波,田凯通用串行总线USB技术概述【1l.信息技术,20DI,(4 )
[5]许永和.8051单片机USB接口程序设计【M].北京:北京航空航天大学出版社,2004.
[6]冉光志,赵明生.基于SLSII H ST和S3C4510B的嵌人式USB主






方案一:单片机采用C8051F340单片机,USB芯片采用PB375A。
方案一有点:C8051F340单片机整体性能较高,搭配USB芯片采用PB375A使用后,设计的产品性能较高,可以得到更好的使用体验。
方案一缺点:C8051F340成本较高,且设计较为复杂,并且USB芯片采用PB375A的现有资料较少,开发起来少有难度。
相关文档
最新文档