昆明理工大学信息工程与自动化学院学生实验报告(2011—2012学年第2学期)课程名称:嵌入式系统设计开课实验室:信自楼4432012年4月19日年级、专业、班计科xx学号Xxxxxxxxxxxx姓名Xxxx成绩实验项目名称USB接口实验指导教师Xx教师评语该同学是否了解实验原理:A.了解□B.基本了解□C.不了解□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□实验过程是否详细记录:A.详细□B.一般□C.没有□教师签名:年月日一、实验目的1、了解USB接口基本原理。2、掌握通过USB接口与PC通讯的编程技术。二、实验原理1.USB基础介绍通用串行总线协议USB(UniversalSerialBus)是由Intel、Compaq、Microsoft等公司联合提出的一种新的串行总线标准,主要用于PC机与外围设备的互联。USB支持三种设备传输速率:低速设备1.5Mb/s、中速设备12Mb/s和高速设备480Mb/s。其主要特点是:①支持即插即用。②传输速度快。③连接方便。④独立供电。⑤成本低。2.USB的组成USB规范中将USB分为以下五个部分:①控制器(HostController):负责执行由控制器驱动程序发出的命令。②控制器驱动程序(HostControllerDriver):在控制器与USB设备之间建立通信通道。③USB芯片驱动程序(USBDriver):提供对USB芯片的支持和固件(Firmware)的支持。④USB设备(USBDevice):与PC相连的USB外围设备。⑤设备驱动程序(ClientDriverSoftware):驱动USB设备的程序。3.USB的传输方式针对设备对系统资源需求的不同,在USB规范中规定了四种不同的数据传输方式:①同步传输(Isochronous):以固定的传输速率,连续不断地在主机与USB设备之间传输数据,在传送数据发生错误时,USB并不处理这些错误,而是继续传送新的数据。②中断传输(Interrupt):用于较小数据量传送,但它处理及时,实时性好。③控制传输(Control):用于主机到USB设备的数据传输,包括设备控制指令、设备状态查询及确认命令。④批量传输(Bulk):此方式不能保证传输的速率,但可保证数据的可靠性,当出现错误时,会要求发送方重发。4.USB设备开发USB设备开发包括硬件电路设计和软件设计两部分内容,其中软件部分又包括USB芯片驱动程序和应用程序两部分。USB设备在硬件上通过USB芯片实现。基于硬件资源,用USB芯片驱动程序来实现USB的功能。5.USB电路设计原理EmbestS3CEV40实验系统的USB接口模块采用美国国家半导体公司的USBN9603USB控制器,该控制器是全速USB节点器件,完全兼容USB1.0,USB1.1通信规范。实验系统中USBN9603与S3C44B0X处理器的连接图如图1-6所示。S3CEV40的电路设计中采用非复用的8位并行总线模式。该模式中没有使用DMA方式。因此DACK接高电平。CPU通过译码器生成的片选信号CS1对USB控制器进行选通,USBN9603通过EXINT0对CPU发出中断请求。6.USB设备驱动程序设计①USB读写EmbestS3CEV40的USB控制器用户寄存器有两个:只写内部地址寄存器和可读/写数据检测器。内部地址寄存器的地址为0x02000002,数据寄存器的地址为0x02000000。对USB控制器进行读操作(包括读USB内部寄存器及数据)时,第一步是设置USB6位宽的内部地址寄存器,指明将要从USB某个内部地址读一个字节,第二步是从数据寄存器读出8位宽的数据。对USB进行写操作类似读操作,第一步同样是设置USB的内部地址寄存器,指明将要写一个字节数据到USB内部某个地址中去,第二步是向数据寄存器写入8位宽的数据。②USB中断USB控制器中断请求引脚连接S3C44B0X外部中断引脚EXINT0,对应的中断向量为0。初始化USB中断的步骤如下:a)初始化中断控制器的INTCON及中断方式寄存器INTMOD,使能EXINT0中断。b)安装USB中断服务程序入口到中断向量。c)初始化I/O端口G组控制器PCONG,PUPG指明EXINT0是作为中断输入引脚使用。d)设置外部中断寄存器EXTINT,指明中断触发方式。③初始化USB初始化USB需要使用USB读/写函数对USB控制器内部的控制寄存器进行设置。步骤如下:a)设置主控制寄存器MCNTRL的软件复位位(SRST),以复位USB控制器。b)设置主控制寄存器MCNTRL的电压调整位(VGE)及中断输出位(INTOC),以禁止中断输出。c)写时钟寄存器CCONF,设置USB控制器的工作频率。d)初始化功能寄存器FAR及EPC0寄存器。端点号0为双向端点,用作控制使用。e)设置中断屏蔽寄存器,包括主屏蔽寄存器MAMSK、无应答事件寄存器NAKMSK、发送事件寄存器TXMSK、接收事件寄存器RXMSK和Alternate事件寄存器ALTMSK。f)允许USB控制器中信号输出,使控制器附加到USB总线上。④USB中断服务例程中断服务程序处理USB控制器产生的中断,它将数据从USB内部FIFO读出,并建立正确的事件标志,以通知主循环程序处理。基本步骤如下:a)从主事件寄存器MAEV中读出产生中断的事件。b)根据MAEV某位的状态来判别事件,接着读取相应的事件寄存器:接收事件寄存器RXEV,或发送事件寄存器TXEV,或无应答事件寄存器NAKEV,或Alternate事件寄存器ALTEV。c)进一步判别事件寄存器某位的状态,根据具体事件分别做出相应的操作。三、实验内容编写USB通信程序,基于已有的USB驱动程序接口,完成与PC端的USB测试程序之间的数据接收与发送。四、实验步骤1.实验环境准备。使用USB连接线连接S3CEV40的USB接口和PC主机的USB接口;通过Embest仿真器连接PC主机并行口和目标板JTAG接口。2.编译、链接、运行USB例程。使用EmbestIDE打开USB_Test\Model9603\Model9603.ews工作区,直接编译链接输出可执行文件Model9603.elf,下载到S3CEV40上运行。注意:需调整Model9603工程中的Project-Settings…-linker-AddLibrarySeachingPath库路径设置,使其包含正确的gcc标准库路径。3.安装USB设备驱动程序。运行USB例程后,Windows弹出发现新硬件的提示对话框,按照安装向导安装驱动程序EmbestS3CEV40USBDriver,驱动程序安装文件位USB_Test\Driver目录。五、实验程序#includestdio.h#includestdarg.h#include44b.h#includeoption.h#includeusblib.h#defineU32unsignedint#defineU16unsignedshort#defineS32int#defineS16shortint#defineU8unsignedchar#defineS8char#defineTRUE1#defineFALSE0externintdtapid_TGL3PID;U8COMbuf[64];U8COMlen;/*FlushanddisabletheUSBTX3**************************************/#defineFLUSHTX3{write_usb(TXC3,FLUSH);}/*enableTX3,usingtheappropriateDATAPID,butnottogglingit****/#defineTXEN3_PID_NO_TGL\{if(dtapid_TGL3PID)write_usb(TXC3,TX_TOGL+TX_LAST+TX_EN);\elsewrite_usb(TXC3,TX_LAST+TX_EN);/*DATA3*/\}/*enableTX3,usingtheappropriateDATAPID*************************/#defineTXEN3_PID\{TXEN3_PID_NO_TGL;\dtapid_TGL3PID=!dtapid_TGL3PID;}/****************************************************************************【功能说明】锁相环设置,修改系统主频Fout=(8+M_DIV)*Fin/[(2+P_DIV)*(2^S_DIV)]****************************************************************************/voidChangePllValue(intmdiv,intpdiv,intsdiv){rPLLCON=(mdiv12)|(pdiv4)|sdiv;}/****************************************************************************【功能说明】通用延时函数,延时time个100us****************************************************************************/staticintdelayLoopCount=400;voidDelay(inttime){inti,adjust=0;if(time==0){time=200;adjust=1;delayLoopCount=400;rWTCON=((MCLK/1000000-1)8)|(23);rWTDAT=0xffff;rWTCNT=0xffff;rWTCON=((MCLK/1000000-1)8)|(23)|(15);}for(;time0;time--)for(i=0;idelayLoopCount;i++);if(adjust==1){rWTCON=((MCLK/1000000-1)8)|(23);i=0xffff-rWTCNT;delayLoopCount=8000000/(i*64);}}/****************************************************************************【功能说明】IO端口功能、方向设定****************************************************************************/voidPort_Init(void){//CAUTION:Followtheconfigurationorderforsettingtheports.//1)settingvalue//2)settingcontrolregister//3)configurepull-upresistor.//16bitdatabusconfiguration//PORTAGROUP//BIT9876543210//A24A23A22A21A20A19A18A17A16A0//0111111111rPCONA=0x1ff;//PORTBGROUP//BIT109876543210///CS5/CS4/CS3/CS2/CS1GPB5GPB4/SRAS/SCASSCLKSCKE//EXTNICUSBIDESMCNCNCSdramSdramSdramSdram//1,1,1,1,1,0,0,1,1,1,1rPDATB=0x7ff;//P9-LED1P10-LED2rPCONB=0x1cf;rPDATC=0xff00;rPCONC