如何修改USB CDC成为自定义USB Bulk批量传输设备
如何修改USBCDC成为自定义USBBulk批量传输设备(精)

'C',0,
'T',0,
'I',0,
'O',0,
'N',0
};
4.修改USB处理过程
由于自定义的USB设备类没有CDC的Set Control Line State处理过程,修改virtual_com.c文件中start_transactions的定义,默认使能传输,或者删除与start_transactions变量相关的判断代码。
0x03, //iSerialNumber域,设备序号的字符串描述符索引:3
0x01 //bNumConfigurations域,该USB设备支持的配置数目:1个
};
2.修改端点描述符
端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点,一般一个设备只有一个控制端点为双向端口外,其它均为单向。端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址等。
0xFF, //bDeviceClass域,设备类代码,0xFF为自定义设备类
0x00, //bDeviceSubClass域,设备子类代码
0x00, //bDeviceProtocol域,设备协议代码(0x00表示不使用任何设备类协议0x20, //bMaxPacketSize0域,端点0支持最大数据包的长度:32字节
0xA2,0x15, //idVendor域,供应商ID (VID
0x0F,0xA5, //idProduct域,产品ID (PID
0x00,0x00, //bcdDevice域,设备版本号(采用BCD码
0x01, //iManufacturer域,供应商的字符串描述符索引:1
USB设备的Bulk模式驱动程序设计

USB设备的Bulk模式驱动程序设计引言通用串行总线(USB)是一种串行接口,具有自动配置能力和良好的兼容性,从而简化了计算机与外设的连接,被计算机外设硬件制造商广泛采纳。
USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,更适宜于高速数据传输。
USB设备支持打印机、扫描仪、数码相机等外设时,由于这些外设与主机间传输的数据量大,要求驱动程序采用Bulk模式进行高速数据传输。
USB设备驱动的整体结构USB设备驱动的整体结构包括如下五个主要部分:USB应用程序接口、USB设备驱动函数、USB中断服务程序、USB回调接口程序、USB标准事件处理程序。
图1 USB设备驱动程序的整体结构USB应用程序接口USB应用程序接口主要功能是对USB驱动器进行软硬件初始化、打开端口、关闭端口、读端口、写端口和端口控制操作。
当设备驱动器装入系统设备表时,I/O系统就调用该应用程序接口。
USB应用程序接口的一个例程所包含的函数:·USB_init( ) -- USB端口驱动函数的安装和初始化、硬件配置。
·USB_open( ) -- 打开USB端口。
·USB_close( ) -- 关闭USB端口。
·USB_read( ) -- 对USB端口进行读操作。
·USB_write( ) -- 对USB端口进行写操作。
·USB_ioctl( ) -- 对USB设备进行I/O控制操作。
USB设备驱动函数1、USB_init()-- 初始化USB端口USB_init函数初始化特定USB端口驱动器,进行软硬件配置。
初始化步骤如下:(1)将USB设备驱动器安装到I/O系统设备表中。
(2)获取USB控制器使用的中断号。
(3)获取各端口所需的系统资源,包括内存、信号量和消息队列。
(4)初始化USB驱动器数据结构与USB端口状态寄存器。
(5)启动USB标准事件处理程序。
usb批量传输原理

usb批量传输原理USB(Universal Serial Bus)是一种常见的数据传输接口,广泛应用于电脑、手机、相机等设备上。
USB批量传输是指通过USB接口同时传输多个数据包的技术,它能够提高传输速度,提升数据传输效率。
下面将详细介绍USB批量传输的原理。
USB批量传输是基于USB的Bulk传输类型而实现的。
Bulk 传输是一种高吞吐量的传输方式,用于传输大量的数据,其特点是传输速度较慢,但可保证数据的可靠性和完整性。
批量传输是在Bulk传输的基础上实现一次传输多个数据包的技术。
在USB批量传输中,需要有一个主机(通常是计算机)和一个或多个设备。
主机负责控制和管理数据传输,设备则按照主机的指令进行数据的发送和接收。
USB批量传输的原理如下:1. 握手阶段:主机通过发送控制命令来和设备建立连接,进行握手。
这个过程类似于USB的初始化过程,主机和设备交换一系列的控制信息,确认传输的方式和参数。
2. 数据传输阶段:一旦握手成功,主机就可以发送数据给设备或者从设备接收数据。
在数据传输阶段,主机将数据分成多个数据包,然后通过USB接口将这些数据包发送给设备。
设备接收到数据包后,进行解析并执行相应的操作。
3. 应答阶段:设备在接收到数据包后,通过设置一个特定的应答位来告知主机数据包是否成功接收。
主机接收到设备的应答后,可以继续发送下一个数据包。
4. 重传机制:如果设备在接收数据包时出现错误,或者数据包在传输过程中丢失,主机会发起重传的请求,重新发送丢失或错误的数据包,确保数据的完整性。
5. 传输完毕:当主机发送完所有的数据包后,会发送一个结束符号给设备,告知传输结束。
设备接收到结束符号后,可以进行相应的处理,然后通知主机传输完毕。
通过上述步骤,USB批量传输实现了高效的数据传输。
在实际应用中,主机和设备之间还可以进行其他的通信,如命令传输、状态传输等,以实现更多的功能。
需要注意的是,USB批量传输的速度受限于设备的性能和USB接口的版本。
USB设备Bulk配置描述符

/* iConfiguration 大小为1字节。描述该配置的字符串索引值。0表示没有字符串 */
/********************************功能描述符************************************/
// 0x01, /* 配置描述符子类型 */
// /* bDescriptorSubtype 大小为1字节。表示描述符类型,调用管理功能描述符 */
// 0x00, /* 描述设备的能力 */
// /* bmCapabilities 大小为1字节
// 0x24, /* 配置描述符类型 */
// /* bDescriptorType 大小为1字节。表示描述符类型,CS_INTERFACE编码固定为0X24 */
// 0x02, /* 配置描述符子类型 */
// /* bDescriptorSubtype 大小为1字节。表示描述符类型,Abstract Control Management desc */
D7保留必须置为1
D6表示供电方式 1自供电 0总线供电
D5表示是否支持远程唤醒 1支持
D4-D0保留 必须置为0
*/
0x64, /* 设备所需要的电流 单位:200mA */
/* bMaxPower 大小为1字节,表示设备需要从总线获取的最大电流量 */
/*********************抽象控制管理功能描述符**********************************/
// /*ACM Functional Descriptor*/
// 0x04, /* 描述符的长度 4字节 */
USB host 工作流程

