【工学】USB通信协议 共(16页)

合集下载

USB的通讯协议(通俗易懂).ppt

USB的通讯协议(通俗易懂).ppt

16.2 USB系统基本概念
• 16.2.2 USB设备
一个USB设备由三个功能模块组成:USB总线接口、USB逻辑 设备和功能单元。这里的USB总线接口指的是USB设备中的串行接口 引擎(SIE);USB逻辑设备被USB系统软件看作是一个端点的集合; 功能单元被客户软件看作是一个接口的集合。SIE、端点和接口都是 USB设备的组成单元。为了更好地描述USB设备的特征,USB提出了 设备架构的概念。从这个角度来看,可以认为USB设备是由一些配置、 接口和端点组成的,即一个USB设备可以含有一个或多个配置,在每 个配置中可含有一个或多个接口,在每个接口中可含有若干个端点。 其中,配置和接口是对USB设备功能的抽象,实际的数据传输由端点 来完成。在使用USB设备前,必须指明其采用的配置和接口。这个步 骤一般是在设备接入主机时设备进行自举时完成的,我们在后面会进 一步介绍。USB设备使用各种描述符来说明其设备架构,包括设备描 述符、配置描述符、接口描述符、端点描述符以及字符串描述符,它 们通常被保存在USB设备的固件程序中。
16.1 USB概述
• 主机定时对集线器的状态进行查询。当一个新设
备接入集线器时,主机会检测到集线器状态改变, 主机发出一个命令使该端口有效并对其进行设置。 位于这个端口上的设备进行响应,主机收到关于 设备的信息,主机的操作系统确定对这个设备使 用那种驱动程序,接着设备被分配一个唯一标识 的地址,范围从0~127,其中0为所有的设备在 没有分配惟一地址时使用的默认地址。主机向它 发出内部设置请求。当一个设备从总线上移走时, 主机就从其可用资源列表中将这个设备删除。
16.2 USB系统基本概念
• 16.2.1 USB主机
• (3) USB总线接口
USB总线接口包括主控制器和根集线器两部分。 根集线器为USB系统提供连接起点,用于给USB系 统提供一个或多个连接点(端口)。主控制器负责完 成主机和USB设备之间数据的实际传输,包括对传 输的数据进行串行编解码、差错控制等。该部分与 USB系统软件的接口依赖于主控制器的硬件实现, 开发人员不必掌握。

USB通信协议

USB通信协议

14.1.1 有关基本概念(1)差分信号技术差分信号技术的特点:使用两条线路表达一个比特位,即用两条线路传输信号的压差作为判断1还是0的依据。

其优点是具有极强的抗干扰性。

倘若遭受外界强烈干扰,两条线路对应的电平同样会出现大幅度提升或降低的情况,但二者的电平改变方向和幅度几乎相同,电压差值就可始终保持相对稳定,因此数据的准确性并不会因干扰噪声而有所降低。

(2)USB通信的格式(3)USB总线接口总线接口的功能除了传送和接收数据信号以外,逻辑上还包括识别设备的当前惟一地址。

设备的地址是在设备插入到总线上时,由USB主机分配的,范围从0~127,其中0为所有的设备在没有分配惟一地址时使用的默认地址。

当总线上有包传输时,设备的总线接口收到此包,通过解析其中的设备地址判断此包是否发送给自己的,如果不是则忽略此包,否则判断此包是发送给哪个端点的,并将整理后的包传送到上面的协议层的相应端点。

(4)USB设备的端点所有的传输都是传送到一个设备端点(device endpoint),或是由一个设备端点发出。

通常设备端点是内存的一个区块,或是控制器芯片内的一个缓存器,用来作为数据的缓冲区。

存储在设备端点的可能是接收到的数据,或是等待要送出的数据。

主机也有接收与传送数据的缓冲区,不过主机并没有端点,而是当作与设备端点通信的出发点(starting point)。

每一个设备的惟一地址,有一个端点号码以及方向。

端点号码可以是0~15。

方向如果是输入(IN),表示流向主机,如果是输出(OUT),表示流出主机。

如果是作为控制传输的端点,必须设置成双向传输,所以每个端点会有一对输入与输出端点,来分享同一个端点号码。

每个设备都必须将端点0设置成控制端点。

除此之外,很少需要额外的控制端点。

