嵌入式系统设计USB接口实验.docx

上传人:b****6 文档编号:6464746 上传时间:2023-01-06 格式:DOCX 页数:16 大小:520.26KB
下载 相关 举报
嵌入式系统设计USB接口实验.docx_第1页
第1页 / 共16页
嵌入式系统设计USB接口实验.docx_第2页
第2页 / 共16页
嵌入式系统设计USB接口实验.docx_第3页
第3页 / 共16页
嵌入式系统设计USB接口实验.docx_第4页
第4页 / 共16页
嵌入式系统设计USB接口实验.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

嵌入式系统设计USB接口实验.docx

《嵌入式系统设计USB接口实验.docx》由会员分享,可在线阅读,更多相关《嵌入式系统设计USB接口实验.docx(16页珍藏版)》请在冰豆网上搜索。

嵌入式系统设计USB接口实验.docx

嵌入式系统设计USB接口实验

昆明理工大学信息工程与自动化学院学生实验报告

(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。

其主要特点是:

1支持即插即用。

②传输速度快。

③连接方便。

④独立供电。

⑤成本低。

2.USB的组成

USB规范中将USB分为以下五个部分:

1控制器(HostController):

负责执行由控制器驱动程序发出的命令。

2控制器驱动程序(HostControllerDriver):

在控制器与USB设备之间建立通信通道。

3USB芯片驱动程序(USBDriver):

提供对USB芯片的支持和固件(Firmware)的支持。

4USB设备(USBDevice):

与PC相连的USB外围设备。

5设备驱动程序(ClientDriverSoftware):

驱动USB设备的程序。

3.USB的传输方式

针对设备对系统资源需求的不同,在USB规范中规定了四种不同的数据传输方式:

1同步传输(Isochronous):

以固定的传输速率,连续不断地在主机与USB设备之间传输数据,在传送数据发生错误时,USB并不处理这些错误,而是继续传送新的数据。

2中断传输(Interrupt):

用于较小数据量传送,但它处理及时,实时性好。

3控制传输(Control):

用于主机到USB设备的数据传输,包括设备控制指令、设备状态查询及确认命令。

4批量传输(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目录。

五、实验程序

#include

#include

#include"44b.h"

#include"option.h"

#include"usblib.h"

#defineU32unsignedint

#defineU16unsignedshort

#defineS32int

#defineS16shortint

#defineU8unsignedchar

#defineS8char

#defineTRUE1

#defineFALSE0

externintdtapid_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=(mdiv<<12)|(pdiv<<4)|sdiv;

}

/****************************************************************************

【功能说明】通用延时函数,延时time个100us

****************************************************************************/

staticintdelayLoopCount=400;

voidDelay(inttime)

{

inti,adjust=0;

if(time==0)

{

time=200;

adjust=1;

delayLoopCount=400;

rWTCON=((MCLK/1000000-1)<<8)|(2<<3);

rWTDAT=0xffff;

rWTCNT=0xffff;

rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);

}

for(;time>0;time--)

for(i=0;i

if(adjust==1)

{

rWTCON=((MCLK/1000000-1)<<8)|(2<<3);

i=0xffff-rWTCNT;

delayLoopCount=8000000/(i*64);

}

}

/****************************************************************************

【功能说明】IO端口功能、方向设定

****************************************************************************/

voidPort_Init(void)

{

//CAUTION:

Followtheconfigurationorderforsettingtheports.

//1)settingvalue

//2)settingcontrolregister

//3)configurepull-upresistor.

//16bitdatabusconfiguration

//PORTAGROUP

//BIT9876543210

//A24A23A22A21A20A19A18A17A16A0

//0111111111

rPCONA=0x1ff;

//PORTBGROUP

//BIT109876543210

///CS5/CS4/CS3/CS2/CS1GPB5GPB4/SRAS/SCASSCLKSCKE

//EXTNICUSBIDESMCNCNCSdramSdramSdramSdram

//1,1,1,1,1,0,0,1,1,1,1

rPDATB=0x7ff;//P9-LED1P10-LED2

rPCONB=0x1cf;

rPDATC=0xff00;

rPCONC=0x4ff0ffff;

rPUPC=0x30ff;//PULLUPRESISTORshouldbeenabledtoI/O

rPDATD=0xff;

rPCOND=0xaaaa;

rPUPD=0x0;

LcdDisp

rPDATE=0x1ff;

rPCONE=0x25529;

rPUPE=0x6;

rPDATF=0x0;

rPCONF=0x252a;

rPUPF=0x0;

rPDATG=0xff;

rPCONG=0xffff;

rPUPG=0x0;//shouldbeenabled

rSPUCR=0x7;//D15-D0pull-updisable

/*定义非Cache区*/

rNCACHBE0=((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);

rNCACHBE1=((Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12);

/*所有的外部硬件中断为低电平触发*/

rEXTINT=0x0;

}

/****************************************************************************

【功能说明】异步串行口0初始化

****************************************************************************/

voidUart0_Init(intmclk,intbaud)

{

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初始化

****************************************************************************/

voidUart1_Init(intmclk,intbaud)

{

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收取

****************************************************************************/

charUart_Getch(U8ch)

{

if(ch==0)

{

while(!

(rUTRSTAT0&0x1));//等待直到接受到一个数据

returnrURXH0;

}

else

{

while(!

(rUTRSTAT1&0x1));//等待直到接受到一个数据

returnrURXH1;

}

}

/****************************************************************************

【功能说明】检查串行口是否收到字符并返回,ch为0从UART0收取,ch为1从UART1收取

****************************************************************************/

charUart_GetKey(U8ch)

{

if(ch==0)

{

if(rUTRSTAT0&0x1)//如果收到字符就返回该字符

returnrURXH0;

elsereturn0;//如果没有收到字符就返回0

}

else

{

if(rUTRSTAT1&0x1)//如果收到字符就返回该字符

returnrURXH1;

elsereturn0;//如果没有收到字符就返回0

}

}

/****************************************************************************

【功能说明】向串行口发送一个数据,ch为0向UART0发送,ch为1向UART1发送

****************************************************************************/

voidUart_SendByte(U8ch,intdata)

{

if(ch==0)

{

if(data=='\n')

{

while(!

(rUTRSTAT0&0x2));

//改动延时时间1--10

Delay(10);//由于超级终端反应较慢,有一个微小延迟

WrUTXH0('\r');

}

while(!

(rUTRSTAT0&0x2));//等待知道THR变空

//改动延时时间1--10

Delay(10);

rUTXH0=data;

}

else

{

if(data=='\n')

{

while(!

(rUTRSTAT1&0x2));

//改动延时时间1--10

Delay(10);//由于超级终端反应较慢,有一个微小延迟

rUTXH1='\r';

}

while(!

(rUTRSTAT1&0x2));//等待知道THR变空

//改动延时时间1--10

Delay(10);

rUTXH1=data;

}

}

/****************************************************************************

【功能说明】向串行口发送一个字符串,ch为0向UART0发送,ch为1向UART1发送

****************************************************************************/

voidUart_SendString(U8ch,char*pt)

{

while(*pt)Uart_SendByte(ch,*pt++);

}

/****************************************************************************

【功能说明】以标准格式printf向串行口发送一个字符串

ch为0向UART0发送,ch为1向UART1发送。

(如果不用vsprintf代码会减小很多!

****************************************************************************/

voidUart_Printf(U8ch,char*fmt,...)

{

va_listap;

charstring[256];

va_start(ap,fmt);

vsprintf(string,fmt,ap);

Uart_SendString(ch,string);

va_end(ap);

}

/****************************************************************************

【功能说明】系统主函数

****************************************************************************/

voidMain(void)

{

rINTCON=0x00000000;

rINTMSK=0x07ffffff;

rINTMOD=0x00000000;//IRQ方式

Port_Init();//IO端口功能、方向设定

Uart0_Init(0,115200);//异步串行口0初始化,设置波特率为115200

Uart_Printf(0,"\n【SAMSUNGS3C44B0X开发板】");

Uart_Printf(0,"\n【Flash:

2MBytesSST39VF160】");

Uart_Printf(0,"\n【SDRAM:

8MBytesHY57V641620HG】");

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1