版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式系统TCP/IP网络解决方案嵌入式USB主机陈智荣(研04)温英林张辉勇摘要:本文以一个实际USB设备枚举的数据过程,讲述了USB协议中的一些关键概念和重要的数据结构、时序;在此基础上,简单介绍本系统的硬件设计,然后围绕如何实现USB设备枚举,从底层到高层详细地介绍了本系统的软件设计。关键词:USB主机 SL811HS 51单片机 枚举 嵌入式1前言USB(通用串行总线)是最近几年逐步在PC领域广为应用的新型接口技术。USB接口通用性好、实时性强、传输方式多样、成本低、易于扩展且便于使用,这些优点使它受到许多硬件厂商的青睐,其相关设备种类越来越多,数量越来越大。然而,USB的拓扑结构中居
2、于核心地位的是主机,任何一次USB的数据传输都必须由主机来发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间无法直接通信。目前,大量扮演主机角色的是个人电脑PC机。目前使用的USB移动设备,如U盘,MP3随身听,USB接口的移动硬盘、移动光驱及数码相机等等,都只能在PC机上使用,只能通过PC机来进行数据传输和文件交换,这无疑给USB移动设备的应用带来了局限性。因此,如果能抛开PC机,使用轻便、廉价的设备就能读写操作USB外设,这将拓宽USB接口的应用范围,使人们享受更多更方便的USB接口电子产品。本设计使用51系列单片机对USB主机接口芯片SL811HS进行控制,实现了USB主
3、机的一项重要功能:枚举USB设备。2关于USB协议在本设计中,由于采用了USB主机的接口芯片,所以不需要详细了解USB传输的底层物理特性,但必须深入理解USB的数据传输的协议层,具体来说,就是USB传输中数据包,数据字段的格式和时序是如何的。2.1设备的枚举主机对USB设备的枚举指的是主机对设备的检测和配置。 在说明主机的枚举功能前,需要说明一下USB传输的数据基本结构和格式。从表1可见,在USB的数据传输中:主要有四种传输事务类型(控制、批量、中断、同步),而主机枚举设备的功能是只需要通过控制传输实现的。控制传输有三个传输阶段(建立、数据、状态,其中数据阶段是可选的)。每个传输阶段又由三个包
4、组成(令牌包、数据包、握手包、特殊包)。表 1 USB传输的数据基本结构和格式传输事务类型阶段包控制建立令牌包数据包握手包数据令牌包数据包握手包状态令牌包数据包握手包批量(不分阶段)令牌包数据包握手包中断(同上)同步(同上)其中,包是由域来组成的,共有7种域,每种域的子类型如下表所列:表 2 域和域的子类型域类型名域子类型名同步域SYNC标识域(PID)SETUP、OUT、IN、SOF、DATA0、DATA1、ACK、NAK、STALL、PRE地址域ADDR端点域ENDP帧号域FRAM数据域DATA校验域CRC5、CRC16其中,同步域的实际二进制编码为”_0000 0001”;另外,每个包是
5、以SE0态作为结束标志的。下面,就以一个实际设备枚举的全过程为例,说明USB数据传输的一些具体细节(在这里,将不列出每个包的同步域和结束标志)。2.1.1主机检测到有设备插上,总线复位当设备与主机连接时,主机就会检测到一个连接条件(USB接口芯片向CPU发出中断请求),主机就开始进行总线复位(主机强制输出SE0,即强制把D和D两信号线拉为低电平)。2.1.2主机第一次读取设备描述符主机使用默认地址(地址0)读取设备描述符,如表3所示。表 3 主机第一次读取设备描述符阶段包序号(包类型)数据内容建立包1(令牌包)主机向默认地址(地址0)设备发送建立包SETUPADDRENDPCRC50xB40x
6、000x00x08包2(数据包)主机发出建立阶段的数据包(请求获取设备描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0001 0000 40000xBB29包3(握手包)设备应答ACK0x4B数据包4(令牌包)主机读取数据INADDRENDPCRC50x960x000x00x0B包5(数据包)设备返回设备描述符DATA1DATACRC160xD212 01 0001 DC 00 00 10 7104 6606 0001 00 000x42C6包6(握手包)主机应答ACK0x4B状态包7(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x00
7、0x00x08包8(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包9(握手包)设备应答ACK0x4B其中,包#2中的DATA含义如下:bmRequestType=0x80:所请求数据将是从设备传到主机;标准请求命令;该命令接受者为设备bRequest=0x06:请求命令代码是GET_DESCRIPTORwValue=0x0001:描述符索引值0x00;描述符编号0x01wIndex=0x0000:接收者为设备,所以此字段为0wLength=0x4000:要求设备返回的数据长度2.1.3地址分配在地址分配事务中,主机分配给设备一个地址,如表4所示,分配的地
8、址为0x02,在以后的通信里,设备就只对0x02地址的信息作出应答,而把0地址让出来。从这个地址分配事务中也可见,控制传输的数据状态是可选的。表 4 地址分配阶段包序号(包类型)数据内容建立包10(令牌包)主机向默认地址(地址0)设备发送建立包SETUPADDRENDPCRC50xB40x000x00x08包11(数据包)主机发出建立阶段的数据包(请求设置设备的地址)DATA0DATACRC160xC300 05 02 00 00 00 00 000xD768包12(握手包)设备应答ACK0x4B状态包13(令牌包)主机要求读取传输状态INADDRENDPCRC50x960x000x00x08
9、包14(数据包)设备返回0字节数据作状态响应DATA1DATACRC160xD20x0000包15(握手包)主机应答ACK0x4B2.1.4主机从新的地址获取设备描述符(第二次读取设备描述符)分配好地址后,主机就从新的地址获取设备描述符,如表5所示。由于设备返回的第一个设备描述符中声明了该设备的端点0最大包尺寸为16个字节(0x10),所以设备分2次把设备描述符经过端点0发送出去,第一次发送16个字节,第二次发送2个。最后主机发送0字节的数据包给设备作为传输装态应答。表 5 主机从新的地址获取设备描述符(第二次读取设备描述符)阶段包序号(包类型)数据内容建立包16(令牌包)主机向新的地址(地址
10、0x02)设备发送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(数据包)主机发出建立阶段的数据包(请求获取设备描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0001 0000 12000x072F包18(握手包)设备应答ACK0x4B数据包19(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包20(数据包)设备返回设备描述符(前16个字节)DATA1DATACRC160xD212 01 0001 DC 00 00 10 7104 6606 0001 00 000x42C6包21(握手包)主机应
11、答ACK0x4B数据包22(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包23(令牌包)设备返回设备描述符(后2个字节)DATA0DATACRC160xC300190FCA1包24(令牌包)主机应答ACK0x4B状态包25(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x020x00x15包26(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包27(握手包)设备应答ACK0x4B2.1.5主机读取配置描述符主机读取完设备描述符后就读取设备的配置描述符,如表6所示:表 6 主机读取配置描述符阶段包序号(包类
12、型)数据内容建立包1(令牌包)主机向默认地址(地址0)设备发送建立包SETUPADDRENDPCRC50xB40x020x00x15包2(数据包)主机发出建立阶段的数据包(请求获取设备描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0002 0000 09000x7520包3(握手包)设备应答ACK0x4B数据包4(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包5(数据包)设备返回设备描述符DATA1DATACRC160xD209 02 2E 00 01 01 00 60 010xA01E包6(握手包)主机应答ACK0x4B
13、状态包7(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x020x00x15包8(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包9(握手包)设备应答ACK0x4B2.1.6主机读取描述符集合主机除了读取设备描述符和配置描述符外,还有读取接口描述符和端点描述符。在这里主机使用再次读取配置描述符的方法来实现。注意这里请求的字节数为0xff,如表7所示。表 7 主机读取描述符集合(配置、接口、端点描述符)阶段包序号(包类型)数据内容建立包16(令牌包)主机向新的地址(地址0x02)设备发送建立包SETUPADDRENDPCRC50xB40x0
14、20x00x15包17(数据包)主机发出建立阶段的数据包(请求获取设备描述符GET_DESCRIPTOR)DATA0DATACRC160xC380 06 0002 0000 FF000x9725包18(握手包)设备应答ACK0x4B数据包19(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包20(数据包)设备返回设备描述符(第一组16个字节)DATA1DATACRC160xD209 02 2E 00 01 01 00 60 01 09 04 00 00 04 DC A00x5C5E包21(握手包)主机应答ACK0x4B数据包22(令牌包)主机读取数据INADDR
15、ENDPCRC50x960x020x00x15包23(令牌包)设备返回设备描述符(第二组16个字节)DATA0DATACRC160xC3B0 00 07 05 81 03 04 00 0A 07 05 01 03 04 00 0A0A1BF包24(令牌包)主机应答ACK0x4B数据包22(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包22(令牌包)设备返回设备描述符(剩余字节)DATA0DATACRC160xD207 05 82 02 40 00 0A 07 05 02 02 40 00 0A0xC515包22(令牌包)主机应答ACK0x4B状态包25(令牌包
16、)主机发送状态响应OUTADDRENDPCRC50x870x020x00x15包26(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包27(握手包)设备应答ACK0x4B2.1.7主机设置配置主机读取完描述符后,就需要对设备进行配置,使得设备从地址状态进入配置状态,如下表8所示:表 8 主机设置配置阶段包序号(包类型)数据内容建立包10(令牌包)主机向0x02地址发送建立包SETUPADDRENDPCRC50xB40x020x00x15包11(数据包)主机发出建立阶段的数据包(请求设置配置)DATA0DATACRC160xC300 09 01 00 00
17、00 00 000xE4A4包12(握手包)设备应答ACK0x4B状态包13(令牌包)主机要求读取传输状态INADDRENDPCRC50x960x020x00x15包14(数据包)设备返回0字节数据作状态响应DATA1DATACRC160xD20x0000包15(握手包)主机应答ACK0x4B2.1.8主机读取配置状态主机设置完配置后,设备就可以使用。主机有时会对设备的配置状态进行读取,其工作数据如表9所示。表 9 主机读取配置状态阶段包序号(包类型)数据内容建立包16(令牌包)主机向地址0x02设备发送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(数据包)主机
18、发出建立阶段的数据包(请求获取设备配置)DATA0DATACRC160xC380 08 00 00 00 00 01 000xFC23包18(握手包)设备应答ACK0x4B数据包19(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包20(数据包)设备返回设备配置(设备配置值)DATA1DATACRC160xD2010x81FE包21(握手包)主机应答ACK0x4B状态包25(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x020x00x15包26(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包27(握手包
19、)设备应答ACK0x4B2.1.9主机读取接口状态在配置完成后,主机会对接口的状态进行读取,这和读取配置一样也是可选的,其数据传输如表10所示。表 10 主机读取接口状态阶段包序号(包类型)数据内容建立包16(令牌包)主机向地址0x02设备发送建立包SETUPADDRENDPCRC50xB40x020x00x15包17(数据包)主机发出建立阶段的数据包(请求获取接口状态)DATA0DATACRC160xC381 0A 00 00 00 00 01 000xBB13包18(握手包)设备应答ACK0x4B数据包19(令牌包)主机读取数据INADDRENDPCRC50x960x020x00x15包2
20、0(数据包)设备返回接口状态(接口描述符编号)DATA1DATACRC160xD2000x02FD包21(握手包)主机应答ACK0x4B状态包25(令牌包)主机发送状态响应OUTADDRENDPCRC50x870x020x00x15包26(数据包)主机发送0字节数据作状态响应DATA1DATACRC160xD20x0000包27(握手包)设备应答ACK0x4B3关于SL811HS接口芯片SL811HS是Cypress公司的嵌入式主机或外设接口控制器,支持USB1.1的全速和低速设备,提供USB主机的硬件接口及总线管理的物理机制,带有在片的SIE、USB发送器、256字节RAM以及在片的根集线器
21、。除了8位的数据/地址总线外,有读、写、片选、复位及中断输出信号端口,控制方便。4嵌入式USB主机设计4.1硬件设计选用廉价的51系列单片机(89C52)控制USB主机接口芯片SL811HS,同时,通过MAX232芯片与PC机通信。硬件接线示意图如下所示:图 1 硬件接线示意图4.2软件设计下面将从底层到高层详细地介绍本系统的软件设计。4.2.1单片机读写SL811HS4.2.1.1读取SL811HS内存的数据根据SL811HS的读写时序要求,读取数据前首先发送地址:void SetHostAddress(char AddressP)P_BUS=AddressP;/*数据总线发送地址,但此时地
22、址还不会被SL811HS接收*/P_CTRL=0x90;/*设置总线控制信号为SL811HS接收地址信号,具体含义如下所示:*/*P_CTRL;0x90,98,F0P_CTRL.0; -P_CTRL.1; -P_CTRL.2; -A0; 010nRST; 111nCS; 001nWR; 001nRD; 111*/nWR=1;nCS=1;/*地址传输完毕后,关闭片选、写等信号*/P_CTRL=0xF0;地址发送完毕之后,SL811HS就接到了需要读取的内存单元地址(包括寄存器的地址)。紧接着单片机就可以读取数据:unsigned char HostRead(void)A0=1;/* 满足SL81
23、1HS的时序要求,先保证A0和nCS的有效*/NCS=0;P_CTRL=0x58;/*设置控制位信号,读取SL811HS内的数据*/*P_CTRL;0x90,58,F0P_CTRL.0; -P_CTRL.1; -P_CTRL.2; -A0; 010nRST; 111nCS; 001nWR; 011nRD; 101*/return P_BUS;/*函数返回读取的SL811HS内存的数据*/4.2.1.2写入数据到SL811HS内存与读数据类似,单片机要往SL811HS的内存单元写数据时,也要首先发送地址,然后再发送要写入的数据。为了简便起见,写数据过程中发送地址和数据的功能都放在一个函数中执行。
24、Void HostWrite(char HostWriteAddress, char WriteConstent)/*参数HostWriteAddress输入要写入数据的SL811HS内存的地址,WriteConstent为要写入的地址*/P_BUS=HostWriteAddress;/*准备好需要发送的地址*/P_CTRL=0x90;/*P_CTRL;0x90,98,F0P_CTRL.0; -P_CTRL.1; -P_CTRL.2; -A0; 010nRST; 111nCS; 001nWR; 001nRD; 111*/nWR=1;nCS=1;P_BUS=WriteContent;/*准备好需
25、要发送的数据*/P_CTRL=0x98;/*重新安排好控制信号,发送数据*/P_CTRL=0xF4;4.2.1.3读写批量数据有时单片机和SL811HS之间要进行批量数据的传输,为方便操作,设计了能够批量进行数据读或写的函数:/*批量写*/void HostBulkWrite(char addr, unsigned char *s, char c)/*参数addr为SL811HS中写入数据的起始地址,*s为单片机内存放的需要写入的数据缓冲区,c为总共要写入的字节数*/if(c<=0) return;while(c-)HostWrite(addr+,*s+);/*批量读*/void Hos
26、tBulkRead(char addr, unsigned char *s, char c)/*参数addr为SL811HS中读取数据的起始地址,*s为单片机内存放读取来的数据的数据缓冲区,c为总共要读入的字节数*/if(c<=0) return;while(c-)SetHostAddress(addr+);*s+=HostRead();4.2.2阶段USB传输的实现4.2.2.1 SL811HS的初始化初始化主要是对SL811HS的部分内部寄存器进行设置:Void SL811HS_Init(void)HostWrite(IntEna,0x20);HostWrite(CSOFcnt, 0
27、xAE);HostWrite(CtrlReg, 0x08);HostWrite(CtrlReg, 0x00);HostWrite(CSOFcnt, 0xAE);HostWrite(CtrlReg, 0x08);DelayMs(10);HostWrite(CtrlReg, 0x00);DelayMs(1);HostWrite(IntStatus, 0xFF);4.2.2.2三种阶段USB传输的实现三种阶段USB传输都可以由这个函数(下称“阶段传输实现函数”)实现:void USB_Transaction(unsigned char PID, unsigned char EP_Address, u
28、nsigned char Address, int Length, char *pDataBuf);4.2.2.2.1发送或接收前的准备工作4.2.2.2.1.1设置EP0Status寄存器本设计涉及到了多种阶段的USB传输,但这里需要考虑的只有3种,分别是建立(SETUP)、数据输入(IN)和数据输出(OUT)阶段。阶段传输实现函数的输入参数中,PID就是用来区别这3种传输阶段。#define PID_SETUP 0x2D#define PID_IN 0x69#define PID_OUT 0xE1阶段传输实现函数的第二个需要输入的参数就是端点号EP_Address,大小为1字节(实际只有低
29、4位有效,高4位为0),类型为unsigned char 。U盘等类似的USB Mass Storage类设备一般具有3个端点:一个是端点0,用于处理控制传输;另一个是批量输出Bulk_OUT端点,该端点用于接收主机发来的批量数据,端点号有设备定义;还有一个就是批量输入Bulk_IN端点,用于给÷向主机发送批量数据,其端点号也由设备定义。从硬件角度来讲,程序需要把PID和EP_Address组合在一起后写入EP0Status寄存器。unsigned char PID_EPA;/*用于储存PIN和EP_Address的组合值*/PID_EPA=PID&0x0F;/*PID的高4
30、位位校验码,低4位为有效值*/PID_EPA=(PID_EPA<<4)+EP_Address;/*按照EP0Status寄存器的要求合并PID和EP_Address*/HostWrite(EP0Status,PID_EPA);4.2.2.2.2设置EP0Counter寄存器阶段传输实现函数的第三个需要输入的参数是设备的地址Address,大小为1字节,类型为unsigned char。HostWrite(EP0Counter,Address);/*设备地址的D7位值为0,D6D0位代表地址*/4.2.2.2.3设置EP0XferLen寄存器第四个参数是发送或接收的数据的长度Leng
31、th,大小为2字节,类型为int。这个长度还需要和相应端点的最大包尺寸MaxPacketSize进行比较。如果Length小于MaxPacketSize,就说明需要发送或接收的数据长度比相应端点的最大包尺寸还小,因此,主机和该端点之间只要进行一次数据传输就可以实现数据的发送或接收。反之,如果Length大于MaxPacketSize,那么就需要将发送或接收的数据进行分割,第一批发送或接收的数据长度就是MaxPacketSize,剩下的数据就利用 SL811HS的“乒乓”机制进行发送。最后需要把实际要发送的数据长度写入SL811HS的EP0XferLen寄存器中。/*定义变量CurentLeng
32、th,用于保存当前需要发送的数据长度*/if(Length>MaxPacketSize)CurrentLength=MaxPacketSize;elseCurrentLength=Length;HostWrith(EP0XferLen,(unsigned char)CurrentLength);/*注意这里的变量类型转换*/4.2.2.2.4设置EP0Address寄存器最后一个需要确定是发送或接收数据的缓冲地址*pDataBuf,大小为1字节。在这里pDataBuf是指向单片机内存单元的指针,但实际读写数据是要以SL811HS的数据缓冲区作为中介的。为加快数据传输,把SL811HS的数
33、据缓冲区分成两部分:SL811HS_Buf0和SL811HS_Buf1。SL811HS_Buf0的起始地址就可以定为0x10。而SL811HS_Buf1的地址就根据端点最大包尺寸进行调整。Unsigned char SL811_HS_Buf0 0x10, SL811HS_Buf1;If(Length>MaxPackeSize)SL811HS_Buf1= SL811HS_Buf0+MaxPacketSize;HostWrite(EP0Address, SL811HS_Buf0);/*当前数据发送从SL811HS_Buf 0开始*/如果主机要发送数据给设备,就需要把*pDataBuf中的数据
34、复制到SL811HS的数据缓冲区中:HostBulkWrite(SL811HS_Buf0,pDataBuf,CurrentLength);如果是主机接收数据,那么在以下的处理中,就会把SL811HS缓冲区中的接收到的设备的数据通过HostBulkRead()函数复制到单片机的缓冲区中。HostBulkRead(SL811HS_Buf0,pDataBuf,CurrentLength);4.2.2.2.5启动发送或接收启动USB数据的发送或接收实际上是通过向SL811HS的EP0Control寄存器发送命令字CmdWord来实现的。首先,PID等参数的不同,CmdWord的值也不同,根据EP0Co
35、ntrol寄存器每一位的属性,有如下配置程序:unsigned char CmdWord;if(PID=PID_SETUP)CmdWord=0x03;/*控制传输的SETUP事务*/elseif(EP_Address=0)if(PID=PID_IN)CmdWord=0x47;/*控制传输的输入IN事务*/elseCmdWord=0x43;/*控制传输的OUT事务*/elseif(PID=PID_IN)CmdWord=0x07;/*批量传输IN事务*/elseCmdWord=0x03;/*批量传输OUT事务*/将CmdWord命令字发送到SL811HS的EP0Control寄存器后,就启动了数据
36、包的发送或接收了:HostWrite(IntStatus, 0xFF);/*清除中断状态位*/HostWrite(EP0Control, CmdWord);剩下的工作就是查询SL811HS的IntStatus寄存器,以查看发送或接收的完成情况,有需要时,最后还可以查看EP0status获取握手包的有关信息,但其实所有的握手包信息都是有硬件自动完成的。4.2.3事务USB传输的实现4.2.3.1控制传输包含了三个阶段:建立阶段、可选数据阶段以及状态阶段。Void Control_Transfer(pRequestCMD RequestCMD, unsigned char* pDataBuf_x)
37、;4.2.3.1.1建立阶段的实现任务就是发送建立的8字节请求命令,命令的数据结构为(注意该段定义是放在Control_Transfer()函数之外的):typedef structunsigned char bmRequest Type;unsigned char bRequest;unsigned int wValue;unsigned int wIndex;unsigned int wLength;REQUESTCMD,*pRequestCMD;在这里只需调用一次USB_Transaction()函数即可:USB_Transaction(PID_SETUP, 0 , Device_Add
38、ress, 0x08, (char *)RequestCMD);/*发送的令牌为PID_SETUP,端点号为0,设备地址为Device_Address,发送数据长度为8字节,发送内容为相应的请求命令*/4.2.3.1.2可选数据阶段的实现注意数据传输方向,实现过程如下:if(RequestCMD->wLength)if(RequestCMD->bmRequestType & 0x80)/*判断为PID_OUT*/USB_Transaction(PID_OUT, 0, Device_Address, RequestCMD->wLength, pDataBuf_x);el
39、se/*判断为PID_IN*/USB_Transaction(PID_IN, 0, Device_Address, RequestCMD->wLength, pDataBuf_x);4.2.3.1.3状态信息阶段的实现在需要时(如可选数据阶段为IN),主机发送控制传输的状态信息:USB_Transaction(PID_OUT, 0, Device_Address, 0, pDataBuf_x);4.2.3.2批量传输类似与控制传输中的可选数据阶段,有两个函数,分别对应于批量传输IN和批量传输OUT:void Bulk_Transfer_IN(int Length_bi, unsigned char* pDataBuf_bi)USB_Transaction(PID_IN,EP_Bulk_IN,Device_Address, Length_bi, pDataBuf_bi);void Bulk_Transfer_OUT(int Length_bo, unsigned char* pDataBuf_bo)USB_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学防火灾安全教育课件
- 2025年考研经济联考真题及答案
- 2025年浙江科学一模试卷及答案
- 注塑新手技术员培训课件
- 垃圾回收与内存安全
- 幼儿园小班年级安全教案课件下载
- 2025年南开物理一模试卷及答案
- 安徽艺术统考真题及答案
- 《小学英语四年级上册Unit 5 第2课时》教案
- 四川省南充市西充中学2025-2026学年高二上学期12月月考物理试题(无答案)
- 《经济法实务》课程教学大纲
- 自建房楼层使用权转让合同样本
- 芳烃联合装置储运操作规程20130921
- 广东省工程勘察设计服务成本取费导则(2024版)
- CNAS GL027-2023 化学分析实验室内部质量控制指南-控制图的应用
- 《汽车文化(第二版)》中职全套教学课件
- 生命伦理学:生命医学科技与伦理 知到智慧树网课答案
- 23秋国家开放大学《汉语基础》期末大作业(课程论文)参考答案
- 南京财经大学国际经济学期末复习资料
- 关于建立英国常任文官制度的报告
- 世界近代史超经典课件(北京大学)全版
评论
0/150
提交评论