(5)USB接口(功能接口由一组端点组成,用来完成特定的功能。

每个设备可以同时提供多个功能接口,如打印机和扫描仪等。

USB主机端为每个接口提供了一个客户端驱动程序,驱动程序和接口之间通过交互完成了有特定意义的数据传输。

usb通信协议

usb通信协议

usb通信协议USB通信协议。

USB(Universal Serial Bus)是一种用于连接计算机和外部设备的通用接口标准。

USB通信协议是指在USB接口上进行数据传输时所遵循的规范和约定。

USB通信协议的设计旨在实现设备间的高速、可靠的数据传输,同时保持简单易用的特点。

本文将介绍USB通信协议的基本原理、数据传输方式以及常见的应用场景。

首先,USB通信协议的基本原理是通过主机-设备的架构进行数据传输。

在USB接口上,主机负责发起数据传输请求和管理总线上的设备,而设备则负责响应主机的请求并进行数据传输。

USB通信协议通过定义不同的传输类型(如控制传输、批量传输、中断传输和等时传输)来满足不同设备的数据传输需求。

控制传输用于配置设备和发送命令,批量传输适用于大容量数据的传输,中断传输用于周期性的小数据传输,而等时传输则用于实时数据传输。

其次,USB通信协议的数据传输方式包括同步传输和异步传输。

在同步传输中,数据的传输速度是由主机控制的,主机会周期性地向设备发送数据请求并接收数据响应。

而在异步传输中,设备可以主动向主机发送数据,主机则负责接收和处理数据。

USB通信协议通过这种灵活的数据传输方式,可以满足各种不同设备的数据传输需求,包括打印机、键盘、鼠标、存储设备等。

最后,USB通信协议在各种应用场景中都得到了广泛的应用。

在个人电脑上,USB通信协议被用于连接鼠标、键盘、打印机、摄像头、存储设备等外部设备。

在嵌入式系统中,USB通信协议也被广泛应用于连接各种传感器、执行器和控制器。

此外,USB通信协议还被用于连接智能手机、平板电脑、电视机、音响等消费类电子产品,实现数据传输和充电功能。

综上所述,USB通信协议作为一种通用的数据传输标准,已经成为了现代计算机和外部设备之间数据传输的重要桥梁。

通过遵循USB通信协议的规范和约定,不同厂商生产的设备可以实现互连互通,为用户提供了更加便利和丰富的外部设备选择。

usb通讯协议书

usb通讯协议书

usb通讯协议书USB通讯协议书写USB通讯协议(Universal Serial Bus Communication Protocol)是一种用于计算机和外部设备之间进行数据传输的通信协议。

它是USB接口的核心部分,负责规定了设备之间传输数据的格式、时序和流程等。

下面将详细介绍USB通讯协议的主要内容。

一、USB物理层USB物理层定义了传输介质的特性和接口的电气特性。

它规定了USB接口的引脚定义、电压和信号的时序等。

USB接口是一种通用的接口,可以连接各种不同类型的设备,因此物理层要能适配不同类型的传输介质和设备。

二、USB传输层USB传输层定义了USB通信中的数据传输方式和协议。

它包括以下几个方面的内容:1. 端点(Endpoint):USB设备通过端点来进行数据传输。

每一个USB接口都可以有多个输入端点和输出端点,它们分别用来接收和发送数据。

端点可以是控制端点、批量传输端点、中断传输端点或等时传输端点。

2. 端点描述符(Endpoint Descriptor):每个端点都要有一个对应的端点描述符,它包含了端点的特性和属性信息,包括端点的类型、方向、最大数据包大小等。

3. 传输类型:USB定义了多种数据传输方式,包括控制传输、批量传输、中断传输和等时传输。

每一种传输类型都有对应的传输协议和时序,用于实现数据的可靠传输。

三、USB协议层USB协议层定义了USB设备之间进行数据传输的规则和协议。

它包括以下几个方面:1. 控制传输:控制传输是USB通信中最基本的传输方式,用于设备之间的初始化和配置。

控制传输由设备请求和主机响应组成,通过控制传输可以发送命令和查询设备的状态信息。

2. 握手协议:USB通信中的数据传输是通过握手协议来进行的。

握手协议包括设备端点发送数据、主机端点接收数据和确认传输完成等步骤,用于确保数据的正确传输。

3. 帧结构:USB通信中的数据是按帧的形式进行传输的。

一帧包含了同步标记、包头、数据和CRC等字段。

USB通信协议

USB通信协议

USB通信协议转⾃0. 基本概念⼀个【传输】(控制、批量、中断、等时):由多个【事务】组成;⼀个【事务】(IN、OUT、SETUP):由⼀多个【Packet】组成。

USB数据在【主机软件】与【USB设备特定的端点】间被传输。

【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。

⼀个USB设备可以有多个管道(pipes)。

1. 包(Packet)包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。

数据在 USB总线上的传输以包为单位,包只能在帧内传输。

⾼速USB 总线的帧周期为125us,全速以及低速 USB 总线的帧周期为 1ms。

帧的起始由⼀个特定的包(SOF 包)表⽰,帧尾为 EOF。

EOF不是⼀个包,⽽是⼀种电平状态,EOF期间不允许有数据传输。

注意:虽然⾼速USB总线和全速/低速USB总线的帧周期不⼀样,但是SOF包中帧编号的增加速度是⼀样的,因为在⾼速USB系统中,SOF包中帧编号实际上取得是计数器的⾼11位,最低三位作为微帧编号没有使⽤,因此其帧编号的增加周期也为 1mS。

• USB总线上的情形是怎样的?• 包是USB总线上数据传输的最⼩单位,不能被打断或⼲扰,否则会引发错误。

若⼲个数据包组成⼀次事务传输,⼀次事务传输也不能打断,属于⼀次事务传输的⼏个包必须连续,不能跨帧完成。

⼀次传输由⼀次到多次事务传输构成,可以跨帧完成。

USB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),包的基本格式如下图:1.1 PID类型(即包类型)1.2 Token Packets此格式适⽤于IN、OUT、SETUP、PING。

PID 数据传输⽅向IN Device->HostOUT Host->DeviceSETUP Host->DevicePING Device->Host1.3 Start-of-Frame(SOF) PacketsSOF包由Host发送给Device。

usb通讯协议

usb通讯协议

usb通讯协议USB通讯协议。

USB(Universal Serial Bus)是一种用于连接计算机和外部设备的通用接口标准。

USB通讯协议是指USB设备与主机之间进行通讯时遵循的一套规则和约定,它包括物理层、数据链路层、传输层和应用层等内容。

USB通讯协议的规范和标准化,使得不同厂家生产的设备可以在不同的计算机系统上进行通讯和交互,极大地方便了用户的使用。

首先,USB通讯协议的物理层是指USB设备与主机之间的物理连接和电气特性。

USB接口采用了四根线进行数据传输,分别是VCC(电源线)、D+(数据+线)、D-(数据-线)和GND(地线)。

通过这四根线,USB设备可以与主机进行电源供给和数据传输。

同时,USB接口还采用了热插拔技术,用户可以在不关闭计算机的情况下插拔USB设备,极大地方便了用户的使用。

其次,USB通讯协议的数据链路层是指USB设备与主机之间的数据传输和协议规范。

在USB通讯中,数据传输采用了主从式架构,主机负责控制数据传输的发起和管理,而从设备则被动地响应主机的指令。

此外,USB通讯协议还规定了数据传输的速率和格式,以及数据的校验和纠错机制,保证了数据传输的可靠性和稳定性。

另外,USB通讯协议的传输层是指USB设备与主机之间的数据传输方式和协议规范。

USB通讯采用了端点(Endpoint)的概念,分为控制端点、批量传输端点、中断传输端点和等时传输端点等不同类型,用于满足不同数据传输的需求。

