




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IIAbstractUSBisastandardexternalbususedtoregulatetheconnectionandcommunicationbetweenacomputerandotherexternaldevices.Ithastheadvantagesofreliabletransmission,convenientandquicktransmission,fasttransmissionrateandmultipletransmissionmodes,soitiswidelyusedinvariousequipment.Inthispaper,fortheUSBdatacommunicationmodein-depthunderstandingofUSBcommunicationprocessandvariousconfigurationdescriptorstosettheprocessandachieveUSBtransmissionprotocolbasedonMCUsystem.UsingUSBbigdatabatchtransmissionanddoublebufferbatchtransmissionmode,usingthe32-bitmicrocontrollertodesigntherelevantcircuitandcompletetheequipmentUSBenumerationandtransmissionprogramwriting,usingthecomputerastheuppercomputer,callinglibusBlibrarytocompletethewritingoftheuppercomputerprogram,andwiththemicrocontrollertocompletetheUSBcommunicationprotocol.Keywords:USBmicrocontrollerbulktransmission目录摘要 IAbstract II第1章绪论 11.1课题背景及现研究概况 11.2结构流程 11.3主要功能 11.4评价数据采集系统性能优劣的标准 21.5本文完成的主要工作内容 21.6小结 2第2章USB协议 32.1USB协议编码格式 32.2USB2.0通讯协议 32.3包的组成 32.4事务的组成 52.5传输的组成 62.6设备枚举 6第3章单片机硬件设计 123.1时钟电路 123.2复位电路 123.3稳压电路 123.4USB电路 133.5BOOT电路 133.6整体原理图 14第4章单片机编程设计 154.1单片机模块 154.2USB外设功能 154.3USB相关寄存器介绍 154.3.1USB控制寄存器(USB_CNTR): 154.3.2USB中断状态寄存器(USB_ISTR): 154.3.3USB设备地址寄存器(USB_DADDR): 164.3.4USB分组缓冲描述表寄存器(USB_BTABLE): 164.3.5USB端点寄存器(USB_EPnR): 164.3.6USB缓冲区描述表寄存器: 164.3.7双缓冲批量端点: 174.4USB设备编程 174.5代码结构和流程 184.5.1代码结构 184.5.2代码流程 19第5章上位机设计 22第6章安装电脑USB驱动 24第7章调试结果 257.1设备枚举 257.2数据的传输速率 257.3通过串口打印主机给设备发送的数据 267.4批量输入数据 277.5数据的正确性 277.7采集通道数 297.6结论 30致谢 31参考文献 32附录 33 PAGE20USB接口的数据采集单元设计第1章绪论1.1课题背景及现研究概况目前随着信息时代的进一步发展,大量的数据成为这个时代的标志,由于需要处理采集大量数据,数据采集等相关技术也应运而生并快速发展。在大规模工业生产中,及时采集工业数据,并实时进行控制调配,可以极大的减少工业生产中不必要的浪费,大大的提高生产效率,在需要大量数据的科学实验中,实时采集数据,保证数据的连续性可靠性是获得科学客观实验结果的保证,在生活安全领域中,对视频,音频等信号的采集极大保障了我们的生活安全。总而言之,数据采集已经逐渐的融入到我们生产生活的方方面面。国内外各企业也争先设计制造出各种数据采集单元,可以满足各种不同的需求,大大扩展了我们的选择空间。USB是一种标准的外部总线,用于标准化各种设备主机的数据连接和数据通信。USB通用接口支持插件和热插拔等功能。该接口最多可连接127个外部设备。USB于1994年底由英特尔和其他公司联合设计,并于1996年推出。经过多年的发展,它已经成功地取代了原来的串行接口和并行接口。已成为当今电脑等智能设备的必配接口。USB标准也不断更新换代,由原来的USB1.0标准到USB2.0标准,现在已经发展到USB4.0标准。传输速率也在更新换代中得到了极快的发展。1.2结构流程数据采集是指自动采集由设备测量并传输至控制单元进行分析的模拟或数字信号。控制单元再将数据进行处理,做出相应的操作的过程。传感器数据采集与处理执行器传感器数据采集与处理执行器图1-1结构流程1.3主要功能数据采集单元一般具有以下功能:按照采样周期,对模拟、数字、开关信号采样,对模拟信号进行处理转化成所需要的信号,将转化后的数字信号通过各种传输协议发送给计算机等上位机,上位机再对信息再处理,控制输出设备输出。传输协议一般包括USB、485、232、以太网、各种无线网络等传输方式。USB数据采集卡就是基于USB传输协议。常见的USB数据采集卡有视频,音频,数字/模拟信号的采集等。本毕设就是基于USB传输协议,完成一个USB传输通信协议。1.4评价数据采集系统性能优劣的标准标准主要分为以下几个部分:系统的采样精度:测量值和真实值之间的偏差大小。系统的采样速度:在一定时间内最多可以采集多少字节的数据。采样的通道数:数据采集卡最多可以完成的几路的数据来源。采样的量程:可采信号的范围,例如可采集电压的范围等等。1.5本文完成的主要工作内容本文主要完成的工作内容包括:完成STM32F103C6T6的硬件设置连接。完成单片机内部的USB通信协议的编写。完成电脑上位机USB通信协议的编写。1.6小结本章主要介绍数据采集单元的发展现状,以及有关数据采集单元的功能特性和性能判定标准,以及本毕设主要是根据USB传输协议,利用单片机完成一个USB通信协议的编写。第2章USB协议2.1USB协议编码格式采用的是D+和D-两根数据线传输方式,采用的是NRZI数据编码方式。NRZI编码方式规定遇到信号0的边缘反转信号,遇到信号1的边缘保持原来信号。如下图2-1所示:0010001NRZI编码源码图2-1USB协议编码格式2.2USB2.0通讯协议协议就是类似于让两个不同语言的人进行沟通的一种约定,就像一个中国人,一个外国人,这两个人在不会彼此语言的前提下是无法正常畅通的交流,那么此时就需要一个约定来规定这两个人的语言,例如一个人在一秒钟内写一个1代表同意,在一秒内写一个0代表不同意,那么这样这两个不同语言的人就可以进行简单的交流沟通了。这只是个小例子,真正的协议远远比这个复杂的多。USB通信协议主要是由包、事务、传输构成,由包构成事务,再由事务构成传输。整体的架构如图2-2所示: 包包事务传输图2-2整体架构2.3包的组成包是组成USB通信的基础,是USB通信传输的基础。包是由SOP包开始信号,SYNC同步域信号、PacketContent、EOP包结束信号构成。其中PacketContent又由Token令牌包、Data数据包、Handshake握手包、Special特殊包构成。Token令牌包:IN令牌包、OUT令牌包、SETUP包、SOF包构成。Data数据包:DATA0数据包0、DATA1数据包1、DATA2数据包2、MDATA数据包构成。Handshake握手包:ACK应答、NAK包、STALL包、NYET包。Special特殊包:PRE包、ERR包、SPLIT包、PING包。区别一个包是Token令牌包、Data数据包、Handshake握手包还是Special特殊包了,那么就要看包的内容。PacketContent包的内容大体分为:PID标识域、ADDR地址域、FRAM帧号域、DATA数据域、CRC校验域。PID标识域:用来标识包的种类,占1个字节,8位二进制数,其中低四位为包标识,高四位为低四位取反,用来检验包标识。具体标识如表2-1所示表2-1包标识包类型包的种类取值功能令牌包OUT0001B主机向设备发送数据IN1001B设备向主机发送数据SOF0101B帧起始SETUP1101B控制传输数据包DATA00011B不同类型的数据包DATA11011BDATA10111BMDATA1111B握手包ACK0010B接收端确认接收NAK1010B接收端不能接收数据,或发送端无法发送数据STALL1110B挂起,控制传输请求不被支持NYET0110B为准备好接收下个数据包(高速模式下)特殊包PRE1100B前导ERR1100B错误SPLIT1000B分裂事务PING0100BPING测试ADDR地址域:用来标识设备地址,代表设备在主机上的地址,7位设备地址。地址0000000为零地址,主机在枚举过程中,先向设备地址0发起通信,确认设备后会重新分配一个设备地址给设备。ENDP端点域:用来标识USB设备的端点号,4位端点地址,所以一个USB设备最多由16个端点构成。每一个USB设备都必须有一个控制端点,用来进行控制传输。FRAM帧号域:每一个帧都有一个标号,11位帧号域,主机每次发送一帧帧号自动加一,达到最大值时0x7FF时,重新计数。DATA数据域:真正用来传输数据的包,不同传输用到数据包字节数不同,最大1024字节,DATA数据包传输时会不停的反转,DATA0数据包0和DATA1数据包1交替发送,可以保证数据传输的正确性。CRC校验域:用来检验数据发送的正确性。下面就是一个完整的OUT/IN/SETUP包,如表2-2所示:表2-2OUT/IN/SETUP包标识SOP包开始信号SYNC同步域信号8位PID包标识7位ADDRESS设备地址4位ENDP端点号5位CRC校验EOP包结束信号一个完整SOF包,如表2-3所示:表2-3SOF包标识SOP包开始信号SYNC同步域信号8位PID包标识11位帧号5位CRC校验EOP包结束信号一个数据包,如表2-4所示:表2-4数据包标识SOP包开始信号SYNC同步域信号字节0字节1字节n16位CRC检验EOP包结束信号一个握手包,如表2-5所示:表2-5握手包SOP包开始信号SYNC同步域信号PID包标识EOP包结束信号2.4事务的组成事务由各种包组成,然后传输由多个事务组成。每个事务最多有三个步骤:令牌阶段、数据阶段和联系阶段。所有事务信息都以指示事务类型的令牌包开始。在数据阶段,设备和主机发送相应的数据内容。在联系阶段,主机和设备在联系数据包中发送相应的状态信息。2.5传输的组成传输有四种模式:控制传输、中断传输、同步传输、控制传输。控制传输:使用在主机枚举设备的过程中,当设备连接到主机时,主机需要获取设备的设备信息,如设备是什么设备,hid设备,U盘等,同时获得设备的端点数以及端点的属性,同时主机会给设备分配一个唯一的设备地址,用来后续相关数据通信。批量传输:一般用于对时间延时要求不严格,但需要传输大量数据的传输,例如U盘等存储设备。中断传输:一般用于小数据,对时间延时有要求的设备,主机会在规定时间段内,访问设备,例如鼠标,键盘,游戏手柄等。同步传输:一般用于对可靠性要求不高,但对实时性有要求的设备,例如摄像头,USB话筒音响等。本次设计需要大数据传输,因此采用控制传输和批量传输。其中,控制传输用于枚举单片机模拟的USB设备,获取相关设备信息,批量传输用于传输数据2.6设备枚举设备枚举主要通过USB传输中的控制传输,当设备通过USB接口连入主机时,主机通过枚举获得设备的信息参数。枚举的主要过程如表2-6所示:表2-6枚举过程供电复位获取DeviceDescriptor设备描述符复位分配设备地址获取ConfigurationDescriptor配置描述符(前九个字节)获取ConfigurationDescriptor配置描述符(全部内容)设置配置设备描述符:一个设备只能有一个设备描述符。要用来描述该设备的端点0(控制端点)的最大包长,PID,VID和该设备共有多少种配置等。配置描述符:一个设备最少有一个配置描述符。来定义该设备配置中有多少个接口数。接口描述符:定义该设备接口中有多少个端点数。端点描述符:定义该设备端点的最大包长,所使用的传输类型及方向。主机在枚举设备时,并不会对接口描述符、端点描述符进行单独的获取,而是设备将接口描述符、端点描述符放置在配置描述符后,等主机第二次枚举设备配置描述符时,一次全部发送给主机。而真正的配置描述符只有9个字节,这就是为何枚举时主机会首先获取配置描述符的前九个字节的原因,再次获取配置描述符时,设备发送全部配置描述符,包括接口描述符,端点描述符。设备描述符和配置描述符都有自己的描述符类型数据取值,当设备获得数据之后就可以根据数据来判断主机是要获取描述符的类型。下面就是USB标准设备请求,如表2-7所示。采用控制传输由主机发送给设备的控制端点(端点0),一共8个字节,所以控制端点0最大包长的最小也需要8个字节。表2-7描述符类型域大小(字节)功能bmRequestType1D7位标识数据传输的方向0主机到设备1设备到主机D5~6位标识请求的类型0标准1类2厂商D4~0请求的接收者0设备1接口2端点bRequest111个标准请求类型wValue2由具体请求而定wIndex2由具体请求而定wLength2数据过程中所需的字节数bRequest:共有11个标准请求,本毕设中主要用三种请求,分别是SET_ADDRESS设置设备地址,取值为0x05,GET_DESCRIPTOR获取描述符(具体是什么描述符,还需要判断描述符的类型),取值为0x06,SET_CONFIGURATION设置配置,取值为0x09。SET_ADDRESS设置设备地址的格式,如表2-8所示:表2-8设置设备地址格式bmRequestTypebRequestwValuewIndexwLength0x000x05设备地址0x00000x000D7为0主机向设备发送数据,D5~6请求类型为标准请求,D0~4请求的接受者为设备。取值为0x05低字节为设备地址,同时采用小端结构,即低字节在先,高字节在后的方式。无无GET_DESCRIPTOR获取描述符的格式,如表2-9所示:表2-9获取描述符格式bmRequestTypebRequestwValuewIndexwLength0x800x06具体描述符类型编号0x0000描述符长度D7为1设备向主机发送数据,D5~6请求类型为标准请求,D0~4请求的接受者为设备。取值为0x06采用小端结构,即低字节在先,高字节在后的方式。第一个字节是索引号,第二个字节为描述类型的编号无描述符的长度描述类型编号:1表示设备描述符,2表示配置描述符,3表示字符串描述符,4表示接口描述符,5表示端点描述符。设备在接收到获取描述符后,再根据判断wValue值,确定主机具体要获取描述符的类型。索引号:用获取同一种描述符中具体每个描述符。例如在设备表述符种定义了不同字符串的索引值,主机在获取设备描述符之后,就可以根据设备定义的字符串索引值进行具体一个字符串的索引。SET_CONFIGURATION设置配置的格式,如表2-10所示:表2-10设置配置格式bmRequestTypebRequestwValuewIndexwLength0x000x09配置值0x00000x000D7为0主机向设备发送数据,D5~6请求类型为标准请求,D0~4请求的接受者为设备。取值为0x09低字节为设备配置值,同时采用小端结构,即低字节在先,高字节在后的方式。无无现在已经知道了枚举过程主机给设备所发数据的具体含义了,整个枚举的具体流程如图2-3所示:复位复位主机发送SETUP令牌包主机发送DATA0数据包(包含USB标准设备请求,设置设备地址)主机发送IN令牌包设备发送一个字节数为0的数据包设备准备好要发送的相应数据主机发送SETUP令牌包主机发送IN令牌包设备发送准备好的数据主机发送DATA0数据包(包含USB标准设备请求,获取设备描述符)设备发送一个字节数为0的数据包设备发送一个字节数为0的数据包主机发送IN令牌包设备配置相应的配置主机发送SETUP令牌包设备收到主机的返回的ACK包后在接启用新地址主机发送SETUP令牌包主机发送DATA0数据包(包含USB标准设备请求,获取配置描述符)设备准备好要发送的相应数据设备发送准备好的数据主机发送IN令牌包主机发送DATA0数据包(包含USB标准设备请求,设备配置)主机发送DATA0数据包(包含USB标准设备请求,设备配置)图2-3枚举具体流程到此设备的枚举过程完成。设备就可以和主机进行批量传输了。批量传输的具体过程:主机发送输入输出令牌,设备收到主机发送的输入输出指令后,发送相应的数据。如图2-4所示主机主机发送一个IN/OUT令牌包设备发送要传输的数据设备将要发送数据重新写入到数据缓冲区设备等待主机再次发IN/OUT令牌包图2-4批量传输流程第3章单片机硬件设计3.1时钟电路外部高速时钟通常需用8MHz的晶振,低速外部时钟通常采用32.768KHz的晶振。两侧电容保证频率更加稳定。如图3-1所示:图3-1时钟电路3.2复位电路单片机在上电时,由于电容的存在,会将复位引脚电平拉低,单片机复位。当用户按下按键时,复位引脚电平被接地拉低电平,单片机复位。如图3-2所示:图3-2复位电路3.3稳压电路本毕设中采用RT9193稳压芯片,将USB的5V电压转化为3.3V,提供稳定电压。电容滤除杂波,保证输出输入信号的稳定。C6电容为去耦电容,防止输入电流噪声影响,同时去除线路的寄生电感。如图3-3所示:图3-3稳压电路3.4USB电路采用USB全速模式,需要在D+外接一个上拉电阻,这样主机在枚举时,识别设备为USB全速设备。如图3-4所示:图3-4USB电路3.5BOOT电路本毕设中采用主闪存存储器作为启动区域,将BOOT0和BOOT1设置为低电平.如图3-5所示:图3-5BOOT电路3.6整体原理图整体电路原理图,如图3-6所示:图3-6整体电路原理图第4章单片机编程设计4.1单片机模块本毕设中使用的是STM32F103C6T6单片机,是一款基于ARM-M3核心的32位微控制器,共有48引脚,256K字节闪存存储器,时钟最快为72MHz,芯片自带USB外设,另外需要为USB外设配置48MHz时钟。4.2USB外设功能由于芯片自带USB外设,可以实现USB2.0全速通信,USB外设挂载在APB1总线上,同时此单片机为USB准备了一个专用的SRAM存储器,一共512字节用于数据的发送与接收,最多可用于16个单向或8个双向端点。USB模块实现了整个数据传输的格式,其中包括令牌包的检测,握手包的处理,包起始和同步域的识别,CRC检验和生成,设备ID的生成和检测,数据的处理。在数据传输完成后,USB模块将触发相应的中断,我们就可以通过读取有关寄存器的数值来判断是哪个端点,哪种传输类型触发的中断,然后在根据主机发送的相应数据,准备好发送或者准备好接收。三种类型的USB中断:USB低优先级中断(通道20):可由所有USB事件触发,如正确传输、USB重置等。USB高优先级中断(通道19):只能由同步或双缓冲批量传输正确传输事件触发。USB唤醒中断(通道42):由USB挂起唤醒事件触发。本毕设中设备使用的就是USB低优先级中断。所有的事件都是在USB低优先级中断中处理。4.3USB相关寄存器介绍USB寄存器主要分为三种:通用寄存器,端点寄存器,以及缓冲区描述表寄存器。通用寄存器用于定义USB的工作模式,有关中断的处理以及设备地址等设置。4.3.1USB控制寄存器(USB_CNTR):主要用于有关中断的使能和禁止以及对端点模式的控制,本毕设中主要使用开启CTRM(位15)正确传输中断,PDWN(位1)退出断电模式,以及FRES(位0)清除复位信号。4.3.2USB中断状态寄存器(USB_ISTR):主要用于判断是哪个中断源,当产生中断时就可以通过读取此寄存器来判断时哪个中断源,同时要注意清除相应的状态位。本毕设中主要使用CTR正确传输标志位(位15),RESET复位请求标志位(位10),DIR数据传输方向标志位(位4),EP_ID端点号(位3~0)。4.3.3USB设备地址寄存器(USB_DADDR):用于标识设备地址和USB模块的使能。其中EF模块的使能位(位7),ADD设备地址(位6~0)。4.3.4USB分组缓冲描述表寄存器(USB_BTABLE):用于定义分组缓冲区的起始地址,一般设置为0,即从0x40006000开始使用。4.3.5USB端点寄存器(USB_EPnR):主要用于有关端点的描述(端点类型:控制,批量,中断,同步端点),和相关端点正确发送和接收中断标志位以及接收发送状态码的设置。其中EP_TYPE(位9~10)位是设置端点类型编码,具体类型如下表4-1所示(本毕设中使用控制端点和批量端点)表4-1EP_TYPE描述EP_TYPE(位1~0)端点类型00批量端点01控制端点10同步端点11中断端点STAT_TX(位4~5)/STAT_RX(位12~13)状态类型编码,具体如下表4-2所示:表4-2STAT_TX/STAT_RX描述STAT_TX/STAT_RX状态类型00DISABLED01STALL10NAK11VALIDEP_KIND端点特殊类型位(位8):配合端点类型,用来定义端点的特殊类型,本毕设中设置成双缓冲端点。4.3.6USB缓冲区描述表寄存器:每一个端点是由4个相关寄存器构成,分别是发送缓冲区地址寄存器(用于标识发送缓冲区的地址),发送数据字数寄存器(用于标识要发送数据的字节数,双缓冲批量传输端点有两个此寄存器),接收缓冲区地址寄存器(用于标识接收缓冲区的地址),接收数据字节数寄存器(用于标识接收缓冲区的大小,双缓冲批量传输端点有两个此寄存器)。4.3.7双缓冲批量端点:用于提高数据传输速率。一般的批量传输是USB设备接收完数据后,再进行对数据的处理,而主机需要等待USB设备处理完数据后才可再次发送,而双缓冲开辟两个数据缓冲区,一个数据缓冲区用来接收或发送数据另一个数据缓冲区可同时对数据进行处理,改变原来先接收再处理的机制,从而可以加快数据的传输速率。另外,USB模块需要知道当前哪块缓冲区是用户在处理数据所使用的缓冲区,哪块缓冲区是USB模块所使用的缓冲区,这就需要两个缓冲区标识位,其中分别为USB端点寄存器的位6(DTOG_TX位)和位14(DTOG_RX位),具体标识如下表4-3所示(本毕设中使用IN端点为双缓冲端点):表4-3具体标识符DTOG_TX位DTOG_RX位USB模块使用缓冲区用户处理数据缓冲区IN01ADDRn_TX_0/COUNTTn_TX_0ADDRn_TX_1/COUNTTn_TX_110ADDRn_TX_1/COUNTTn_TX_1ADDRn_TX_0/COUNTTn_TX_0在使用双缓冲机制时,每次数据传输结束,硬件都会自动设置有关DTOG位(IN端点为DTOG_TX位,OUT端点为DTOG_RX位),同时用户需要在每次数据传输结束时,对另一个寄存器(IN端点为DTOG_RX位,OUT端点为DTOG_TX位)翻转。要注意的是此位写1为翻转。4.4USB设备编程1.配置USB模块所需的48MHz时钟,单片机采用HSE高速外部时钟,通常为8MHz,再通过倍频提升到72MHz,最后通过USB预分频将频率设置成48MHz,单片机上电默认配置完毕。2.强制复位。_SetCNTR(CNTR_FRES); //强制复位。3.开启USB模块,退出USB断电模式即配置USB控制寄存器(USB_CNTR)的PDWN(位1)。_SetCNTR(wInterrupt_Mask);//退出USB断电模式。4.清除复位标志即USB控制寄存器(USB_CNTR)的FRES(位0)和USB中断状态寄存器寄存器(USB_ISTR)中其他中断标志位。_SetCNTR(wInterrupt_Mask);//清除复位信号。SetISTR(0); //复位USB_ISTR寄存器 5.初始化USB控制寄存器和中断寄存器。USB_SIL_Init();//初始化ISTR,CNTR寄存器 。 6.设置复位回调函数,设置所使用的端点类型,端点最大包长,端点发送和接收缓冲区的地址,将端点0设置成控制端点,端点1设置成双缓冲批量输入端点,端点2设置为批量输出端点(输出,输入是相当于主机而言)。7.使能USB_DADDR寄存器EF位,主机枚举设备,在枚举过程中主机会给设备设置一个新设备地址,设备须将此地址写入到USB_DADDR寄存器中。SetDeviceAddress(pInformation->USBwValue0);//设置地址pInformation->USBwValue0为主机发送的新设备地址,同时SetDeviceAddress中已经调用了EF置位函数。_SetDADDR(Val|DADDR_EF);8.根据中断寄存器ISTR的中断标志位判断中断源,进行相应的数据传输。4.5代码结构和流程4.5.1代码结构使用标准寄存器库,加入相应的启动文件,完成单片机的编程所需需要库配置。如图4-1所示:图4-1库文件其中Start和Library中包含相关的启动文件和有关寄存器的定义,User_Library中则是有关USB传输所用到函数和有关USB寄存器的定义。如图4-2所示:图4-2User文件夹在User文件夹下,usb_zhongduan文件为有关中断处理相关,以及端点发送和接收数据的回调函数,下面是对此文件中使用到的函数简单说明:在批量输入的回调函数中USB_BUF_Write(ENDP1,bufferin0,bufferin1,64);//ENPD1为端点1,64为一次发送的包长,由于使用的是双缓冲机制,所以设置了两块缓冲区(bufferin0,bufferin1),这个接口中调用通过if语句判断此时所使用的缓冲区编号来确定现在USB模块所使用的缓冲区是哪块,同时设置了用户所使用的缓冲区反转函数,每次使用双缓冲传输后完成反转,同时在这个函数中调用WriteBuffer()函数,此接口是将数据写入到规定的发送缓冲区中,同时设置要发送的字节数,等待主机发送IN令牌包,等待设备接收到IN令牌包后自动发送处于发送缓冲区的数据。在批量输出的回调函数中,ReadBuffer()函数,此接口是将数据从规定的接收数据缓冲区中读出,GetEPRxCount()函数返回接收到字节数,Send_byte()函数是通过串口打印一个字节的数据。在判断中断源函数中,通过获取USB中断状态寄存区,再和具体中断源掩码取与,判断具体的中断源。判断出中断源后执行相应的中断函数。usb_dec文件中主要是设置了有关设备描述符,配置描述符,接口描述符,端点描述符,初始化函数以及复位中断的回调函数。usb_conf文件中主要设置了端点0,1,2接收发送缓冲区的地址。usb_data文件中主要设置的是双缓冲区要发送的数据,分别为bufferin[0],bufferin[1],只要把要发送的数据输入到这两个数据数组中,就可以完成数据的初始化。4.5.2代码流程在main函数中初始化USB外设所需的引脚(PA11,PA12),开启引脚所挂载的总线时钟,开启端口复用时钟,将引脚设置成复用推挽输出最大速度为50MHz,开启USB时钟,完成USB的引脚设置。GPIO_InitTypeDefgpio;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);gpio.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;gpio.GPIO_Mode =GPIO_Mode_AF_PP;gpio.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&gpio);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB,ENABLE);同时开启USB低级优先级中断,设置中断优先级分组1,设置抢占优先级为0,子优先级为0,完成中断的初始化。NVIC_InitTypeDefnvic;NVIC_SetPriorityGrouping(NVIC_PriorityGroup_1);nvic.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;nvic.NVIC_IRQChannelPreemptionPriority=0;nvic.NVIC_IRQChannelSubPriority=0;nvic.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic);最后调用USB初始化函数USB_Init()。在此函数中,主要是注册有关USB函数和调用初始化函数Init();pInformation=&Device_Info;pInformation->ControlState=0;pProperty=&Device_Property;//usb_prop.cpUser_Standard_Requests=&User_Standard_Requests;pProperty->Init();//调用初始化函数函数在usb_prop.c文件中。其中Init()函数中完成有关USB设备编程即初始化有关USB外设的相关寄存器和中断函数(具体内容见上文USB设备编程)。到此有关USB外设的初始化完成,现在只需等待主机发送信息给设备触发中断函数。触发中断函数,中断函数在usb_zhongduan文件中,先判断函数是正确传输中断还是复位中断。如果是复位的中断则调用复位函数Device_Property.Reset();复位USB并初始化相关的端点等(具体内容见上文USB设备编程)。如果是正确的传输中断,再调用正确传输中断的回调函数CTR_LP(); 在此函数中在进一步判断中断的具体类型,通过if与相应的中断掩码相与,判断是具体某个端点发生中断,若是端点0中断,再判断传输方向是IN,OUT还是SETUP,并调用相应的中断处理函数,若不是端点0中断先获取中断产生的端点号,并判断传输方向再调用相关的端点回调函数。IN,OUT,SETUP相应的中断处理函数在usb_core.c文件中,在SETUP令牌包中的中断函数中,将主机发送的令牌包解析出来(将bmRequestType,bRequest,wValue,wIndex,wLength解析并存储),判断主机令牌包的wLength数据长度,如果数据长度为0则执行NoData_Setup0();无数据的SETUP函数,如果数据长度不为0则执行Data_Setup0()(根据前面说明获取配置描述符有数据长度,设置地址和设置配置没有数据长度)。在NoData_Setup0()函数中,通过判断bRequest和wIndex获取主机需要的描述符类型,然后执行相应的函数,本毕设中主要是设置地址和设置配置,若为设置配置请求则再调用设置配置请求Standard_SetConfiguration(),若为设置地址请求则先判断地址是否已经被设置了,最后将0字节的数据写入到数据发送缓冲区等待主机IN令牌包(前面介绍了设置配置和设置地址,设备需要发送0字节的数据包作为回应)。调用设置配置请求Standard_SetConfiguration(),主要完成了有关非0端点的使能。在Data_Setup0()中,主要判断是获取哪种的描述符类型,并将相应的描述符写入相应的发送缓冲中,等待主机的IN令牌包。在控制端点0的IN中断函数中,调用SetDeviceAddress()函数将主机发送给设备的设备地址写入到相应的寄存器中,若为获取描述符的IN令牌包则调用DataStageIn();将更新数据缓冲区描述符数据。主要流程如下图4-3所示:初始化有关USB的相关设置初始化有关USB的相关设置触发中断判断中断源执行相关中断回调函数图4-3主要流程图第5章上位机设计采用C语言编程,利用官方libusb库,采用windows控制台的页面完成上位机的编写。1.主要流程:2.初始化USB。3.寻找总线,寻找上位机USB总线。4.寻找设备,寻找上位机所挂载的USB设备。5.遍历设备,通过遍历USB总线上的USB设备,与自己所定义的USB设备的PID,VID进行比较(本毕设中所定义的USB设备PID为0x0003,VID为0x8786),找到用户设备。6.打开设备,打开用户设备。7.声明接口,本毕设中使用接口0。8.进行批量读写操作。在进行批量读操作时,先获取当前系统时间,当读取1MB的数据后再次获取当前系统时间,两个时间相减得到传输1MB数据所需要的时间,即传输速率。9.为了防止修改USB设备ID后,上位机程序无法使用,做了一个数据接口,用户输入自己的USB设备ID后,然后再进行USB遍历。10.用户输入要读取数据的大小,通过循环读取规定大小的数据,计算求出读取速率。详细流程图如图5-1所示:usb_find_usb_find_devices();寻找usb总线;通过循环判断PID,VID遍历设备usb_init();初始化usb;usb_find_busses();寻找usb总线;输入设备的PID,VID;计算获得传输速率计算获得传输速率GetLocalTime()获得结束时间GetLocalTime()获得开始时间usb_bulk_read()usb_open(device);打开设备;usb_claim_interface(my_device,0);声明接口0;usb_open(device);打开设备;读或写usb_bulk_write()图5-1程序流程第6章安装电脑USB驱动设备的驱动程序,是指添加到操作系统中的特殊的程序,设备驱动程序包含有关硬件设备的相关信息,通过获得设备的相关信息能够使计算机与相应的设备进行数据通信。驱动程序是相关硬件制造商根据不同的操作系统编写的相关配置文件,如果电脑中没有相关的设备驱动程序,计算机就无法识别外部设备,因此计算机中的硬件就无法工作。本毕设中使用的自定义的hid设备,因此需要为计算机配置相关的驱动程序。由于使用的电脑是windows系统,所以要安装windows系统相应的USB驱动程序,通过官方网址下载相应的驱动程序,下载完成后,将单片机通过USB与电脑连接,安装运行驱动程序,选择自定义的USB设备,输入自定义设备的供应商编码和产品识别编码。具体过程如图6-1,图6-2所示:图6-1选择要配置的相应USB设备图6-2输入自定义设备的供应商编码和产品识别编码第7章调试结果7.1设备枚举主机枚举设备,设备发送提前准备好的枚举信息。通过端点0发送设备描述符。要发送的设备描述符如图7-1所示:图7-1主机枚举获得的数据上位机接收设备发送的描述符,如图7-2所示图7-2相关描述符通过对比,在单片机中设定的描述符,一个控制端点,两个批量端点,其中一个为输出端点,另一个为输入端点。和主机获得的设备描述符一致,设备枚举完成。7.2数据的传输速率通过批量传输每次获取64字节的数据,采用for循环,循环16384次,即为1MB的数据,再次通过for循环,循环用户设定的次数,即用户设定读取多少MB的数据。通过计算获取数据前后的时间差,计算求得相应的传输速率。先输入PID为3,再输入VID为8786,读取1MB数据,通过获得读取完数据的速率。再次获取3MB,5MB,7MB,9MB的数据,通过计算得出获得的读取数据平均约为0.7MB。如图7-3所示:图7-3数据传输速率7.3通过串口打印主机给设备发送的数据通过批量端点2,上位机发送从1到64共64字节的数据。下面是要发送的数据,如图7-4所示:图7-4通过批量端点要发送的数据通过主机的串口调试软件,选择115200的波特率。数据位为8位,1位停止位,无奇偶校验位。打印上位机传输过来的数据,打印数据如图7-5所示:图7-5打印数据7.4批量输入数据在单片机的USB双缓冲区中提前定义了所需要的数据。两个数据缓冲区中的数据入图7-6所示:图7-6所要发送的数据主机接收批量输入数据,如图7-7所示:图7-7打印数据7.5数据的正确性设备传输不同的数据给主机,主机打印出设备传输的数据。通过发送3组数据对比比较,主机获得的数据和设备传输的数据一致。具体数据如图7-8所示(上面的图为设备发送的数据,下面的图为主机接收的数据):图7-8设备发送的数据和主机接收到数据7.7采集通道数本毕设中采取的是双缓冲机制,采用一个输入端点,采集一路数据,这一路数据在传输的过程中,首先判断出当前程序所使用的USB数据缓冲区,然后将采集到的数据输入到数据缓冲区中。为了更好的模拟的采集数据的变化,每次在主机读取设备发送的数据之后,设置判断语句,判断当前程序所使用的数据缓冲区,通过将程序中数据缓冲区中的数据依次加1来模拟数据变化。由于使用了双缓冲机制,数据的变化并不会导致程序卡在数据变化的过程中,可以边传输数据边变化数据,这样的好处就是不会降低传输速率。要发送的数据如图7-9
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工作计划与工作总结内容对比
- 小学生英语拼读教学设计方案
- 睡眠质量与心理健康的关联研究-洞察及研究
- 航空测绘项目施工技术规范
- 义卖活动策划及执行详细方案
- 数字出版中的可持续发展策略研究-洞察及研究
- 文创产业数字营销策略及实施方案
- 边缘计算性能基准测试-洞察及研究
- 并购整合中的合同审查与修订-洞察及研究
- 制造业企业跨国并购案例研究-洞察及研究
- 城乡燃气管道维护保养技术方案
- 2025年西藏公开遴选公务员笔试试题及答案(A类)
- 水土保持治理工应急处置考核试卷及答案
- 初中学生心理健康辅导手册
- 工业园区储能项目商业计划书
- 仓库搬运安全培训内容课件
- 抗炎药物作用机制研究-洞察及研究
- 2025至2030中国航空保险行业项目调研及市场前景预测评估报告
- (2025年标准)吊篮移交协议书
- 中专院校普法课件
- 水泵检修基础知识培训课件
评论
0/150
提交评论