USB枚举步骤USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态(Attached)和挂起状态(Suspend))。
Attached和Powered状态不难理解:当一个设备被正确插入到主机的USB接口时,就处于Attached(连接)的状态。
设备连接好了,USB主机识别了设备,同时没有对设备进行请求,USB 设备就处于Suspended(挂起)状态.下面步骤是Windows系统下典型的枚举过程,但是固件不能依此就认为所有的枚举操作都是按照这样一个流程行进。
设备必须在任何时候都能正确处理所有的主机请求.1. 用户把USB设备插入USB端口或给系统启动时设备上电这里指的USB端口指的是主机下的根hub或主机下行端口上的hub端口。
Hub给端口供电,连接着的设备处于上电状态。
2. Hub监测它各个端口数据线上(D+/D-)的电压在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。
当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。
hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口(全速、高速设备的区分在后面的章节中描述)。
检测到设备后,hub继续给设备供电,但并不急于与设备进行USB传输。
3. Host了解连接的设备每个hub利用它自己的中断端点向主机报告它的各个端口的状态(对于这个过程,设备是看不到的,也不必关心),报告的内容只是hub端口的设备连接/断开的事件。
如果有连接/断开事件发生,那么host会发送一个Get_Port_Status请求(request)以了解更多hub上的信息。
USB设备Bulk配置描述符