同时,USB通讯协议还规定了数据的传输方式,包括同步传输和异步传输,以及数据的打包和解包方式,保证了数据传输的高效和稳定。

最后,USB通讯协议的应用层是指USB设备与主机之间的通讯协议和接口规范。

USB通讯协议规定了USB设备的通讯方式和协议格式,包括设备描述符、配置描述符、接口描述符和端点描述符等内容,以及设备的状态转换和通讯协议的规范,保证了USB设备在不同的主机系统上可以正常地通讯和交互。

USB通信协议

USB通信协议

USB通信协议——数据交易表列出了组成4种传输类型的元素。

在这里,读者就需要注意一些通信协议的结构。

例如,传输与数据交易、数据交易与封包、封包与字段之间的关系。

当然,这是相当复杂且容易弄混淆的地方。

其中,传输包含1个或是更多的数据交易,每一个数据交易又包含1个、2个或是3个封包。

而封包中,又包含封包标识符(PID)字段、检查字段(CRC)以及额外的信息字段。

表传输类型、数据交易与封包的关系表*每一个封包是往下端接口传递出去的,若是低速,前面还会再放置PRE封包。

因此,若要了解完整的USB通信协议就必须从数据域谈起。

通过由下而上,从简易至复杂的通信协议单位来组合出各种复杂的通信协议,进而构建出完整的通信协议。

从表的第2栏中,可以知道其中包含了3种数据交易类型。

这3种数据交易是根据其目的与数据流方向来决定的。

其中,SETUP数据交易用来送出控制传输要求给设备;IN数据交易是数据从设各传回主机;OUT数据交易是将数据传送出去给设各。

每一个数据交易中,包含了辨识、错误检核、状态以及控制信息,同样也包含了要交换的数据等。

此外,一个完整的数据交易可能占用多个帧。

但是数据交易却是一个实现USB通信协议的最基本的结构组成。

也即是,在总线上没有任何通信能够去切断该数据交易的沟通过程。

当然,除非是错误的USB通信过程。

此外,一个小量数据的传输也许仅需一个数据交易。

如果是大量的数据,传输可能就需使用多个数据交易,每一次传输一部分数据。

读者或许会认为表的通信协议的结构非常复杂。

其中,尤其是第1栏所列的控制传输是较为严谨与必须去实现的。

根据上述不同封包的组合与搭配就可以执行各种数据交易。

但最重要的是,数据交易的格式必须与前面所提及的4种传输类型互相配合。

这是因为不同的传输类型就会执行不同的数据交易。

其中,除了等时传输外,控制传输、中断传输与批量传输都以下列的3个阶段来组成一个数据交易的动作。

等时传输却只有包含如下所列的2个阶段而已。

usb通讯协议

usb通讯协议

usb通讯协议USB(Universal Serial Bus,通用串行总线)是一种用于计算机和外部设备之间进行数据传输和通信的通用接口。

USB通讯协议是指在USB接口上进行数据传输和通信时所遵循的规范和约定。

USB通讯协议主要包括物理层、传输层、协议层和应用层四个部分。

物理层是USB通讯协议的底层,负责确保信号在物理介质上传输的可靠性。

物理层使用差分信号传输,可以提供更稳定和可靠的数据传输。

传输层是建立在物理层之上的层次,主要负责数据传输的控制和管理。

传输层定义了不同类型数据的传输方式,包括中断传输、批量传输和等时传输等。

中断传输适用于需要及时响应和低延迟的应用,批量传输适用于传输大量数据但延迟要求不高的应用,等时传输适用于对时间实时性要求较高的应用。

协议层是在传输层之上的层次,用于处理数据的结构和格式。

协议层定义了数据的分包和封装方式,以及数据的控制和错误检测机制。

例如,在USB通讯中,协议层将数据划分为帧(frame)和包(packet),并添加了头部、尾部和错误检验等信息以确保数据的正确性。

应用层是在协议层之上的层次,用于实现具体的功能和应用。

应用层定义了数据的格式、解析和处理方式。

例如,在USB通讯中,应用层可以定义鼠标和键盘等外设的数据格式和交互方式,使得计算机可以正确地识别和处理这些外设的数据。

USB通讯协议具有以下特点和优势:1. 简单易用:USB通讯协议提供了一种统一的接口和通信方式,使得计算机和外部设备之间的连接和数据传输变得简单易用。

2. 高速传输:USB通讯协议支持高速的数据传输,最高可达到10Gbps,能够满足各种应用的需求。

3. 热插拔功能:USB通讯协议支持热插拔功能,即在运行过程中可以插入或拔出外部设备而不会影响系统的正常工作。

4. 多设备支持:USB通讯协议支持多设备的连接和管理,可以同时连接多个外部设备,并进行相应的数据传输和通信。

总结来说,USB通讯协议是一种用于计算机和外部设备进行数据传输和通信的标准接口和协议。

usb通信协议

usb通信协议

usb通信协议USB通信协议是一种计算机通信协议,也是一种硬件接口标准。

USB(Universal Serial Bus,通用串行总线)是一种用于计算机外围设备和计算机之间传输数据的接口标准。

其目的是使计算机和周边设备间进行快速的、可靠的、方便的数据传输,同时是一种热插拔、多设备、不需要电源适配器的传输接口。

USB通信协议定义了计算机和周边设备之间传输数据的方式,包括数据传输的时间顺序、电气定义、传输速率等等。

在USB接口上有四个信号线分别为VCC、D+、D-和GND,其中VCC 为电源线,D+和D-线是传输数据的差分信号线,GND是接地线。

USB通信协议分为两种模式:控制传输模式和基于数据包的传输模式。

控制传输模式用于管理和配置USB设备,而基于数据包的传输模式则用于传输数据。

在基于数据包的传输模式中,数据被分成多个数据包并传输到接收方,接收方再将这些数据包组合起来以恢复原始数据。

USB通信协议支持的传输速率从低速到超高速依次为1.5Mbps、12Mbps、480Mbps、5Gbps。

