嵌入式系统设计USB接口实验(共11页).doc
精选优质文档-倾情为你奉上昆明理工大学信息工程与自动化学院学生实验报告( 2011 2012 学年 第 2 学期 )课程名称:嵌入式系统设计 开课实验室:信自楼443 2012年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通讯的编程技术。二、 实验原理1USB基础介绍通用串行总线协议USB(Universal Serial Bus)是由Intel 、Compaq、Microsoft等公司联合提出的一种新的串行总线标准,主要用于PC机与外围设备的互联。 USB支持三种设备传输速率:低速设备1.5 Mb/s、中速设备12 Mb/s和高速设备480 Mb/s。其主要特点是: 支持即插即用。传输速度快。连接方便。独立供电。成本低。2USB的组成USB规范中将USB分为以下五个部分: 控制器(Host Controller):负责执行由控制器驱动程序发出的命令。 控制器驱动程序(Host Controller Driver):在控制器与USB设备之间建立通信通道。 USB芯片驱动程序(USB Driver):提供对USB芯片的支持和固件(Firmware)的支持。 USB设备(USB Device):与PC相连的USB外围设备。 设备驱动程序(Client Driver Software):驱动USB设备的程序。3USB的传输方式针对设备对系统资源需求的不同,在USB规范中规定了四种不同的数据传输方式: 同步传输 (Isochronous) :以固定的传输速率,连续不断地在主机与USB设备之间传输数据,在传送数据发生错误时,USB并不处理这些错误,而是继续传送新的数据。 中断传输 (Interrupt):用于较小数据量传送,但它处理及时,实时性好。 控制传输(Control):用于主机到USB设备的数据传输,包括设备控制指令、设备状态查询及确认命令。 批量传输(Bulk):此方式不能保证传输的速率,但可保证数据的可靠性,当出现错误时,会要求发送方重发。4USB设备开发USB设备开发包括硬件电路设计和软件设计两部分内容,其中软件部分又包括USB芯片驱动程序和应用程序两部分。 USB设备在硬件上通过USB芯片实现。基于硬件资源,用USB芯片驱动程序来实现USB的功能。 5USB电路设计原理Embest S3CEV40实验系统的USB接口模块采用美国国家半导体公司的USBN9603 USB控制器,该控制器是全速USB节点器件,完全兼容USB1.0,USB1.1通信规范。实验系统中USBN9603与S3C44B0X处理器的连接图如图1-6所示。S3CEV40的电路设计中采用非复用的8位并行总线模式。该模式中没有使用DMA方式。因此DACK接高电平。CPU通过译码器生成的片选信号CS1对USB控制器进行选通,USBN9603通过EXINT0对CPU发出中断请求。6USB设备驱动程序设计 USB读写Embest S3CEV40的USB控制器用户寄存器有两个:只写内部地址寄存器和可读/写数据检测器。内部地址寄存器的地址为0x,数据寄存器的地址为0x。对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_TestModel9603Model9603.ews 工作区,直接编译链接输出可执行文件Model9603.elf,下载到S3CEV40上运行。 注意:需调整Model9603工程中的Project->Settings->linker->Add Library Seaching Path库路径设置,使其包含正确的gcc标准库路径。3. 安装USB设备驱动程序。 运行USB例程后,Windows弹出发现新硬件的提示对话框,按照安装向导安装驱动程序Embest S3CEV40 USB Driver,驱动程序安装文件位USB_TestDriver目录。五、 实验程序#include <stdio.h>#include <stdarg.h>#include "44b.h"#include "option.h"#include "usblib.h"#define U32 unsigned int#define U16 unsigned short#define S32 int#define S16 short int#define U8 unsigned char#defineS8 char#define TRUE 1#define FALSE 0extern int dtapid_TGL3PID;U8 COMbuf64;U8 COMlen;/* Flush and disable the USB TX3 */#define FLUSHTX3 write_usb(TXC3,FLUSH);/* enable TX3, using the appropriate DATA PID, but not toggling it */#define TXEN3_PID_NO_TGL if(dtapid_TGL3PID) write_usb(TXC3,TX_TOGL+TX_LAST+TX_EN); else write_usb(TXC3,TX_LAST+TX_EN); /*DATA3*/ /* enable TX3, using the appropriate DATA PID */#define TXEN3_PID TXEN3_PID_NO_TGL; dtapid_TGL3PID=!dtapid_TGL3PID;/*【功能说明】锁相环设置,修改系统主频Fout = (8 + M_DIV) * Fin / (2+P_DIV) * (2S_DIV) */void ChangePllValue(int mdiv,int pdiv,int sdiv) rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;/*【功能说明】通用延时函数,延时time个100us*/static int delayLoopCount = 400;void Delay(int time)int i,adjust=0;if(time=0)time=200;adjust=1;delayLoopCount=400;rWTCON=(MCLK/-1)<<8)|(2<<3);rWTDAT=0xffff;rWTCNT=0xffff; rWTCON=(MCLK/-1)<<8)|(2<<3)|(1<<5);for(;time>0;time-)for(i=0;i<delayLoopCount;i+);if(adjust=1)rWTCON=(MCLK/-1)<<8)|(2<<3);i=0xffff-rWTCNT;delayLoopCount=/(i*64);/*【功能说明】IO端口功能、方向设定*/void Port_Init(void)/CAUTION:Follow the configuration order for setting the ports. / 1) setting value / 2) setting control register / 3) configure pull-up resistor. /16bit data bus configuration / PORT A GROUP/ BIT 9876543210/ A24A23A22A21A20A19A18A17A16A0/0111111111rPCONA = 0x1ff;/ PORT B GROUP/ BIT 109876543210/CS5/CS4/CS3/CS2/CS1GPB5GPB4/SRAS/SCASSCLKSCKE/EXTNICUSBIDESMCNCNCSdramSdramSdramSdram/ 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1rPDATB = 0x7ff;/ P9-LED1 P10-LED2rPCONB = 0x1cf;rPDATC = 0xff00;rPCONC = 0x4ff0ffff;rPUPC = 0x30ff;/PULL UP RESISTOR should be enabled to I/OrPDATD= 0xff;rPCOND= 0xaaaa;rPUPD = 0x0;LcdDisprPDATE= 0x1ff;rPCONE= 0x25529;rPUPE= 0x6;rPDATF = 0x0;rPCONF = 0x252a;rPUPF = 0x0;rPDATG = 0xff;rPCONG = 0xffff;rPUPG = 0x0;/should be enabled rSPUCR = 0x7; /D15-D0 pull-up disable/*定义非Cache区*/rNCACHBE0=(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);rNCACHBE1=(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);/*所有的外部硬件中断为低电平触发*/rEXTINT=0x0;/*【功能说明】异步串行口0初始化*/void Uart0_Init(int mclk,int baud) if(mclk = 0)mclk = MCLK; rUFCON0 = 0x0; /禁止使用FIFO rUMCON0 = 0x0; /禁止使用FIFO rULCON0 = 0x3; /正常无奇偶校验,一个停止位,8个数据位 rUCON0 = 0x245; rUBRDIV0 = ( (int)(mclk/16./baud + 0.5) -1 ); Delay(1);/延时若干个100us/*【功能说明】异步串行口1初始化*/void Uart1_Init(int mclk,int baud) if(mclk = 0)mclk = MCLK; rUFCON1 = 0x0; /禁止使用FIFO rUMCON1 = 0x0; /禁止使用FIFO rULCON1 = 0x3; /正常无奇偶校验,一个停止位,8个数据位 rUCON1 = 0x245; rUBRDIV1 = ( (int)(mclk/16./baud + 0.5) -1 ); Delay(1);/延时若干个100us/*【功能说明】从串行口收取一个字符,ch为0从UART0收取,ch为1从UART1收取*/char Uart_Getch(U8 ch) if(ch = 0) while(!(rUTRSTAT0 & 0x1);/等待直到接受到一个数据return rURXH0; else while(!(rUTRSTAT1 & 0x1);/等待直到接受到一个数据returnrURXH1; /*【功能说明】检查串行口是否收到字符并返回,ch为0从UART0收取,ch为1从UART1收取*/char Uart_GetKey(U8 ch) if(ch = 0) if(rUTRSTAT0 & 0x1)/如果收到字符就返回该字符 return rURXH0;elsereturn 0;/如果没有收到字符就返回0 else if(rUTRSTAT1 & 0x1)/如果收到字符就返回该字符 return rURXH1;elsereturn 0;/如果没有收到字符就返回0 /*【功能说明】向串行口发送一个数据,ch为0向UART0发送,ch为1向UART1发送*/void Uart_SendByte(U8 ch,int data)if(ch = 0)if(data = 'n')while(!(rUTRSTAT0 & 0x2);/改动延时时间1-10Delay(10);/由于超级终端反应较慢,有一个微小延迟WrUTXH0('r');while(!(rUTRSTAT0 & 0x2);/等待知道THR变空/改动延时时间1-10Delay(10);rUTXH0 = data; elseif(data = 'n')while(!(rUTRSTAT1 & 0x2);/改动延时时间1-10Delay(10);/由于超级终端反应较慢,有一个微小延迟rUTXH1 = 'r'while(!(rUTRSTAT1 & 0x2);/等待知道THR变空/改动延时时间1-10Delay(10);rUTXH1 = data; /*【功能说明】向串行口发送一个字符串,ch为0向UART0发送,ch为1向UART1发送*/void Uart_SendString(U8 ch,char *pt) while(*pt)Uart_SendByte(ch,*pt+);/*【功能说明】以标准格式printf向串行口发送一个字符串ch为0向UART0发送,ch为1向UART1发送。(如果不用vsprintf代码会减小很多!)*/void Uart_Printf(U8 ch,char *fmt,.) va_list ap; char string256; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(ch,string); va_end(ap);/*【功能说明】系统主函数*/void Main(void)rINTCON=0x;rINTMSK=0x07ffffff;rINTMOD=0x;/IRQ方式Port_Init();/IO端口功能、方向设定Uart0_Init(0,);/异步串行口0初始化,设置波特率为 Uart_Printf(0,"n【SAMSUNG S3C44B0X 开发板】");Uart_Printf(0,"n【Flash:2MBytes SST39VF160】");Uart_Printf(0,"n【SDRAM:8MBytes HY57VHG】");USB_Init();/ 初始化USB设备while(1)int count;char ch100;USB_Purge(2);count = USB_Read(2, ch, 100);USB_Write(2, ch, count);六、 程序运行结果1、 程序部署完运行七、 实验总结通过本次实验我了解USB接口基本原理。了解了USB的特点支持即插即用,传输速度快,连接方便,独立供电,成本低。掌握了USB的组成和传输方式,最后实现USB接口与PC通讯的编程技术。专心-专注-专业