/********************************设备描述符************************************/const uint8_t V irtua l_Com_Port_Devi ceDes cript or[]={0x12, /*描述符的长度 18个字节*/ USB_DEVIC E_DES CRIPT OR_TY PE, /*描述符类型 */0x00,0x02, /*本设备所使用的USB协议版本*/ 0xF F, /* 设备类代码:CDC */ /* 0x02->0x ff自定义设备*/0x00, /*子类代码*/ 0x00, /* 设备所使用的协议 */0x40, /*端点0 最大包长*/ 0x83, 0x04, /* 厂商I D = 0x0483 */ 0x40, 0x57, /* 产品ID = 0x7540 */0x00,0x02, /*设备版本号 = 2.00 */ 1, /*描述厂商的字符串的索引 */2, /* 描述产品的字符串的索引*/ 3, /*产品序列号索引*/ 0x01/* 可能的配置数*/};/********************************配置描述符************************************/const uint8_t V irtua l_Com_Port_Conf igDes cript or[]={ /*配置描述符*/ 0x09, /* 配置描述符的长度 9字节*/ /* b Lengt h 大小为1字节,表示该描述符的长度。
基于USB+CDC的虚拟以太网接口研究与设计

华中科技大学硕士学位论文
要单独的以太网控制器与外围接口,增加以太网接口必然使系统成本的增加与产品 尺寸扩大。如何使用 USB 接口来虚拟以太网接口不仅具有研究意义,也有广泛的现 实需求。
一种基于 USB 通讯设备类协议 CDC(Communication Devices Class Specification) 的 技 术 就 可 以 将 USB 虚 拟 成 不 同 的 通 讯 设 备 接 口 , 其 中 的 以 太 网 控 制 模 型 ECM(Ethernet Networking Control Model)与以太网仿真模型 EEM(Ethernet Emulation Model)可以将其虚拟为一个标准的以太网接口[3][4]。自从 USB CDC 规格发布以来, 国外的软硬件公司都使用 USB CDC 在 USB 上实现一些通讯接口的功能,如串口, ISDN,ATM,以太网等。Microsoft 在 WINXP 版本上内置了基于 CDC 的 RNDIS 驱 动,使得在 WINXP 下可以无缝的连接基于 RNDIS 的 USB 以太网接口设备。Linux 在 2.6 以后的版本就缺省支持基于 CDC 的以太网接口(usbnet)与串口。在 Linux 内核中,usbnet 模块用于创建 USB 虚拟以太网设接口。创建成功后,这一虚拟网络 接口便可以如同标准网络接口一样被指定一个 IP 地址。USB 电缆连接上后,usbnet 模块便能使 USB 虚拟的以太网接口 ping 测其它 IP 地址,甚至“谈论”DHCP,HTTP, NFS, telnet, 和 ftp[5]。简言之,任何在实际的以太网接口上运行的应用将不折不 扣地在 USB 虚拟以太网接口上得到实现,因为它们不能分辨出其正在使用的是真实 的以太网硬件接口还是 USB 虚拟的以太网接口。
USB-CDC虚拟串口(VCP)收发数据

USB-CDC虚拟串口(VCP)收发数据用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。
此功能方便用来作为程序的调试输出到电脑查看。
所用函数描述:(1)USB接口CDC发送数据CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)Buf: 传输的数据指针Len: 传输数据的长度(2)USB接口CDC接收数据CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)Buf: 接收的数据指针,不需处理Len: 接收数据的长度,需要处理示例:(1)打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。
/* USER CODE BEGIN PRIVATE_DEFINES *//* Define size for the receive and transmit buffer over CDC *//* It's up to user to redefine and/or remove those define */#define APP_RX_DATA_SIZE 64 //修改接收数据长度#define APP_TX_DATA_SIZE 64 //修改发送数据长度/* USER CODE END PRIVATE_DEFINES *//* USER CODE BEGIN PRIVATE_VARIABLES *//* Create buffer for reception and transmission *//* It's up to user to redefine and/or remove those define *//* Received Data over USB are stored in this buffer */uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];/* Send Data over USB CDC are stored in this buffer */uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];uint8_t DataLen; //定义接收数据长度变量/* USER CODE END PRIVATE_VARIABLES */(2)修改CDC_Receive_FS ()函数,添加接收数据长度的赋值:static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len){/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改!!!return (USBD_OK);/* USER CODE END 6 */}(3)修改main.c文件,先声明外部变量/* USER CODE BEGIN PV */extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量extern uint8_t DataLen; //声明接收数据长度外部变量/* USER CODE END PV */(4)编辑主循环函数,当按下按键时,发送HelloWorld到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64./* USER CODE BEGIN WHILE */uint8_t MyTxData[12] = "HelloWorld\n"; //定义字符串while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键{while(CDC_Transmit_FS(MyTxData, 12)); //发送字符串到电脑HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯HAL_Delay(20);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键 }if(DataLen > 0) //判断是否接收到数据{while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去DataLen = 0; //清除数据长度标记}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */。
STM32的USB例程修改步骤

STM32的USB例程修改步骤STM32的USB例程修改步骤以下是将ST的Custom_HID例程修改为“自定义USB设备”例程时总结出来的,因为刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正。
一、usb_desc.c文件根据你程序使用的通信方式修改。
usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小;ConfigDescriptor[SIZ_CONFIG_DESC]下添加需要处理的端点;根据需要添加或删除报告描述符(主要用于HID)和CDC 接口描述符(主要用于实现USB转串口)等。
具体方法可以下载个“电脑圈圈”使用D12编写的例子。
二、Usb_conf.h 文件:1、修改需要处理那些中断CNTR_CTRM处理数据正确传输后控制,比如说响应主机CNTR_DOVRM/* DMA OVeR/underrun Mask */CNTR_ERRM/* ERRor Mask */CNTR_WKUPM 0/* WaKe UP Mask */CNTR_SUSPM/* SUSPend Mask */CNTR_RESETM主要处理USB复位后进行一些初始化任务CNTR_SOFM/* Start Of Frame Mask */CNTR_ESOFM/* Expected Start Of Frame Mask */如:usb_conf.h中的#define IMR_MSK (CNTR_CTRM |CNTR_SOFM | CNTR_RESETM )是决定USB_CNTR寄存器中的那个USB相关中断启动还是屏蔽。
2、根据需要增加端点缓存地址,要根据缓存区的地址修改,防止数据重叠如下为根据每个缓冲区的大小为64字节修改:#define ENDP1_TXADDR (0xC0)#define ENDP1_RXADDR (0xD0)#define ENDP2_TXADDR (0x100)#define ENDP2_RXADDR (0x140)#define ENDP3_TXADDR (0x180)#define ENDP3_RXADDR(0x1C0)3、修改/* CTR service routines */下的EPX_IN_Callback和EPX_OUT_Callback。
usb cdc ecm原理

usb cdc ecm原理USB CDC ECM(Communication Device Class Ethernet Control Model)是一种基于USB接口的通信协议,用于将USB设备转换成以太网设备。
本文将介绍USB CDC ECM的基本原理和工作流程。
USB CDC ECM是一种通信设备类别,它允许USB设备通过USB接口模拟成一个网络适配器,使得计算机可以通过USB接口连接到以太网。
这种通信方式广泛应用于嵌入式系统和物联网设备中,可以方便地实现设备与计算机的数据传输和网络连接。
USB CDC ECM的工作原理如下:当USB设备插入计算机的USB接口时,计算机会自动识别设备并加载相应的驱动程序。
对于支持CDC ECM协议的USB设备,计算机会将其识别为一个网络适配器,并为其分配一个IP地址。
USB CDC ECM协议基于Ethernet控制模型,通过USB传输数据的方式模拟以太网协议。
USB设备与计算机之间的数据传输是通过USB 框架的控制和数据传输端点来实现的。
控制端点用于传输控制命令和状态信息,数据传输端点用于传输数据包。
在USB CDC ECM中,USB设备充当网络适配器的角色,它负责将计算机发送的数据包封装成USB传输协议,并通过USB接口发送给计算机。
USB设备还负责将从计算机接收到的数据包解析,并将数据提供给设备的应用程序处理。
USB CDC ECM协议的优势在于它的简单性和易用性。
与传统的以太网接口相比,USB接口更加普遍和方便,可以在各种设备上使用。
同时,USB CDC ECM协议也可以通过USB总线供电,无需额外的电源线,降低了设备的复杂度和成本。
在实际应用中,USB CDC ECM通常用于嵌入式系统和物联网设备中,例如智能家居设备、工业自动化设备等。
通过将设备连接到计算机,可以方便地进行数据采集、远程监控和设备管理。
USB CDC ECM是一种基于USB接口的通信协议,用于将USB设备转换成以太网设备。
如何修改USB CDC成为自定义USB Bulk批量传输设备

端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点 0(控制端点, 一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了 数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。 除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为 0, 它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大 包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它 来配置设备。
厂商自定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发操作系统端 的设备驱动程序,还要开发设备应用程序。
厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式(control transaction 控制传 输、bulk transaction 批量传输、interrupt transaction 中断传输、isochronous transfer 实时传 输),当然控制端点只能用控制传输。标准设备类可能只支持除了控制端点外的其中一种 传输方式,比如前面的 HID 实例,除了控制端点外,只支持中断传输,而由于中断传输有 其固有特点,有时并不能满足应用要求,如传输速率方面,由于决定因素在于中断时间, 但中断时间最快是 1ms,而批量传输可以随时发生(受带宽限制),理论上传输速率可以 比中断传输快。
标准设备类可能只支持除了控制端点外的其中一种传输方式比如前面的hid实例除了控制端点外只支持中断传输而由于中断传输有其固有特点有时并不能满足应用要求如传输速率方面由于决定因素在于中断时间但中断时间最快是1ms而批量传输可以随时发生受带宽限制理论上传输速率可以比中断传输快
如何实现自定义 USB Bulk 批量传输设备
OTG主机库在不同传输类型上对NAK的处理

OTG 主机库在BULK 传输上对NAK 的处理 问题:某客户使用STM32F4的OTG 库做USB 主机控制Wifi 网卡。
使用BULK 传输类型时,从数据读取数据时,如果设备返回需要把设备返回的NAK 状态告知上层应用,该如何修改OTG 库。
调研:先来看看OTG 库当前对BULK 类型传输,IN 和OUT 方向上的NAK 的处理方式:一旦重新使能该通道,主机硬件又自动发送IN 令牌来企图从设备获取数据,直到设备准备好数据后,不再回复NAK 握手,而是回复主机要获取的数据,然后主机硬件回复ACK 来结束本次transfer 。
BULK IN 通道对NAK 的处理和CTRL IN 通道对NAK 的处理,在ISR 中是一样的;但是在驱动库里,对CTRL IN 有超时限制,而对BULK IN 没有。
就是说对于常用来做枚举传输的CTRL 传输,当启动从设备获取信息,但是久久未得的情况下,会走到Timeout 的处理分支。
从代码里我们可以看到但是BULK IN 通道对NAK 的接收没有超时控制,因为BULK 传输本身的性质就是不保证带宽的,即如果主机上有很多其他优先级更高的周期类型的传输(同步ISO 传输和中断INT 传输),则在BULK 传输有可能无限延迟。
从代码里可以看到CTRL OUT 收到NAK 后会把该状态上传APP ,如图然后在库代码处理控制传输时,如果检测到这个状态,就会重新发送OUT 令牌和数据包,如图因此,当CTRL IN 收到NAK 后,如果想把状态上传给App ,则可以模仿CTRL OUT 对NAK 的处理。
首先, ISR 中的处理可以模仿CTRL OUT ,在BULK 传输的处理中,对每次发送IN 令牌的地方(USBH_BulkReceiveData )查询传输状态,如果URB_NOTREADY 就由App 来决定如何处理。
处理:基于U 盘读写的例程,在每次USBH_BulkReceiveData 之后检查状态,如果是URB_NOTREADY 就重新发送IN 令牌。
STM32F4全速USB虚拟串口VCP程序裁剪教程

这样以后,USB 接收的数据就可以在 app.c 中使用了,这里的接收的数据长度是 根据接收的数据不断清 0,并赋值的,所以可以根据 Rx_Length 大于 0,判断是 否有新的数Байду номын сангаас接收。
进一步下向下读程序,是打开了 USART2 的接收中断,通过 USART2 的接收中断接 收数据,并通过 VCP_DataTx(0,0)进行了数据处理,如下图 usbd_cdc_vcp.c 的 第 366 行到 379 行。
下面主要看看 VCP_DataTx(0,0)是怎么处理的,如下图所示是 usbd_cdc_vcp.c 的第 208 行到 228 行。是将通过 USART2 的中断接收的数据放进 APP_RxBuffer[] 中,这里的数组最大长度是 2048。
(4)主机在成功获取到一个数据包的设备描述符后并且确认无错误后,返回一 个 0 长度的状态数据包给设备。 (5)主机再对设备复位一下,接下来进入到设置地址阶段。 (6)USB 主机发出一个设置地址的请求,地址包含在建立包中。 (7)USB 设备在收到地址后,返回 0 长度的状态包。 (8)主机收到 0 长度的状态包之后,返回一个 ACK。 (9)设备在收到这个 ACK 之后,就可以启用新的地址了。 USB 一直进中断的原因:主机每 1ms 就给设备发送一个 sof,3ms 没反应主机就 挂起。所以一直进中断属于正常现象。
4>C/C++预定义: USE_STDPERIPH_DRIVER,STM32F4XX,USE_STM324xG_EVAL,USE_USB_OTG_FS 5>打开 USB_conf.h 文件,把 #define VBUS_SENSING_ENABLED 封掉,如果我们 不用 VBUS(PA9)。 否则不用封掉。 6>编译,下载,复位板子,并安装虚拟串口驱动(ST 官网上有),上面的步骤完 成后,计算机中的虚拟串口出来。如果不出来很可能是 D+和 D-的连线问题,请 检查下是否需要连接 ESD 和去耦电容。
如何修改stm32的USB例程为自己所用

如何修改STM32的USB例程为自己所用技术分类:微处理器与DSP | 2008-08-06作者:computer00EDN博客精华文章作者:computer00痛下决心一定要把USB的程序搞懂,也许表述有很多错误的地方,欢迎指正。
USB需要一个主机host和设备device。
USB设备和主机的通信需要先建立virtual pipeline,然后设备传回描述符给主机。
joystick 属于HID设备,工作在中断方式。
但并非通常单片机所谓的中断,而实际上是查询的方式。
USB采用NRZI编码,而且需要位填塞,但是这些工作通过硬件SIE serial inteRFace engine完成,编程不用关心。
USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。
什么封包格式等好像程序没有涉及。
而描述符就需要程序来提供了。
usb_desc.c 提供了设备、端点、接口、字符串、群组、制造商描述符usb_prop.c 提供了Device_Property, Device_Table &USER_STANDARD_REQUEST 结构描述,这3个东东定义于usb_core.c。
hw_config.c 提供了实际硬件需要的操作函数,Joystick_Send()通过函数UserToPMABufferCopy 和SetEPTxValid 将坐标值发给了USB端口。
STM32f10x_it.c 里面有void USB_LP_CAN_RX0_IRQHandler(void){USB_Istr(); //定义于usb_istr.c}单击此处下载整个范例程序包:在万利学习板自带的演示例程中,有几个USB的例程。
如果我们想实现一个USB功能,可以拿里面的例子来改。
那么具体要改哪些地方呢?首先要改各种描述符,然后是具体的数据处理。
USB-CDC虚拟串口(VCP)收发数据

USB-CDC虚拟串口(VCP)收发数据USB-CDC虚拟串口(VCP)收发数据用STM32cubeMX软件配置好USB设备为CDC设备,生成并打开工程。
此功能方便用来作为程序的调试输出到电脑查看。
所用函数描述:(1)USB接口CDC发送数据CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)Buf: 传输的数据指针Len: 传输数据的长度(2)USB接口CDC接收数据CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)Buf: 接收的数据指针,不需处理Len: 接收数据的长度,需要处理示例:(1)打开usbd_cdc_if.c文件,修改传输数据长度为64,添加接收数据长度变量DataLen。
/* USER CODE BEGIN PRIVATE_DEFINES *//* Define size for the receive and transmit buffer over CDC */ /* It's up to user to redefine and/or remove those define */ #define APP_RX_DATA_SIZE 64 //修改接收数据长度#define APP_TX_DATA_SIZE 64 //修改发送数据长度/* USER CODE END PRIVATE_DEFINES *//* USER CODE BEGIN PRIVATE_VARIABLES *//* Create buffer for reception and transmission *//* It's up to user to redefine and/or remove those define */ /* Received Data over USB are stored in this buffer */uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];/* Send Data over USB CDC are stored in this buffer */uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];uint8_t DataLen; //定义接收数据长度变量/* USER CODE END PRIVATE_VARIABLES */(2)修改CDC_Receive_FS ()函数,添加接收数据长度的赋值:static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len){/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);DataLen = *Len; //添加接收数据长度的赋值,只添加这一句,其它别改return (USBD_OK);/* USER CODE END 6 */}(3)修改main.c文件,先声明外部变量/* USER CODE BEGIN PV */extern uint8_t UserRxBufferFS[]; //声明数据接收外部变量extern uint8_t DataLen; //声明接收数据长度外部变量/* USER CODE END PV */(4)编辑主循环函数,当按下按键时,发送HelloWorld到电脑串口,当接收到电脑串口数据时,返回接收到的数据,接收数据长度应小于64./* USER CODE BEGIN WHILE */uint8_t MyTxData[12] = "HelloWorld\n"; //定义字符串while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0) //检测按键{while(CDC_Transmit_FS(MyTxData, 12)); //发送字符串到电脑HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); //闪灯HAL_Delay(20);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);while(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == 0); //等待松开按键 }if(DataLen > 0) //判断是否接收到数据{while(CDC_Transmit_FS(UserRxBufferFS, DataLen));//把接收到的数据发送回去DataLen = 0; //清除数据长度标记}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */。
USBCAN总线适配器(CANalyst-II分析仪)产品说明书

●通过PC或笔记本的USB接口实现对CAN总线网络的发送和接收; ●快速CAN网络数据采集、数据分析; ●CAN总线-USB网关; ●USB接口转CAN网络接口; ●延长CAN总线的网络通讯长度; ●工业现场 CAN 网络数据监控。
珠海创芯光电科技有限公司
2 技术支持邮箱:dspstudio@
dspstudio163com1usbcan总线适配器canalysti分析仪产品说明书在有些情况下系统在安装驱动程序时会提示找不到winusbcoinstaller2dll这时请选择对话框右下角的浏览按钮并把目录定位到驱动程序所在目录canalystii或usbcan下的i386针对32位系统或amd64针对64位系统文件夹下选中winusbcoinstaller2dll文件确定后即可
BCAN 总线适配器(CANalyst-II 分析仪)产品说明书
1.4 产品销售清单
序号 1
名称 适配器主机
2
随机光盘
3
USB 数据线
4
备用接线端子5Βιβλιοθήκη 3 寸螺丝刀数量 1
1
1 1 1
单位 台
张
条 只 支
备注
内含:说明书、USB 驱动、二次开发 库文件、二次开发示例程序源代码、 USB_CAN TOOL 测试软件及源代码、
波特率侦测工具等 赠送 赠送 赠送
1.5 技术支持与服务
货到15日内无条件退换,5年免费维修、终身维修与升级服务。 技术支持及购买信息请查阅
淘宝官方旗舰店:/
Email: dspstudio@ 技术支持QQ:1877977019
1.6 产品选型
BCAN 总线适配器(CANalyst-II 分析仪)产品说明书
MCU芯片验证中的USB模块批量传输验证

M C U芯片验证中的U S B模块批量传输验证宁振海1,2,赵东艳1,唐晓柯1,李德建1,杨立新1,白志华1(1.北京智芯微电子科技有限公司国家电网公司重点实验室电力芯片设计分析实验室,北京100192;2.北京智芯微电子科技有限公司北京市电力高可靠性集成电路设计工程技术研究中心)摘要:U S B具有简单易用㊁场景广泛㊁灵活便携㊁成本低廉㊁鲁棒性好等优点,越来越多的嵌入式M C U芯片中包含了U S B模块,以便于M C U与P C或外围其他设备的通信㊂本文主要介绍了M C U芯片验证中U S B模块验证的一些经验和方法,U S B涵盖了4种传输方式,本文仅对U S B批量传输的验证阐述一种方法㊂关键词:U S B;芯片验证;批量传输中图分类号:T P368.1文献标识码:AB u l k T r a n s m i s s i o n V e r i f i c a t i o n o f U S B M o d u l e i n MC U C h i p V e r i f i c a t i o nN i n g Z h e n h a i1,2,Z h a o D o n g y a n1,T a n g X i a o k e1,L i D e j i a n1,Y a n g L i x i n1,B a i Z h i h u a1(1.S t a t e G r i d K e y L a b o r a t o r y o f P o w e r I n d u s t r i a l C h i p D e s i g n a n d A n a l y s i s T e c h n o l o g y,B e i j i n g S m a r t-C h i pM i c r o e l e c t r o n i c s T e c h n o l o g y C o.,L t d.,B e i j i n g100192,C h i n a;2.B e i j i n g E n g i n e e r i n g R e s e a r c h C e n t e r o fH i g h-r e l i a b i l i t y I C w i t h P o w e r I n d u s t r i a l G r a d e,B e i j i n g S m a r t-C h i p M i c r o e l e c t r o n i c s T e c h n o l o g y C o.,L t d.)A b s t r a c t:U SB h a s t h e a d v a n t a g e s o f e a s y-t o-u s e,w i d e-r a n g e,f l e x i b l e a n d p o r t a b l e,l o w c o s t a n d h i g h r o b u s t n e s s.M o r e a n d m o r e e m b e d-d e d MC U s c o n t a i n U S B m o d u l e s t o f a c i l i t a t e t h e c o mm u n i c a t i o n b e t w e e n M C U a n d P C o r o t h e r p e r i p h e r a l d e v i c e.I n t h e p a p e r,s o m e e x-p e r i e n c e s a n d m e t h o d s o f U S B m o d u l e v e r i f i c a t i o n i n M C U v e r i f i c a t i o n a r e i n t r o d u c e d.U S B c o v e r s f o u r t r a n s m i s s i o n m o d e s.I n t h e p a-p e r,t h e m e t h o d f o r v e r i f i c a t i o n o f U S B b u l k t r a n s m i s s i o n i s i n t r o d u c e d o n l y.K e y w o r d s:U S B;c h i p v e r i f i c a t i o n;b u l k t r a n s m i s s i o n引言在芯片验证中,一般针对芯片内每一个模块都会做相应的功能验证和性能验证㊂其中功能验证是最基本的验证内容,只有在功能验证的基础上才可开展性能验证㊂本文研究的一款M C U中包含了U S B模块,在嵌入式M C U 中,U S B协议相对于其他一些基本的传输协议较为复杂, U S B模块验证工作自然也是重点和难点㊂本文即对U S B的基本协议内容和部分验证方法做了阐述㊂1基本概念U S B规范中定义了U S B主机和U S B设备㊂主机作为通信的发起方,在整个通信中占有主导地位㊂下面就U S B通信的数据流㊁主机与设备之间的识别来概括介绍一下这些基本概念㊂同时为了方便介绍后面的测试方法,这里还对F A T32进行简单介绍㊂1.1U S B通信的数据流组成U S B 通用串行总线,顾名思义其传输的数据是由一位一位的串行二进制构成的㊂若干位二进制构成了U S B 域,若干个域组合构成U S B包,两个或三个包组合构成事务,一个或多个事务组成传输,在应用层面还把实现不同功能的U S B设备类型归为不同的U S B类㊂下面分别介绍U S B的域㊁包㊁事务㊁传输和类㊂图1是U S B通信单元的关系分层图㊂图1U S B通信单元分层图①域是U S B的最小单位,由若干位组成,可分为7种类型:同步域㊁标识域㊁地址域㊁端点域㊁帧号域㊁数据域㊁校验域㊂②包由若干域构成,分为4种类型,分别是令牌包㊁数据包㊁握手包和特殊包,不同类的包又分成几种具体的包(见图1)㊂③U S B 事务是指向端点传递的服务,通常是由令牌包㊁可选的数据包和可选的握手包组成㊂④U S B 传输是在客户软件程序及其功能设备之间移动信息的一个或多个U S B 事务,分为控制传输㊁中断传输㊁同步(等时)传输㊁批量传输4种传输类型㊂这里说一下批量传输,批量传输可通过错误检测和重试的方法保证数据在主机和设备之间无错误的传输㊂批量传输包括了三个阶段:令牌㊁数据和握手㊂图2所示是批量传输事务流程的示意图(P I N G 和N Y E T 包只能在高速操作的设备中使用)㊂图2批量传输事务流程的示意图图4 F A T 32文件系统结构⑤类不属于通信单元,是在应用的层面把U S B 加以区分,U S B 类的数据通信由一种或几种传输完成,比如常用的U 盘设备是大容量存储类(M a s s S t o r a ge C l a s s ,M S C ),键盘/鼠标设备是人机接口类(H u m a n I n t e rf a c eD e v i c e s ,H I D )㊂1.2 U S B 的枚举过程U S B 总线由V B U S ㊁D -㊁D +㊁G N D 四根线构成,U S B 的数据传送依靠D +㊁D -这对差分信号线㊂在U S B 设备接入U S B 主机时,主机通过D +或D -上的电平变化来检测设备的接入;识别到有U S B 设备后,U S B 主机采用U S B 标准请求获取U S B 设备的相关信息并作相应的设置,配置完成U S B 的枚举过程㊂图3是U S B 枚举过程流程图㊂①U S B 主机复位,U S B 总线获得一个确定的总线状态;②U S B 主机通过默认0地址获取U S B 设备的设备描述符(前8字节,从而知道端点0的图3 U S B 枚举过程最大包长);③U S B 主机再次复位U S B总线;④U S B 主机给U S B 设备分配一个地址;⑤U S B 主机通过分配的地址获取U S B 设备的设备描述符(全部);⑥U S B 主机获取U S B 设备的配置描述符(前8字节);⑦U S B 主机获取U S B 设备的配置描述符集合(配置描述符㊁接口描述符㊁类特殊描述符㊁端点描述符);⑧U S B 主机获取U S B 设备的字符串描述符和语言描述符;⑨U S B 主机设置U S B 设备的配置(因为配置可能不止一个,由主机控制使用哪个配置)㊂1.3 F A T 32文件系统简介F A T 32文件系统是一种比较常见的文件系统,其内部结构组成如图4所示,包括保留区㊁F A T 区和数据区㊂保留区中包含了D B R (系统引导扇区)和F S I N F O ,D B R 在文件系统的0扇区处,其包含了文件系统的各种配置信息(文件系统大小㊁F A T 区起始地址㊁F A T 区大小㊁数据起始地址等)㊂F S I N F O 记录文件系统剩余簇的数量及下一个可用簇的簇号信息㊂F A T 区的大小和起始地址可通过D B R 中的相关信息确定㊂F A T 区包括了两个完全相同的F A T 表,F A T 表中按4字节一个表项划分㊂通过F A T 表项可以描述簇的状态及表明文件或目录的下一簇的簇号㊂数据区是真正用于数据存储的区域㊂数据区下包含了目录和文件,文件系统的第一个目录被称为根目录㊂目录下包含了一条条的目录项,记录着此目录下文件的以下信息:文件大小㊁文件创建时间㊁文件修改时间㊁文件的起始地址等㊂文件系统在被P C 识别时首先获取D B R 信息,解析D B R 计算出F A T 区和数据区的地址和大小,并定位根目录起始地址㊂通过目录中的目录项获取文件的起始位置,若文件大于一个簇,P C 会通过F A T 表找到存储文件的下一个簇的地址㊂至此,P C 即可访问整个文件系统的文件㊂2 U S B 模块批量传输的测试测试M C U 的U S B 模块是依照上述介绍的内容将M C U 实现成为了一个虚拟的U 盘,虚拟U 盘的文件系统采用F A T 32㊂通过测试虚拟U 盘来测试U S B 模块的功能㊂2.1 U S B 部分的实现U 盘是一个大容量存储的U S B 设备,使用的是批量传输,其指令采用了S C S I 指令集㊂在按照上述内容实现了U S B 的枚举和读写的同时,还需要实现S C S I 指令集的处理,其处理过程如图5所示㊂下面是相应的指令解释㊂①T e s t U n i t R e a d y :用于监测U 盘是否处于准备好的状态,对于可移除磁盘,P C 会每秒发送一次此指令㊂②I n q u i r y :获取U 盘设备的一些基本信息,如是否为可移除磁盘㊁I S O 版本号㊁A N S I 版本号等内容㊂③R e a d F o r m a t C a p a c i t y :获取U 盘格式化容量信息㊂④R e a d C a p a c i t y:获取U 盘容量信息㊂⑤R e a d 10:读取U 盘内容的指令,可根据指定地址读取相应存储空间的信息㊂⑥W r i t e 10:写U 盘指令,可以向指定的地址空间写入相应的数据㊂2.2 虚拟U 盘F A T 32文件系统部分的实现本次目标是验证U S B 的批量传输,并不需要涉及到存储的操作,所以这里的U 盘文件系统被枚举挂载的是虚拟U 盘㊂U 盘挂载到P C 之后,P C 对U 盘的数据读取操作是从M C U 固定R AM 地址读取固定数据,P C 对U盘的数据写入操作直接被M C U 丢弃㊂虚拟U 盘文件系统之所以能在P C 上显示出已格式化的磁盘设备,是因为其在P C 读取对应的F A T 32文件系统保留区㊁F A T 区㊁数据区地址内容时返回了相应的文件系统数据㊂图6是PC图5 U 盘S C S I 指令处理流程图识别U 盘F A T 32文件系统的流程图㊂图6 P C 识别U 盘F A T 32文件系统流程图虚拟U 盘的文件系统挂载是为了测试U S B 模块的批量传输,不必要具体参与D B R ㊁F A T ㊁数据区内容的编辑㊂本验证通过格式化一个普通U 盘,使用W i n H e x 软件获取相应文件系统区域的内容和对应地址㊂图7是通过W i n H e x 软件获取文件系统关键区域的方法,按照此方法依次获取D B R ㊁F A T 区和数据区的地址和内容,将获取的数据应用在图6所示的流程图对应的程序段中㊂图7 U 盘D B R 获取方法示意图2.3 测 试首先,可以通过上述方式实现U 盘功能,能够枚举并且挂载磁盘,已经可以说明U S B 通路的通信是能正常运行的㊂其次,在U 盘正常枚举之后可以通过U 盘测试软件测试其速度性能㊂图8是M C U U S B 作为U 盘时的读写性能测试结果(写为20.1M B /s ,读为23.7M B /s)㊂最后,可通过P C 软件长时间不间断地对U 盘进行读写,测试U S B 通信功能的稳定性㊂结 语U S B 具有应用场景广泛㊁成本低廉㊁易用便携等优点,且其所对应的设备类型多种多样,但其传输类型只有图8 虚拟U 盘速度测试结果4种㊂本文仅针对批量传输测试介绍了一种方法,而对于全面的U S B 测试还应针对其他三种传输类型作相应的测试及协议一致性验证㊂参考文献[1]U S B I m p l e m e n t e r s F o r u m.U n i v e r s a l S e r i a l B u s S pe c if i c a -t i o n R e v 2.0,2000.[2]U S B I m pl e m e n t e r s F o r u m.U n i v e r s a l S e r i a l B u s M a s s S t o r -a g e C l a s s B u l k -O n l y T r a n s po r t .R e v 1.0,1999.[3]U S B I m pl e m e n t e r s F o r u m.U n i v e r s a l S e r i a l B u s M a s s S t o r -a g e C l a s s U F I C o mm a n d S p e c i f i c a t i o n .R e v 1.0,1998.[4]刘荣.圈圈教你玩U S B [M ].2版.北京:北京航空航天大学出版社,2013.[5]周立功.U S B 2.0与O T G 规范及开发指南[M ].北京:北京航空航天大学出版社,2004.[6]马林.数据重现 文件系统原理精解与数据恢复的最佳实践[M ].北京:清华大学出版社,2009.(责任编辑:薛士然 收稿日期:2018-06-01) 网络防御问题,导致网络安全对策缺乏针对性㊂本文将防御因素量化融入攻击节点的属性中,借助HMM 动态分析手段,计算不同状态转移的安全概率,确定风险出现概率高的节点㊂HMM 分析为双重动态分析,借助V i t e r b i 法确定最大概率的状态转换序列,依据最可能攻击节点路径,推断攻击者的目标意图,为安全管理决策提供量化支撑,提高安全管理的可靠性㊂本文在V i t e r b i 算法中的动态因素影响权重问题㊁变量路径的衍生分析,以及路径优化算法方面存在不足,有待进一步分析研究㊂参考文献[1]陈小军,时金桥,徐菲,等.面向内部威胁的最优安全策略算法研究[J ].计算机研究与发展,2014,2(7):15651577.[2]戚湧,刘敏,李千目.基于扩展马尔科夫链的攻击图模型[J ].计算机工程与设计,2014(12):41314135.[3]刘仁山,孟祥宏.攻击图和HMM 结合的网络安全风险评估方法研究[J ].信阳师范学院学报:自然科学版,2015(1):146150.[4]李庆朋,王布宏,王晓东,等.基于攻击图节点概率的网络安全度量方法[J ].计算机应用研究,2013,30(3):906908.[5]陈小军,方滨兴,谭庆丰,等.基于概率攻击图的内部攻击意图推断算法研究[J ].计算机学报,2014,37(1):6272.[6]陈洁群.基于V i t e r b i 改进算法的汉语数码语音识别系统[J ],微型机与应用,2017,2(14):1113.[7]李丽敏,王仲生,姜洪开.基于多状态M O G HMM 和V i t e r b i的航空发动机突发故障预测振动[J ].测试与诊断,2014,3(2):310314.严纪珊(工程师),主要研究方向为网络安全和信息安全㊂(责任编辑:薛士然 收稿日期:2018-06-08)。
USBComposite实现一个USB接口上多个设备

USBComposite实现一个USB接口上多个设备【误区】很多人认为一个USB接口上实现多个设备指复合设备,其实,这个是一个误区。
在一个USB接口上实现多个设备有2中方法,一种是Compound Device,就是复合设备;另一种是Composite Device,就是组合设备。
在USB2.0的标准协议中,定义如下:When multiple functions are combined with a hub in a single package, they are referred to as a compound device.A device that has multiple interfaces controlled independently of each other is referred to as acomposite device.所以,复合设备其实就是几个设备通过一个USB Hub形成的单一设备;组合设备也就是具有多个接口的设备,每个接口代表一个独立的设备。
显然,如果是想同样的功能的话,组合设备的方法要简单很多(可以去看一下USB2.0协议中,USB2.0 Hub的复杂度)。
【目标与实现方法】给Versaloon模拟的JTAGICE mkII增加一个CDC串口。
由于标准的CDC串口需要2个接口,所以用组合设备比较难以实现(因为组合设备要求每个接口对应一个独立的设备)。
还好,Windows是一向不按照标准来的,Windows的usbser.sys支持一种只有一个接口的CDC设备。
实现方法是:不需要数据类接口,而是把原先数据类接口上的2个Bulk端口,放在通信类接口上即可。
【结果】知道方法了,相信不用我多少,熟悉USB设备编程的人就可以马上自己搞定了。
这里给个图,JTAGICE mkII就是模拟的设备,CDConJTAGICE mkII就是增加的一个CDC串口。
这下,Versaloon就可以直接支持那些串口编程的芯片了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TRACE("error writing:\n%s\n", usb_strerror()); } else {
TRACE("success: bulk write %d bytes\n", ret); }
printf("error opening device: \n%s\n", usb_strerror()); return ; } else { printf ("success: device %04X:%04X opened\n", MY_VID, MY_PID); } usb_set_configuration(dev,1); usb_claim_interface(dev,0);
3) 与 USB 设备进行通信。使用 usb_bulk_read/usb_bulk_write 函数,向 USB 设 备读取数据或写入数据。
4) 关闭 USB 设备。完成所有操作后,调用 usb_close 函数关闭已经打开的 USB 设备。
void libusb_test() {
usb_dev_handle *dev = NULL; /* the device handle */ char tmp[BUF_SIZE]; int ret;
while (TRUE) {
/* call the periodic task function */ USB_CDC_Periodic_Task();
/*check whether enumeration is complete or not */ if((start_app==TRUE) && (start_transactions==TRUE))
如何实现自定义 USB Bulk 批量传输设备
厂商自定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发操作系统端 的设备驱动程序,还要开发设备应用程序。
厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式(control transaction 控制传 输、bulk transaction 批量传输、interrupt transaction 中断传输、isochronous transfer 实时传 输),当然控制端点只能用控制传输。标准设备类可能只支持除了控制端点外的其中一种 传输方式,比如前面的 HID 实例,除了控制端点外,只支持中断传输,而由于中断传输有 其固有特点,有时并不能满足应用要求,如传输速率方面,由于决定因素在于中断时间, 但中断时间最快是 1ms,而批量传输可以随时发生(受带宽限制),理论上传输速率可以 比中断传输快。
inf-wizard.exe 程序生成驱动程序 inf 文件,这个文件将作为产品发布时使用的驱动程序。
USB 驱动程序安装完毕后,可用在系统的“设备管理器”中看到已经正常工作的 USB 设备。
运行自带的 testlibusb-win.exe 程序就能读出 USB 设备信息。下图是 USB 设备类的描述符信 息。
{ Virtual_Com_App();
} }/* Endwhile */ }
5. 调用 LibUSB-Win32 进行 USB 通信
LibUSB-Win32 是一个用于 Windows 操作系统(Win98SE、WinME、Win2k 和 WinXP)上的 通用 USB 设备驱动程ቤተ መጻሕፍቲ ባይዱ。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况 下,可以访问 Windows 系统上的任意一个 USB 设备。该驱动程序具有以下特点:
1. 修改设备的 PID 和 VID
对于不同产品需要不同的 PID 和 VID,可用通过修改设备描述符中的 PID 和 VID 字段。 修改文件 usb_descriptor.c 的设备描述符: const uint8 Device_Descriptor[18]= {
0x12, //bLength 域,描述符的长度:18 字节 0x01, //bDescriptorType 域,描述符类型:0x01 表示本描述符为设备描述符) 0x00,0x02, //bcdUSB 域,USB 规范版本号(采用 BCD 码):2.0 0xFF, //bDeviceClass 域,设备类代码,0xFF 为自定义设备类 0x00, //bDeviceSubClass 域,设备子类代码 0x00, //bDeviceProtocol 域,设备协议代码(0x00 表示不使用任何设备类协议) 0x20, //bMaxPacketSize0 域,端点 0 支持最大数据包的长度:32 字节 0xA2,0x15, //idVendor 域,供应商 ID(VID) 0x0F,0xA5, //idProduct 域,产品 ID(PID) 0x00,0x00, //bcdDevice 域,设备版本号(采用 BCD 码) 0x01, //iManufacturer 域,供应商的字符串描述符索引:1 0x02, //iProduct 域,产品的字符串描述符索引:2 0x03, //iSerialNumber 域,设备序号的字符串描述符索引:3 0x01 //bNumConfigurations 域,该 USB 设备支持的配置数目:1 个 };
2. 修改端点描述符
端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点 0(控制端点, 一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了 数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。 除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为 0, 它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大 包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它 来配置设备。
5.2 上位机 USB 编程
libusb 设计了一系列 API 为应用程序所调用,通过这些 API 应用程序可以操作 USB 硬件。 将 libusb-win32 自带的 libusb0.dll,libusb.lib,usb.h 三个文件添加到上位机程序中。通过使用 七个函数,就可以与 USB 设备进行简单通信了,通信的主要流程可分为以下四步:
if (dev) {
usb_close(dev); } }
运行在 PC 的上位机程序,发送 64 字节 运行在 Kinetis MCU 上的 USB Bulk 接收 64 字节
} , {
DIC_BULK_IN_ENDPOINT, USB_BULK_PIPE, USB_SEND, DIC_BULK_IN_ENDP_PACKET_SIZE } , { DIC_BULK_OUT_ENDPOINT, USB_BULK_PIPE, USB_RECV, DIC_BULK_OUT_ENDP_PACKET_SIZE } };
usb_init(); /* initialize the library */ usb_find_busses(); /* find all busses */ usb_find_devices(); /* find all connected devices */
if (!(dev = open_dev())) {
Freescale USB Stack 4.1.1 协议栈(/usb)已经提供了标准的设备类驱 动。为了实现自定义的 bulk 批量传输设备,我们可以参考现有的 CDC 通信设备类,在 CDC 的源代码基础上进行修改,快速实现自定义 USB Bulk 批量传输设备。
= { sizeof(USB_STR_2), USB_STRING_DESCRIPTOR, 'B',0,
'U',0, 'L',0, 'K',0, ' ',0, 'T',0, 'R',0, 'A',0, 'N',0, 'S',0, 'A',0, 'C',0, 'T',0, 'I',0, 'O',0, 'N',0 };
5.1 安装 PC 上位机驱动程序
将修改后的 CDC 代码编译下载到 Kinetis MCU 运行,连接 PC 与 MCU Device 之间的 USB Cable,PC 电脑提示发现新硬件。
通过 LibUSB-Win32 自带的 inf-wizard.exe 生成向导可以生成 USB 驱动程序。inf-wizard.exe 程序扫描系统活动的 USB 设备,选择需要生成驱动程序的设备。
4. 修改 USB 处理过程
由于自定义的 USB 设备类没有 CDC 的 Set Control Line State 处理过程, 修改 virtual_com.c 文件中 start_transactions 的定义,默认使能传输,或者删除与 start_transactions 变量相关 的判断代码。
static bool start_transactions = TRUE;
void TestApp_Init(void) {
……… /* Initialize the USB interface */ g_app_handle = USB_Class_CDC_Init(&cdc_config); g_recv_size = 0; g_send_size= 0;
/* structure containing details of all the endpoints used by this device */ USB_EP_STRUCT ep[CDC_DESC_ENDPOINT_COUNT] = {