传输速率的选择由USB主机和外设商协商得出,从而保证数据传输的速率和可靠性。

最后,需要注意的是USB通信协议的实现需要操作系统的支持,因此在使用USB设备时需要安装相应的驱动程序。

同时,为了保证设备的兼容性,USB通信协议也要经过许多认证,以确保各种USB设备之间的互通性和稳定性。

总之,USB通信协议是一种重要的硬件接口标准,它为计算机和周边设备之间的数据传输提供了强大的保障。

有助于提高计算机和设备之间的数据传输速率和可靠性,也使得用户能够更方便、更快速地使用各种外围设备。

USB通信协议

USB通信协议

编码方式USB标准采用NRZI(翻转不归零制)方式对数据进行编码,电平保持时传送逻辑1,电平翻转时传送逻辑0。

软件架构焊接在印刷电路板上的USB插座一个USB主机通过hub链可以连接多个设备。

由于理论上一个物理设备可以承担多种功能,例如路由器同时也可以是一个SD卡读卡器,USB的术语中设备(device)指的是功能(functions)。

集线器(hub)由于作用特殊,按照正式的观点并不认为是function。

直接连接到主机的hub是根(root)hub。

[编辑]端点设备/功能(和集线器)与管道pipe(逻辑通道)联系在一起,管道把主机控制器和被称为端点endpoint的逻辑实体连接起来。

管道和比特流(例如UNIX 的pipeline)有着相同的含义,而在USB词汇中术语端点经常和管道混用,甚至在正式文档中。

端点(和各自的管道)在每个方向上按照0-15编号,因此一个设备/功能最多有32个活动管道,16个进,16个出。

(出(OUT)指离开控制器,而入(IN)指进入主机控制器。

)两个方向的端点0总是留给总线管理,占用了32个端点中的2个。

在管道中,数据使用不同长度的包传递,端点可以传递的包长度上限一般是字节,所以USB包经常包含的数据量依次有8、16、32、64、128、256、512或者1024字节。

一个端点只能单向(进/出)传输数据,自然管道也是单向的。

每个USB设备至少有两个端点/管道:它们分别是进出方向的,编号为0,用于控制总线上的设备。

按照各自的传输类型,管道被分为4类:∙控制传输(Control)——一般用于短的、简单的对设备的命令和状态反馈,例如用于总线控制的0号管道。

∙同步传输(Isochronous)——按照有保障的速度(可能但不必然是尽快地)传输,可能有数据丢失,例如实时的音频、视频。

∙中断传输(Interrupt)——用于必须保证尽快反应的设备(有限延迟),例如鼠标、键盘。

∙批量传输(Bulk)——使用余下的带宽大量地(但是没有对于延迟、连续性、带宽和速度的保证)传输数据,例如普通的文件传输。

usb通信协议

usb通信协议

USB通信协议简介USB(Universal Serial Bus,通用串行总线)是一种常见的计算机外设连接标准,用于在计算机系统和外部设备之间进行数据传输和通信。

USB通信协议指的是一组规范和标准,用于定义USB设备与计算机之间的通信方式和数据格式。

USB通信协议从最早的1.0版本到现在的3.2版本经历了多次更新和改进。

随着技术的发展,USB通信协议越来越成熟和稳定,支持更高的传输速度和更丰富的功能。

架构USB通信协议的架构主要由三个部分组成:主机(Host),设备(Device)和主机控制器(Host Controller)。

主机是指计算机系统,负责控制和管理USB设备的通信。

设备是指连接到主机的外部设备,如打印机、键盘、鼠标等。

主机控制器则是位于主机和设备之间的硬件或软件,负责管理数据传输和通信。

USB通信协议采用分层的设计,按照功能可以划分为四层:物理层(Physical Layer),数据链路层(Data Link Layer),传输层(Transport Layer)和应用层(Application Layer)。

•物理层:负责传输数据的物理接口和电气特性。

包括USB插口的形状和引脚定义,以及电压、电流等信号规范。

•数据链路层:负责将数据划分成小的数据包,并添加必要的控制信息进行传输。

包括数据包的格式、错误检测和纠错等机制。

•传输层:负责管理数据的传输和流控,确保数据的可靠性和完整性。

包括数据传输的协议和错误处理机制。

•应用层:提供特定功能的接口和协议。

例如,USB设备可以通过USB打印协议(USB Printer Class)进行打印操作,或通过USB存储协议(USB Mass Storage Class)进行文件传输。

数据传输USB通信协议支持多种数据传输方式,包括控制传输(Control Transfer),批量传输(Bulk Transfer),中断传输(Interrupt Transfer)和同步传输(Isochronous Transfer)。

USB的通讯协议总结

USB的通讯协议总结

USB的通讯协议总结USB(Universal Serial Bus,通用串行总线)是一种用于连接计算机与外部设备的通信接口标准。

USB的通信协议包括物理层、数据链路层、传输层和应用层等多个层次。

下面将对USB的通信协议进行总结,以便更好地理解和应用USB技术。

1.物理层:USB的物理层定义了USB接口的电气特性和连接方式。

它使用差分传输方式进行传输,通过D+和D-两条差分信号线进行通信。

其中,D+用于发送数据,D-用于接收数据。

USB的传输速率有多种选择,包括低速(1.5 Mbps)、全速(12 Mbps)、高速(480 Mbps)和超速(5 Gbps)等。

2.数据链路层:USB的数据链路层负责将数据分包传输,并提供数据的可靠性检测和纠错机制。

数据链路层将数据分成更小的数据包,并在包头和包尾添加起始和终止标志。

同时,数据链路层还通过位填充和差分编码等技术保证数据的可靠传输。

3.传输层:USB的传输层提供了多种传输方式和协议,以满足不同设备的传输需求。

其中,最常用的传输方式是管道传输,它分为控制传输、中断传输、批量传输和等时传输四种。

控制传输用于设备配置和管理命令的传输;中断传输用于低延迟和周期性传输;批量传输用于大数据量和不敏感时延的传输;等时传输用于对时间要求最高的实时传输。

