USB实验Word格式.docx
- 文档编号:19511797
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:13
- 大小:97.71KB
USB实验Word格式.docx
《USB实验Word格式.docx》由会员分享,可在线阅读,更多相关《USB实验Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
在这一点上,USB和1394有明显的差别。
USB的总线可以在不使用的时候被挂起,这样一来就可以节约能源。
在有些时候,总线还有可能档机,比如说像数据传送的时候,突然被打断,在这个时候通过host的重新配置可以实现总线的重新工作。
4.3USB系统
一个USB系统包含三类硬件设备:
USB主机、USB设备、USB集线器。
4.4
(1)USB接口驱动程序
USB接口驱动程序需实现以下功能:
USB接口器件的初始化;
计算上层数据包的效验和,发送上层的数据包;
发送SOF帧;
接收从USB接口传送来数据,并检查数据的有效性;
将接收到的数据送往上层。
(2)USB协议栈驱动程序
USB协议栈驱动程序需实现以下功能:
提供与设备驱动程序的接口;
读取并解析USB设备描述符,配置描述符;
为USB设备分配唯一的地址;
使用默认的配置来配置设备;
支持基本的USB命令请求;
连接设备与相应的驱动程序;
转发设备驱动程序的数据包。
(3)设备驱动程序
设备驱动程序需实现以下功能:
提供与应用程序的接口;
读取并解析USB设备特有的描述符,获得设备提供的传输通道;
发送设备特有的和基本的USB命令请求;
通过设备提供的传输通道与设备进行数据传输;
通过USB命令请求重新配置设备。
4.5USB通信模型
下图为USB的通信模型示意图,从图中可以看出USB通信的数据流的结构。
主机的每一个层次分别对应设备相应的层次,通过逻辑连接起来,客户软件通过逻辑连接可以直接控制设备相应的接口模块这种连接使得软件控制与接口一一对应起来,用户使用起来可以更加简单快捷。
4.6USB设备的枚举模块
深入的理解设备的配置过程,对编写主机的协议栈和客户端驱动程序有着重要的意义。
设备的配置过程是USB协议独有的,每一个设备在正常工作之前必须完成主机对它的配置过程。
主机和它的软件对设备进行统一配置,设备的配置过程包括两步:
第一步对所有的设备都适用,一般在主机的协议软件中完成,这步过程称为总线枚举;
第二步对不同功能的设备完成不同的操作,设备按功能分成不同的设备类,因此这一步一般在设备类的客户端驱动程序中完成。
总线枚举
要主机识别一个USB设备必须经过枚举的过程,主机使用总线枚举来识别和管理必要设备状态变化总线枚举的过程如下:
1.设备连接
当设备接入到集线器的某个下游端口上时,与该设备所连接的集器通过其状态改变管道向主机汇报此usb设备已经连接上,此时usb设备处于加电状态,它所连接的端口是无效的。
2.主机检测到设备,发出复位
主机通过集器的类命令,询问它此状态改变的确切含义,是否有新设备插上。
主机一旦得知新设备已连接上以后,它至少等待100ms以使得插入操作充分完成以及设备电源供给能稳定工作然后主机向端口发出复位命令并启用此端口。
3.设备缺省状态
集线器对发向此端口的复位信号持续10ms.当复位信号结束后,端口已经有效了,这时usb设备处于默认状态,占用默认地址0,并且可从总线获取小于1000ma的电能,设备所有的寄存器及状态已经复位,并且设备能对默认地址的操作产生响应。
4地址分配
主机给设备分配一个唯一的地址后,设备进入有地址状态。
在接受设备地址之前,设备的默认控制管道在默认地址0处是可寻址的。
5.读取USB设备描述符
主机读取USB设备描述符,确认USB设备的属性。
6.设备配置
主机依照读取得USB设备描述符来进行配置,如果设备所需的USB资源得到满足,就发送配置命令给USB设备,表示配置完毕。
7.挂起
为了节省电源,当总线保持空闲状态超过3ms以后,设备驱动程序就会进入挂起状态。
挂起状态时设备的消耗电流不超过500uA.当被挂起时,USB设备保留了包括其地址和配置信息在内的所有的内部状态。
4.7USB描述符
USB设备通过描述符反应映他们的属性。
描述符是有定义好的格式的数据结构,每一个描述符以一个字节表明本描述符的长度,紧跟其后是一个字节的描述符类信息。
使用描述符允许单个配置的属性的精简存储,这是因为每个配置可能重用具有同样特性的其他配置的描述符或部分描述符。
这样的话,描述符类似关系数据库的当个数据记录。
在适当的地方,描述符包括了指向字符串描述符的引用字符串提供了人能读懂的信息。
字符串描述符可有可无,但描述符中的字符串指引域是不可少的。
如果一个设备不支持字符串描述符,该域就为0如果描述符的长度域值小于规范的定义,则此描述符非法,不能被主机所接受。
如果返回的描述符中的长度值大于规范的定义,则过长部分当被忽略,但下一个描述符的位置由返回长度而不是实际长度决定。
4.7.1设备描述符
设备描述符给出了USB设备的一般信息。
这包括对设备及所有的设备的、配置起全程作用的信息。
一个USB设备只能有一个设备描述符。
所有的USB设备都有缺省的控制通道。
缺省控制通道的最大包长在设备描述符表中得到了说明。
一个配置的端点和接口定义在配置描述符中,一个配置和它的接口不包括端点描述。
4.7.2配置描述符
配置描述符给出了一个设备的配置信息,描述符包括一个bConfigurationVlue在SetConfiguration()请求时被用作参数来设置所需配置此描述符给出了配置下的接口数,每个接口可能独立操作口当主机发出获取配置描述符的请求时,所有的相关接口与端点的描述符都被返回一个USB设备的有一个或多个配置。
每个配置有一个或多个接口。
而每个接口又有0个或多个端点。
在一个配置下,一个端点不会在接口之间共享,除非端点被同一个接口的不同设置使用。
但端点可以被不同配置的接口所共享一旦被配置好后,设备可支持对配置的有限调整,如果一个接口有备选设置,在配置好后可选择不同设置。
4.7.3接口描述符
此描述符在一个配置内给出一个接口的信息。
如果一个配置支持不止一个接口,端点的描述符会跟在接口描述符后被返回,接口描述符总是作为配置描述符的一部分被返回。
接口描述符不可直接用GetDescriptor()和SetDescriptoro存取。
一个接口可能包含备选设置,以使得端点或他们的特性在设备配置好以后能改变。
一个接口的缺省设置总是可选设置SetInterface()与GetInterface()用来选择与返回选择了的接口设置。
可选的接口设置使得部分的设备配置能在其它接口进行操作的情况下改变。
如果一个配置对于它的一个或多个接口有备选设置,那么每一设置包括一个独立接口描述符和相关端点。
如果一个设备配置支持单个接口,并且此接口有两个可选配置,那么配置描述表返回以后会紧跟着返回bInterfaceNumber与bAlternateSetting域皆为。
的第一设置的接口描述符及相关的端点描述符,而随之后是另一个设置接口描述符与端点描述符第二个接口描述符的bInterfaceNumber域也应为0,但bAlternateSetting域为1.
如果一个接口仅使用端点0,则接口描述符以后就不再返回端点描述符,并且此接口表示的是一个请求接口,它使用连在端点0上的缺省通道在这种情况下bNumberEndpoints域应设置成0一个接口描述符的节点个数不把端点0计在内。
4.7.4接口描述符
每个接口使用的端点都有自己的描述符,此描述符被主机用来决定每个端点的带宽需求。
每个端点的描述符总是作为配置描述的一部分返回的,端点0无描述符。
4.8S3C2410A的USBDEVICE简介
4.81USB设备控制器采用DMA接口方案,提供全速高性能的控制器,允许控制传输、中断传输和通过DMA接口的批量传输。
*兼容USB1.1
*通过DMA接口的批量传输
*五个带FIFO的端点
*集成USB收发器
*支持控制传输、中断传输和批量传输
*支持挂起和远端唤醒功能
*S3C2410A处理器内部集成的USBHOST控制器支持两个USBHOST通讯端口,该控制器的特点如下:
*符合OHCI1.0协议规范
*符合USB1.1协议规范
*同时支持USB低速和全速(12M/S)设备的连接
*支持控制,中断和DMA大量(bulk)数据传送方式
*集成了5个可配置节点的64比特FIFO存储收发器
*集成了USB收发器
*支持挂起和远程唤醒功能
USB1.1协议允许1.5Mbps和12Mbps:
两种数据传送速度规格,这大概是标准串口的100倍以及标准并口的10倍,而USB2.0协议可以提供速率为480Mbps的高速传输。
4.82USB设备枚举过程
在枚举过程中,一个设备将经历上电、默认、地址、配置等状态。
一个USB设备枚举全过程如下:
主机检测到有设备插上,总线复位
当设备与主机连接时,主机就会检测到一个连接条件。
当D+数据线拉至Vxc以上2.5us时,主机就开始进行总线复位。
主机读取设备描述符(第一次读取设备描述符)
主机连接时使用默认地址(地址0)读取设备描述符。
主机使用地址0对设备的设备描述符进行读取。
S3C2410A的端点0的缓冲区是16个字节,程序中设置为8个字节,所以S3C2410作为设备先发送8个字节的设备描述符。
当主机接收到这8个字节的描述符。
当主机接收到8个字节符后,就认为有设备连接了,即发送一个0字节的数据包到设备作为状态应答。
分配地址
在地址分配阶段,主机设备分配一个地址。
默认分配地址为0X02在以后的通信中,设备只对0x02地址的信息做出应答。
主机从新的地址获取设备描述符
分配好了设备地址后,主机从新的地址获取设备描述符,程序中接收数据包设置成8字节,18字节的设备描述符要分3次发送。
最后主机发送一个0字节的数据包到设备作为为应答状态应答。
主机读取配置描述符
主机读取完设备描述符就读取设备的配置描述符。
主机读取描述符集合
主机了读取设备描述符和配置描述符外,还要读取接口描述和端点描述符。
在这里主机使用再次读取配置的方法来读取配置描述符、接口描述符和端点描述符的集合。
这里请求的字节数0XFF.
设置配置
主机读取完描述符后,就需要对设备进行配置,使设备从地址状态进入配置状态。
读取配置状态(可选)
主机设置完配置后,设备即可使用。
主机有时会对设备的状态进行读取。
读取接口状态(可选)
在完成配置后,主机会对接口的状态进行读取。
4.9实验程序:
4.91中断程序
Staticvoid_irq1srUsbd(void)
{
U8usbdIntpnd,epIntpnd;
U8saveIndexReg=rINDEX_REG;
//保存索引寄存器值(现场保护)
usbdIntpnd=rUSB_INT_REG;
//保存中断标志寄存器
epIntpnd=rEP_INT_REG;
if(usbdIntpnd&
SUSPEND_INT)//总线上超过3ms没有活动信号引起中断
{
Rusb_INT_REG=SUSPEND_INT;
//清除中断标志位
}
RESET_INT)//接收到复位信号引起的中断
//ResetUsbd();
ReconfigUsbd();
//重新配置USBdevice
rUSB_INT_REG=RESET_INT;
//RESET_int shouldbeclearedarterResetUsbd().
PrepareEpIFifo();
If(epIntpnd&
EP0_INT)//端点0中断
Rep_INT_REG=EP0_INT;
EpoHandler();
//进入控制传输中断处理程序
EP1_1NT)
rEP_INT_REG=EP1_INT;
Ep1Handler();
//进入Ep1中断处理程序(BULKIN)
EP2_INT)
rEP_INT_REG=EP2_INT;
//Ep2Handler();
if(epIntpnd&
EP3_INT)
rEP_INT_REG=EP3_INT;
Ep3Handler();
//进入Ep3中断处理程序(BULKOUT)
}
EP4_INT)
rEP_INT_REG=EP4_INT;
//Ep4Handler();
ClearPending(BIT_USBD);
//USB设备中断处理完毕,清除中断标志位
rINDEX_REG=saveIndexReg;
//恢复索引寄存器原来的值(恢复现场)
4.92端点1的数据传输程序
voidEp1Handler(void)
U8in_csr1;
rINDEX_REG=1;
in_csr1=rIN_CSR1_REG;
//IthinkthatEPI_SENT_STALLwillnotbesetto1.
if(in_csr1&
EPI_SENT_STALL)//USB已经发布了一个STALL握手信号,由此引起该中断
CLR_EP1_SENT_STALL();
//清除SENT_STALL位,STALL状态结束
return;
//IN_PKT_READYiscleared
//Thedatatransferedwasep1Buf[]whichwasalreadyconfigured
transferIndex++;
if(UsbState==0x01234567)
PrepareEp1Fifo();
//准备好发送的数据,把IN_PKT_READY置位
//IN_PKT_READYisset
//ThispackitwillbeusedfornextINpackit.
4.93USBDevice初始化函数
voidUsbdInit(U8fun)
isUsbdSetConfiguration=0;
//MDIV=40,PDIV=4,SDIV=1
//Upll=(m*Fin)/(p*2**s)
//m=(MDIV+8),p=(PDIV+2),s=SDIV
//Upll=48MHz
rUPLLCON=(40<
<
12)|(4<
4)|1;
//初始化描述符
InitDescriptorTable(fun);
UsbState=0;
4.94USB下载函数
staticintBoardUsbDownload(U32addr,U32run)
U8fun;
intlen;
//GPH9-->
outputGPH10-->
output
rGPHCON=rGPHCON&
~(0xf<
18)|(0x5<
18);
//GPG9-->
input
rGPGCON&
=0xfff3ffff;
fun=1;
//USBDevice初始化
UsbdInit(fun);
Delay(100);
rGPGCON|=0x00040000;
//GPG9ouput1
rGPGDAT|=0x0200;
//中断服务程序
pISR_USBD=(unsigned)IsrUsbd;
EnableIrq(BIT_USBD);
len=WaitDownload(addr);
DisableIrq(BIT_USBD);
//GPG9input
if(len>
0){
Uart_Printf("
\nUSBdownloadfinished,pressanykeytoexit\n"
);
returnlen;
5、实验步骤
1.连接好实验环境,将仿真器的一端通过并口连接到PC机,将仿真器的另一端通过JTAG
线连接到GEC2410的JTAG接口。
2.将串口线一端接到PC机,另一端接到GEC2410的UART0接口(即P1口);
打开串口
超级终端dnw.exe,设置串口BaudRate为115200,选择COM1。
3.将USB线连接GEC2410的J35USB接口和PC机的USB接口。
4.在PC机上,安装USB驱动程序。
5.打开超级终端dnw.exe,配置"
USBport"
"
DownloadAddress"
为0x32000000,是USB
下载文件的地址,该地址在SDRAM中。
6.打开ADSCodeWarrior,在ADSCodeWarrior中打开实验工程GEC2410_USBD.mcp;
并
对工程进行编译。
7.打开仿真器驱动程序Multi-ICEserver,并加载配置文件ARM920T.cfg。
8.打开ARM的开发环境AXDDebugger,在AXDDebugger中加载可执行映像文件
GEC2410_USBD.axf。
9.执行映象文件,dnw会显示"
GEC2410USBdownloadfile"
,"
USBDownloadfile,press
ESCkeytoexit"
。
如果PC机端的USB程序已经安装成功,dnw会显示"
NowUSBis
connected"
这样才可以通过USB口将文件下载到SDRAM中。
10.打开dnw.exe,"
Configuration/USBPort/DownloadAddress"
设置下载地址为0x32000000,
注意不要和映像文件的执行地址重合。
11.打开dnw.exe"
USBPort/Transmit"
,通过USB总线下载GEC.bin文件到SDRAM的
0x32000000地址下。
(GEC.bin文件在工程文件夹内)。
6、结论与体会
从USB设备实验中,了解USBDEVICE的相关知识,包括USB总线定义、构成,结构;
了解USB内部信号、及它的通信过程;
USB总线的有关程序,如USB接口程序,协议栈程序,设备驱动程序等;
USB的通信模型,USB系统内部够造。
可以说对USB通信相关知识有了相当的认识,提升了自己对一些其他一些领域懵懂状态的突破,达到举一反三的效果,这是一个不错的过程。
除了这些当然还了解S3C2410A的USBDEVICE的控制器的编程,掌握了一定的编程知识。
在这里里面虽然有些命令语句,类型都是陌生,不过通关有资料的寻找,花些时间理解,根据之前学过的几门语言,模仿比较一下,练习编一下还是比较有意思的。
总的来说就前面USB设备实验我们可以知道,在USB接口中的+5V电源不但可以为外接设备提供小电流供应,并且还起着检测功能。
当USB设置插入USB接口后,主机的+5V电源就会通过USB总线与USB设备相通。
USB外设的控制芯片会通过两只10K的电阻来检查USB设备是否接入了主机的USB端口。
如果这两个引脚一个为高电平,一个为低电平时就表示USB外设已经正常确连入USB接口,这时外设的控制芯片开始工作,并通过DATA+,DATA-向外送出数据。
这时主机接收数据后,就会提示发现新硬件,并开始安装新硬件驱动。
而在USB外设向外送出数据时,其中就包括设备自身的设备名及型号等相关参数,主机就是根据这些信息在显示器上显示出所发现的新硬件的名称型号的。
这样主机和设备就可以根据相关的协议,程序,命令指示进行连接,进行数据接收通信了。
参考资料:
伟东山编著《嵌入式Linux应用开发完全手册》
李肇庆、廖峰、刘建存编著《USB接口技术》
课程论文成绩评定表
指导老师评语:
成绩评定:
指导教师签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- USB 实验