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