4.应用层:USB的应用层定义了设备与主机之间的通信规则和协议。

USB设备被分为功能级和接口级,每个接口表示设备的一个功能,而每个功能可以包含多个接口。

应用层协议包括设备描述符、配置描述符、接口描述符和端点描述符等信息。

主机通过这些描述符了解设备的能力和特性,然后与设备进行交互和通信。

总之,USB的通信协议包括物理层、数据链路层、传输层和应用层等多个层次。

这些协议共同组成了USB的通信体系,使得计算机与外部设备能够进行高效的数据传输和通信。

通过理解USB的通信协议,可以更好地设计和应用USB接口,实现设备之间的数据交换和功能扩展。

USB基本知识及通信协议.doc

USB基本知识及通信协议.doc

串口通信协议什么是串口串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal SerialBus或者USB混淆)。

大多数计算机包含两个基于RS232的串口。

串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。

同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(b yte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

它很简单并且能够实现远距离通信。

比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。

通信使用3根线完成:(1)地线,(2)发送,(3)接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但是不是必须的。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通行的端口,这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数。

它表示每秒钟传送的bit的个数。

例如300波特表示每秒钟发送300个bit。

当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。

这意味着串口通信在数据线上的采样率为4800Hz。

通常电话线的波特率为14400,28800和36600。

波特率可以远远大于这些值,但是波特率和距离成反比。

高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

b,数据位:这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。

如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位)。

扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。

初学入门版USB的通讯协议

初学入门版USB的通讯协议

初学入门版USB的通讯协议第16章USB接口与编程实例主要内容:USB概述USB 设备USB物理特性USB通信协议JB8的USB模块的编程方法《嵌入式技术基础与实践》16.1 USB概述USB协议有两种:USB1.1和USB2.0。

USB2.0和USB1.1完全兼容。

USB1.1支持的数据传输率为12Mbps和1.5Mbps(用于慢速外设),USB2.0支持的数据传速率可达480Mbps。

在普通用户看来,USB系统就是外设通过一根USB电缆和PC机连接起来。

通常把外设称为USB设备,把其所连接的PC机称为USB主机。

将指向USB主机的数据传输方向称为上行通信,把指向USB设备的数据传输方向称为下行通信。

《嵌入式技术基础与实践》16.1 USB概述USB网络采用阶梯式星形拓扑结构,如图16-1。

一个USB网络中只能有一个主机。

主机内设置了一个根集线器,提供了主机上的初始附属点。

PC主机(根集线器) (根阶梯) 阶梯0集线器(复合设备)游戏杆USB设备阶梯1 USB设备集线器扫描仪鼠标阶梯2图16-1 USB主机和USB设备的连接《嵌入式技术基础与实践》16.1 USB概述主机定时对集线器的状态进行查询。

当一个新设备接入集线器时,主机会检测到集线器状态改变,主机发出一个命令使该端口有效并对其进行设置。

位于这个端口上的设备进行响应,主机收到关于设备的信息,主机的操作系统确定对这个设备使用那种驱动程序,接着设备被分配一个唯一标识的地址,范围从0~127,其中0为所有的设备在没有分配惟一地址时使用的默认地址。

主机向它发出内部设置请求。

当一个设备从总线上移走时,主机就从其可用资源列表中将这个设备删除。

《嵌入式技术基础与实践》16.2 USB系统基本概念16.2.1 USB主机USB的所有数据通信(不论是上行通信还是下行通信)都由USB主机启动,所以USB 主机在整个数据传输过程中占据着主导地位。

在USB系统中只允许有一个主机。

usb通讯协议书

usb通讯协议书

usb通讯协议书甲方(提供方):_____________________乙方(接收方):_____________________鉴于甲方拥有USB通讯技术,乙方需要使用该技术进行数据传输,双方本着平等互利的原则,经协商一致,就USB通讯技术的使用达成如下协议:第一条定义1. USB通讯技术:指甲方拥有的,用于实现计算机与外部设备之间数据传输的技术。

2. 数据传输:指通过USB通讯技术实现的,甲方与乙方之间数据的发送与接收。

第二条授权范围甲方授权乙方使用甲方的USB通讯技术进行数据传输。

授权范围限于乙方的内部业务需求。

第三条授权期限本协议自____年____月____日起至____年____月____日止。

第四条保密条款1. 乙方应对甲方提供的USB通讯技术及相关文档保密,未经甲方书面同意,不得向第三方披露。

2. 乙方应采取合理的保密措施,防止USB通讯技术泄露。

第五条技术支持与维护甲方负责提供USB通讯技术的技术支持和维护服务,确保乙方能够正常使用该技术。

第六条费用与支付1. 乙方应按照本协议约定向甲方支付使用费。

2. 支付方式、金额及时间由双方另行商定。

第七条违约责任1. 如一方违反本协议的任何条款,应承担违约责任,并赔偿对方因此遭受的损失。

2. 如乙方未按时支付使用费,甲方有权暂停技术支持服务,直至乙方补齐欠款。

第八条协议的变更与解除1. 本协议的任何变更或补充,须经双方协商一致,并以书面形式确认。

2. 如一方严重违约,另一方有权解除本协议。

第九条争议解决双方因履行本协议所发生的任何争议,应首先通过友好协商解决;协商不成时,任何一方可向甲方所在地人民法院提起诉讼。

第十条其他1. 本协议未尽事宜,双方可另行协商解决。

2. 本协议一式两份,甲乙双方各执一份,具有同等法律效力。

甲方代表(签字):_____________________乙方代表(签字):_____________________签订日期:____年____月____日签订地点:_____________________(此为模板内容,具体条款需根据实际情况调整和完善)。

USB协议资料

USB协议资料
– 循环冗余码CRC字段由不同数目的位所组成。 根据不同的信息包类型,CRC数据域由不同数 目的位所组成。其中重要的数据信息包采用 CRC16的数据域(16个位),而其余的信息包 类型则采用CRC5的数据域(5个位)。
28
B通信协议
• 3.1.5包结尾字段
同步字段(SYNC) PID字段 数据字段 CRC字段 包结尾字段(EOP)
– 在输出(OUT)事务处理和设置(SETUP)事务处理中,紧接 着SETUP和OUT包后的是DATA包,DATA0和DATA1包是 交替地发送的,在DATA包后面,设备将回应一个握手 信号,如果设备可以接收数据,就回应ACK包,如果设 备忙,就回应NAK包,如果设备出错,则回应STALL包。
33
B通信协议
• B通信协议
• 4.实现难点
9
B物理电气规范
• USB接口
10
B物理电气规范
• USB缆线
– 高速/全速要求使用内含双绞线的屏蔽线 – 低速不要求但推荐使用双绞线和屏蔽线 – 电缆最大长度取决于信号衰减和传播延迟,同
时受电压跌落限制(跌落电压<125mV)
11
B物理电气规范
• B概述
主要内容
• B物理电气规范
• B通信协议
• 4.实现难点
1
B概述
• USB(Universal Serial BUS)通用串行总线 • 现在存在四种USB协议
– USB1.0 低速 1.5Mbps 192KB/s – USB1.1 全速 12Mbps 1.5MB/s – USB2.0 高速 480Mbps 60MB/s – USB3.0 超速 5Gbps 640MB/s
– 设备出错时的输入事务处理
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

做了一段时间的USB方面的开发,虽然是现成的方案,我们只需要搞清楚它的架构,再添加我们的代码就行了。

空闲之余,研究了一下USB通信过程,也把82A851R部分的汇编代码重新用C语言描述了一篇(仅是描述,不代表能真正运行)。

发现汇编代码条理性太在太差了,不好读。

一把C语言的代码一写,马上觉得清楚很多。

废话少说,开始贴图,贴代码。

================下面是将一些函数重新用C语言描述了一遍============#define BYTE unsigned char//**************************************************// 基本定义函数//**************************************************BYTE FIFO_RD_CHECK(BYTE num){BYTE FIFO_FLAG=0;UCC|=num;//选择Endpoint,0,1,2,3,4,MISC&=0xf8;//低3位置0MISC|=0X00;//TX位置0;Delay_3us();MISC|=0X01;//Set RequestDelay_28us();if(MISC&0X40!=0) FIFO_FLAG=0x0f;//READYif(MISC&0x80!=0) FIF0_FLAG&=0xf0;//Len0 DetectedMISC&=0xfe;//clear REQreturn FIFO_FLAG;}BYTE FIFO_WR_CHECK(BYTE num){BYTE FIFO_FLAG=0;//后4位表示Ready位,前四位表示Len0位的状态是否有被设置UCC|=num;//选择Endpoint,0,1,2,3,4,MISC&=0xf8;//低3位置0MISC|=0X02;//TX位置0;Delay_3us();MISC|=0X01;//Set RequestDelay_28us();if(MISC&0X40!=0) FIFO_FLAG=0x0f;//READYif(MISC&0x80!=0) FIF0_FLAG&=0xf0;//Len0 DetectedMISC&=0xfe;//clear REQreturn FIFO_FLAG;}void Read_FIFO(BYTE *Fifo_Addr,BYTE Fifo_Size,BYTE *buffer){int i=0;MISC|=0x01;//Set Requestfor(i=0;i<Fifo_Size;i++){buffer[i]=Fifo_Addr[0];//从FIFO地址取值Delay_28us();if(MISC&0x40==0) break;//Not Ready}MISC^=0X02;//改变TX位状态Delay_3us();MISC&=0XFE;//Clear Request}void Write_FIFO(BYTE *Fifo_Addr,BYTE SendLenth,BYTE *buffer){int i=0;MISC|=0X01;//Set Requestfor(i=0;i<SendLenth;i++){Fifo_Addr[0]=buffer[i];//将要发送的数据放至相应的Fifo中Delay_28us();if(MISC&0x40==0) break;//Not Ready}MISC^=0X02;//改变TX位状态Delay_3us();MISC&=0XFE;//Clear Request}BOOL Check_Real_Cmd(){BYTE bFlag_Real_Cmd=FALSE;if(MISC&0X20!=0) bFlag_Real_Cmd=TRUE;if(MISC&0X80!=0) bFlag_Real_Cmd=TRUE;return bFlag_Real_Cmd;}void Send_hand(){BOOL IsRealCmd,Status_Flag;while(1){IsRealCmd=Check_Real_Cmd();if(IsRealCmd==TRUE)return;else{Status_Flag=FIFO_WR_CHECK(0);if(Status_Flag&0x0f!=0)//Fifo_Readybreak;elsecontinue;}}MISC|=0x01;//Set RequsetMISC^=0X02;//改变TX位状态Delay_3us();MISC&=0XFE;//Clear Request}void control_read(WORD *rom_dataptr,BYTE *buffer)//从中读取数据, { //rom_dataptr是全局的在其他函数中赋值改变BYTE temp,i=0;if(buffer[7]!=0) //FIFO_WLENGTHHreturn;if(buffer[6]==0) //FIFO_WLENGTHLreturn;if(buffer[6]>data_start[0])//请求的数据超出ROM数据return;data_count=buffer[6];if(MISC&0x40!=0)//是控制指令return;if(data_count==0){Send_Hand_Shake();return;}//开始真正的control_readwhile(1){if(bFlag_RD_HT able==0)//Read Low Byte{bFlag_RD_HT able=1;buffer[i]=(BYTE )*rom_dataptr;//取其低位i++;data_count--;//全局变量,要发送的总长度if(data_count<=1)break;if(i+1==8)//FIFO_size=8break;}else//Read Hight Byte{bFlag_RD_HT able=0;buffer[i]=(BYTE )(*rom_dataptr)>>8;//取其高位rom_dataptr++;//将ROM指针前移if(buffer[i]==0x3f)continue;else{i++;if(data_count<=1)break;if(i+1==8)break;}}}//填充完毕,结束循环,开始向FIFO发送数据while(1)if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready}Write_FIFO(Fifo_0_Addr,0x02,buffer);}//**************************************************// SetAddress(): 重新设定Endpoint地址函数//**************************************************void SetAddress(BYTE *buffer){BYTE Dev_Addr;Dev_Addr=buffer[2]//FIFO_OUT3,FIFO_WVALUELSIES|=0x01;//主机从设备读操作后将更新在AWR中的地址,否则为0则立即更新Dev_Addr&=0XFE;USB_AWR=Dev_Addr;Send_Hand_Shake();}//**************************************************// SetConfiguration(): 设置配置函数//**************************************************void SetConfiguration(BYTE *buffer,BYTE *USB_Configuration){USVC|=0x80;PGA_CTRL|=0x80;*USB_Configuration=buffer[2];//FIFO_WVALUELSTALL&=0x00;//设置好以上的寄存器Send_Hand_Shake();}//**************************************************// ClearFeature(): 清徐Feature函数//**************************************************void ClearFeature(BYTE *buffer){BYTE temp;temp=buffer[2];//FIFO_wValueLif(temp=0x01){Send_Hand_Shake();elseSTALL0|=0x01;//SendStall0();}void ClearFeature_Endpoint(BYTE *buffer){BYTE temp;temp=buffer[4];//FIFO_wIndexLif(bFlag_SetConfiguration_Ready==TRUE);//表明已经配置过了temp=GetPipeBit(temp);//获取对应位temp=~temp;//取反STALL=temp&STALL;//与STALL寄存器相与,将需要的位置0Send_Hand_Shake();}//************************************************** // SetFeature(): 设置Feature函数// 包括Endpoint部分//************************************************** void SetFeature(BYTE *buffer){BYTE FIFO_wValueL=buffer[2];BYTE FIFO_wValueH=buffer[3];if(FIFO_wValueH==0x00){if(FIFO_wValueL==0x01){Send_Hand_Shake();}elseSTALL0|=0x01;//SendStall0();}else if(FIFO_wValueH>=0X81<=0X84){if(FIFO_wValueL==0x00){Send_Hand_Shake();}elseSTALL0|=0x01;//SendStall0();}else STALL0|=0x01;//SendStall0();}void SetFeature_Endpoint(BYTE *buffer){BYTE temp;temp=buffer[4];//FIFO_wIndexLif(bFlag_SetConfiguration_Ready!=TRUE)return;//有没有被SetConfiguration()设置temp&=0x7f;temp=GetPipeBit(temp);//获取对应位STALL=temp|STALL;//将指定的Enpoint置1Send_Hand_Shake();}//**************************************************// SetInterface(): 设置Interface函数////**************************************************BOOL SetInterface(BYTE *buffer,BYTE *USB_Interface_Alt,BYTE *USB_Interface) {*USB_Interface_Alt=buffer[2];//FIFO_WVALUEL*USB_Interface=buffer[4];//FIFO_WINDEXLPA|=0X01;//Set PA.0Send_Hand_Shake();return TRUE;}//**************************************************// GetDescriptor(): 获取Descriptor// 描述的函数//**************************************************void GetDescriptor(BYTE *buffer){BYTE FIFO_WvalueH=buffer[3];BYTE FIFO_wIndexL=buffer[4];switch(FIFO_WvalueH){case 01://device, 80 06 00 01GetDeviceDescriptor();return;case 02://configurationDescriptor 80 06 00 02GetConfigurationDescriptor();return;case 03://string,80 06 00 03GetStringDescriptor();default:break;}//**********************************//****Then test for HID class Descriptor//***********************************if(FIFO_wIndexL==0x03)//Check Interface 3,被配置为HID{switch(FIFO_WvalueH){case 22://report,81 06 00 22GetReportDescriptor();break;case 21://HID,81 06 00 21GetHIDDescriptor();break;default:STALL0|=0x01;//SendStall0();//无法解析的情况break;}}elseSTALL0|=0x01;//SendStall0();//无法解析的情况}void GetDeviceDescriptor(BYTE *buffer){BYTE data_count;BYTE *data_start;data_count=device_desc_table[0];//低字节存放长度data_start=device_desc_table;}//************************************************** // GetStatus(): 设置USB状态的函数// 包括Endpoint部分//************************************************** void GetStatus(BYTE *buffer){BYTE FIFO_SendLen=0X02;buffer[0]=0x00;buffer[1]=0x01;while(1){if(Check_Real_Cmd()==TRUE) break;//估计是Len0=1,结束会话if(FIFO_WR_CHECK(0)==FALSE) continue;}Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}GetStatus_Endpoint(BYTE *buffer){BYTE FIFO_SendLen=0X02;BYTE temp;temp=buffer[4];//FIFO_wIndexL,表示要检测的Endpoint号temp&=0x7f;temp=GetPipeBit(temp);//获取位数如:0000 00101B => 0010 0000B if(temp&STALL==TRUE)//要检测的位置1buffer[0]=1;else buffer[0]=0;buffer[1]=0;while(1){if(Check_Real_Cmd()==TRUE) break;//估计是Len0=1,结束会话if(FIFO_WR_CHECK(0)==FALSE) continue;}Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//**************************************************// GetConfiguration(): 设置配置的函数////**************************************************void GetConfiguration(BYTE *buffer,BYTE USB_Configuration){BYTE FIFO_SendLen;buffer[0]=USB_Configuration;FIFO_SendLen=0x01;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0x0f!=0)//Fifo Readybreak;}Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);}//************************************************** // GetInterface(): 获取Interface接口的函数////************************************************** void GetInterface(BYTE USB_Interface_Alt,BYTE *buffer){BYTE FIFO_SendLen;buffer[0]=USB_Interface_Alt;FIFO_SendLen=0x01;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer)}//************************************************** // SetReport(): 设置Report的函数////************************************************** BYTE SetReport(BYTE *buffer){BYTE FIFO_wValueH=buffer[3];BYTE nCmdIndex1;if(FIFO_wValueH==0x02)//set_output_report{if(buffer[4]!=0x03)//check interface{STALL|=0x01;//ENPOINT0 Errorreturn;}if(buffer[6]!=0x08)//FIFO_wLengthL,check length{STALL|=0x01;//ENPOINT0 Errorreturn;}nCmdIndex1=0x21;}return nCmdIndex1;//返回命令索引号}//**************************************************// SetCur(): 设置当前信息的函数// 包括VolumeControl,MuteControl//**************************************************void SetCur(BYTE *buffer)//;21 01{if(buffer[3]==0x01)//MUTE_CONTROLMuteControl();else if(buffer[3]==0x02)//VOLUME_CONTROLVolumeControl();elseSTALL0|=0x01;}BYTE MuteControl(BYTE *buffer) //21 01 00 01,if have more feature , the state must be modify!!{BYTE nCmdIndex1;if(buffer[5]==0x02)//FIFO_wIndexH,MuteControl_SetSpeaker();{nCmdIndex1=0x18;return nCmdIndex1;}else if(buffer[5]==0x06)//MuteControl_SetMic();{nCmdIndex1=0x19;return nCmdIndex1;}}BYTE VolumeControl(BYTE *buffer){BYTE nCmdIndex1;if(buffer[5]==0x02)//FIFO_wIndexH,VolumeControl_SetSpeaker(){nCmdIndex1=0x28;return nCmdIndex1;}else ifbuffer[5]==0x06){nCmdIndex1=0x29;return nCmdIndex1;}}//************************************************** // GetMin(): 获取各种最小信息的函数// 包括GetMin_SetSpeaker,GetMin_SetMic//************************************************** void GetMin(BYTE *buffer){if(buffer[5]==0x02)//FIFO_wIndexHGetMin_SetSpeaker();else if(buffer[5]==0x06)GetMin_SetMic();elseSTALL|=0X01;}void GetMin_SetSpeaker(BYTE *buffer){buffer[0]=0x00;buffer[1]=0xe0;//Min_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}void GetMin_SetMic(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x00;//MIC_Min_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}//************************************************** // GetMax(): 获取各种最大信息的函数// 包括Speaker,Mic//************************************************** void GetMax(BYTE *buffer)if(buffer[5]==0x02)//FIFO_wIndexHGetMax_SetSpeaker();else if(buffer[5]==0x06)GetMax_SetMic();elseSTALL0|=0x01;}void GetMax_SetSpeaker(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x0c;//Max_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}void GetMax_SetMic(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x0c;//MIC_Max_Volumewhile(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}//************************************************** // GetRes():////************************************************** void GetRes(BYTE *buffer){buffer[0]=0x00;buffer[1]=0x01;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO_WR_CHECK(0)&0xff==0) continue;//Not Ready }Write_FIFO(Fifo_0_Addr,0x02,buffer)}//************************************************** // GetCur():////************************************************** void GetCur(BYTE *buffer){BYTE FIFO_wLengthL=buffer[6];BYTE FIFO_wIndexH=buffer[5];BYTE FIFO_SendLen;FIFO_SendLen=FIFO_wLengthL;if(FIFO_SendLen==0x01)GetCurMute();else if(FIFO_SendLen==0x02)GetCur_Volume();elseSTALL|=0x01;}void GetCur_Mute(BYTE *buffer){if(FIFO_wIndexH==0x02)GetCur_Mute_Speaker();else if(FIFO_wIndexH==0x06)GetCur_Mute_Mic();elseSTALL|=0x01;}void GetCur_Mute_Mic(BYTE *buffer){if(bFlag_Mic_Mute==TRUE)buffer[0]=0x01;elsebuffer[0]=0x00;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好elsebreak;}Write_FIFO(Fifo_0_Addr,0x01,buffer);}void GetCur_Mute_Speaker(BYTE *buffer){if(bFlag_Audio_Mute==TRUE)buffer[0]=0x01;elsebuffer[0]=0x00;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好elsebreak;}Write_FIFO(Fifo_0_Addr,0x01,buffer);}void GetCur_Volume(BYTE *buffer){if(buffer[5]==0x02)//FIFO_wIndexHGetCur_Volume_Speaker();else if(buffer[5]==0x06)GetCur_Volume_Mic();elseSTALL|=0x01;}void GetCur_Volume_Mic(BYTE *buffer){buffer[0]=0x00;buffer[1]=PGA_CTRL&0x3f;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好else break;}Write_FIFO(Fifo_0_Addr,0x02,buffer);}void GetCur_Volume_Speaker(BYTE *buffer,BYTE VolumeL_Save,BYTE VolumeH_Save){buffer[0]=VolumeH_Save;buffer[1]=VolumeL_Save;while(1){if(Check_Real_Cmd()==TRUE) return;if(FIFO0_WR_CHECK()&0x0f==0) continue;//未准备好else break;}Write_FIFO(Fifo_0_Addr,0x02,buffer);}//****************************************// Const String 常量//******************************************BYTE device_desc_table[]={//18 bytesWORD 0x0112 ,//descriptor type (device descriptor) , size of descriptor (18 bytes)WORD 0x0110 ,//USB spec release (ver 1.1)WORD 0x0000 ,//device sub-class , Communication device class WORD 0x0800 ,//bMaxPacketSize0 maximum packet size , bDeviceProtocolWORD 0x04D9 ,//vendor ID = 004D9HWORD 0x2851 ,//product version ID (Sample Device)WORD 0x0100 ,//product version ID Device Release CodeWORD 0x0201 ,//product string index , manufacturer string indexWORD 0x0103 ,//number of configurations , serial number string index }BYTE config_desc_table[]={//9 bytesWORD 0x0209 ,//descriptor type (config descriptor) , size of descriptor WORD 0x00D9 ,//total length of descriptor (D9 H=217 bytes)WORD 0x0104 ,//index of this configuration , 4 interfaceWORD 0x3F00 ,//configuration string indexWORD 0x3F80 ,//configuration attributes (bus supply)WORD 0x3FFA ,//maxpower (500ma)}工学(学科代码:08)是指工程学科的总称。

相关文档
最新文档