精华内容
下载资源
问答
  • STM32F103实现虚拟串口,进行串口通信,实现了USB通信 STM32F103实现虚拟串口,进行串口通信,实现了USB通信 STM32F103实现虚拟串口,进行串口通信,实现了USB通信 STM32F103实现虚拟串口,进行串口通信,实现了USB...
  • 2.USB总线状态 3.USB总线信号 3.1 SOP信号 3.2 EOP信号 3.3Reset信号 3.4Suspend信号 3.5Resume信号 3.6 SYNC信号 3.7 连接信号 3.7.1低速设备连接检测时序图 3.7.2全速/高速设备连接检测时序图 3.8 断开...

    目录

    1.USB总线电平标准

    2.USB总线状态

    3.USB总线信号

    3.1 SOP信号

    3.2 EOP信号

    3.3 Reset信号

    3.4 Suspend信号

    3.5 Resume信号

    3.6 SYNC信号

    3.7 连接信号

    3.7.1低速设备连接检测时序图

    3.7.2全速/高速设备连接检测时序图

    3.8 断开信号


    1.USB总线电平标准

    USB总线电平标准如下,下图标识了低速/全速、高速总线输出特性的电平标准。

    2.USB总线状态

    下图显示了USB低速和全速总线信号1、信号0、SE0状态、SE1状态、J状态、K状态、空闲IDLE状态下D+、D-线分别对应的电平信号范围。

    下图显示了USB高速总线信号1、信号0、J状态、K状态、Chirp J状态、Chirp K状态、空闲IDLE状态下D+、D-线分别对应的电平信号范围。

    注:有上面两张图可以总结出low speed和full/high spped J状态/K状态相反。

    3.USB总线信号

    USB总线信号有SOP信号、EOP信号、Reset信号、Suspend信号、Resume信号、SYNC信号、连接信号、断开信号等。那么当USB总线状态发生怎样的变化才会生成这些信号呢?我们在这里只讨论低速/全速的总线信号,高速的略有差别,大家可以查阅usb_20.pdf进行学习。

    3.1 SOP信号

    低速设备SOP信号:总线从IDLE状态(J状态:差分0)切到K状态(差分1),即可完成低速SOP信号的发送。

    全速设备SOP信号:总线从IDLE状态(J状态:差分1)切到K状态(差分0),即可完成全速SOP信号的发送。

    3.2 EOP信号

    低速设备EOP信号:总线持续2位时间的SE0(单端0)状态,后跟随1位时间的J状态(差分0),即可完成低速EOP信号的发送。

    全速设备EOP信号:总线持续2位时间的SE0(单端0)状态,后跟随1位时间的J状态(差分1),即可完成全速EOP信号的发送。

    3.3 Reset信号

    主机可以对USB设备进行复位,主要是主机在和设备通讯之前会发送Reset信号把设备设置到默认的未配置状态,即主机拉低两根信号线(SE0状态)并保持10ms

    3.4 Suspend信号

    总线3ms以上的IDLE状态,则设备会认为主机发起了一次挂起操作。

    3.5 Resume信号

    USB设备进入挂起状态之后,将由Resume信号进行唤醒。Resume信号可以由USB主机发起,也可以由USB设备本身触发,但是只有USB主机可以结束Resume信号

    1.主机在挂起设备后可通过翻转数据线上的极性并保持20ms来唤醒设备,并以低速EOP信号结尾。

    2.如果设备支持远程唤醒,设备可向主机发起远程唤醒请求,前提是设备已进入idle状态至少5ms,设备会驱动总线进入K状态,如下图,K状态必须维持1ms-15ms之内,此信号会在1ms内被主机接管,主机会继续驱动唤醒信号直到20ms,并以低速EOP信号结尾。

    3.6 SYNC信号

    3个KJ状态的切换,后跟随2位时间的K状态,完成一次同步信号的发送。如下图所示。

    3.7 连接信号

    当主机检测到某一个数据线电平拉高保持了一段时间,就认为有设备连接上来了。低速设备连接时,主机会检测到D-线被拉高,全速/高速设备连接时,主机会检测到D+线被拉高。

    3.7.1低速设备连接检测时序图

    3.7.2全速/高速设备连接检测时序图

    TDCNN针对Hub不同的状态,时间是不同的,如下对应表(见usb_20.pdf P186)。

    Hub状态TDCNN
    没有被挂起
    2.5us < TDCNN < 2000us
    被挂起2.5us < TDCNN < 12000us

    3.8 断开信号

    没有设备连接时或者设备断开时,主机端D+、D-数据线上的下拉电阻起作用,使得二者都在低电平;当低电平持续TDDIS时间就会被主机认为是断开状态。如下图,TDDIS在2到2.5us之间。


    1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除;

    2.未经原作者允许不得转载本文内容,否则将视为侵权;

    3.转载或者引用本文内容请注明来源及原作者;

    4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

    下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

    展开全文
  • 为实现上位机Linux系统的Qt应用程序与下位机USB CDC便携式设备之间的串口通信,本课题采用USB CDC类协议,并根据协议在Linux下编写设备驱动程序,同时,搭建Linux-QT应用平台利用QT可视化的图形界面及丰富的图形库,...
  • 一般在USB控制芯片中,其相关的状态寄存器里几乎都会有类似的位设置,以方便固件程序代码的编写。例如,在Cypress CY7C63系列的USB控制芯片中,USB端点0 TX配置缓存器的位6即是DATA 1/0位。  由于传送器与接收器...
  • 本文着重介绍了该插座与上位机通信USB实现。为了将该插座的用途拓展到工业现场,文章对使用一种RS485到USB接口转换卡进行了初步探讨。  关键词:USB;RS-485;设备驱动程序;转换卡 1. 概述  现有的插座在...
  • USB通信接口介绍

    万次阅读 2018-11-09 10:55:15
    USB设备可以直接和host通信,或者通过hub和host通信。一个USB系统中仅有一个USB主机,设备包括功能设备和hub,最多支持127个设备。 由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个...

    1. 概述

    Usb = Universal Serial Bus全称通用串行总线,是一种支持热插拔的高速串行传输总线,使用差分信号来传输数据。

    USB设备可以直接和host通信,或者通过hub和host通信。一个USB系统中仅有一个USB主机,设备包括功能设备和hub,最多支持127个设备。

    由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB OTG,全拼 ON The Go。USB OTG 同一个设备,在不同的场合下可行在主机和从机之间切换。

    USB协议版本有USB1.0、USB1.1、USB2.0、USB3.1等。

    速度模式:

    USB1.0低速模式:1 .5Mb/s

    USB1.1全速模式:12Mb/s

    USB2.0 高速模式:480Mb/s      500mA

    USB3.0 超高速模式: 5.0Gb/s 实际3.2Gb/s    900mA

    USB3.1 超超高速模式:10Gb/s实际7.2Gb/s 20V/2A-仅限于Type-A/B  12V/3A-Type-C

    USB1.1 OTG  USB2.0 OTG:作为相应的补充,支持点对点通信。 

     

    供电模式:

    自供电:设备从外部电源获取工作电压。

    总线供电:设备从VBUS(5V) 取电,最多500mA电流,本身容值不超过10uF;

                        低功耗USB设备:最大功耗不超过100mA;

                                         高功耗USB设备:枚举时最大功耗不超过100mA,枚举完成配置结束后功耗不超过500mA。

                                                                          (枚举过程中,通过设备的配置描述向主机报告它的供电模式和功耗要求)

    优点:传输速度快,支持热插拔,系统总线供电,支持设备种类多,扩展容易;

    缺点:传输距离短,供电能力有限。

     

    2. 硬件结构

    USB使用的是差分传输模式,两个数据线D+和D-;他们使用的是3.3V电压(与CMOS的5V电压不同)而电源线和地线可以向设备提供最大电流500mA(可以编程设置)

    差分信号1:D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V)

    差分信号0:D- > VOH and D+ < VOL

     

    USB2.0与USB3.0差别:

    USB2.0速度没USB3.0快;

    USB2.0通常是白色或黑色,USB3.0为蓝色;

    USB2.0是500mA,USB3.0为900mA;USB3.1为20V/5A;

    J状态(高电平):D+ 高,D- 低

    K状态(低电平):D+低,D- 高

    SEO状态:D+ 低,D- 高

    Reset信号:D+ and D- < VOL for >= 10ms

    主机在要和设备通信之前会发送Reset信号来把设备设置到默认的未配置状态。即主机拉低两根信号线(SE0状态)并保持10ms

    Idle状态:J状态数据发、送前后总线的状态

    Suspend状态:3ms以上的J状态

     

    3. 传输结构

    集合关系:传输类型 -> 事务 -> 包 -> 域

    传输类型: 控制、中断、同步、批量

    事务: IN、OUT、SETUP

    包: 令牌包、数据包、握手包

    域: 同步序列域、包标识域、地址域、端点域、帧号域、数据域、CRC校验域

     

    注意:

    USB的基本数据结构是包;

    USB总线发送是LSB在前,MSB在后。

     

    4. 拓扑结构

    Usb主控制器:对丛机设备的控制和数据处理

    Usb根集线器:是特殊的usb集线器,集成在主机控制器中,不占用地址;

    Usb集线器:可以扩展出更多的USB口。

    一个主控制器对应一个根集线器,而一个根集线器通常对应一个或者几个USB口,比如电脑主机上有7个主控制器和7个根集线器,

     

    5. 速度检测

    • 全速和低速的识别

    主机的hub端的D+和D-上分别接了15k的下拉电阻到地,当主机hub悬空时,主机hub端均为低电平;

    usb设备端的D+或者D-上接有1.5k上拉电阻,低速设备的上拉电阻接到D-上,高速和全速设备的上拉电阻接到D+上,当设备插入主机时,根据数据线的电平高低识别速度。

     

     

    • 高速设备识别

    usb高速设备的D+上接有1.5k的上拉电阻,当设备插入主机时,首先被识别为全速设备。之后,hub和设备需要通过“Chirp序列”的总线握手机制来识别高速和全速设备。整个过程中,高速的hub需要检测插入的设备是高速、全速还是低速,高速的设备需要检测所连接上的hub是都支持高速模式,如果双方都确认成功,就进行以系列的动作,设备从全速切换到高速模式,高速模式下,采用电流传输模式,设备需要将上拉电阻断开。否则,设备以全速模式工作;

     

    6. HSIC

    HSIC—USB High Speed Inter-Chip

    是一个两线源同步的串行接口,使用240MHz双倍数据速率产生480MHz的高速速率,和传统的USB电缆连接拓扑结构的主机完全兼容。不支持中速和低速USB转换。

     

    480MHz高速数据速率;

    源同步串行接口,不传输时不耗电;

    不支持热插拔,线路长度10cm;

    信号驱动在1.2V标准LVCMOS水平;

    不支持高速线性调频协议,HSIC只能工作在高速状态;

    HSIC可以替换IIC;

    常用于3G和4G模块中。

    7. Type-C

    • 接口特点

    支持正反插;

    支持最高20V5A的电源能力,支持快充;

    支持USB3.0  USB3.1协议,同时向下兼容USB2.0协议;

    多功能:传输电源和数据外,还可以传输音视频;

    • 管脚定义

                                                      插座(front view)

                                                      插头(front view)

    VBUS:电源

    TXn+/TXn-/RXn+/RXn-:USB3.0/3.1高速数据线;

    D+/D-:USB2.0数据线;

    CC:逻辑功能识别及配置管脚,用来检测正反插以及充电功率控制。

             Type-C作为DFP模式时(类似HOST或适配器)VBUS输出默认是没有电压的,只通过CC线的上拉电流大小来通知外设默认支持电流大小(5V:900mA,1.5A,3A),当接上外设后(UFP)CC线会被外设的5.1K电阻接地,VBUS就会输出5V。此后双方可以通过CC线进行数据通信,并协商到更高的充电电压(PD功能)。

            

    VCONN:如果使用Active Cable(譬如DP功能),VCONN用来给Cable的芯片供电(共用CC管脚);

    SBU1/2:辅助信号,DP模式下的AUX协议信号;

    备注:

    DFP:Downstream Facing Port 下行端口可理解为Host,提供VBUS,也可提供数据。

    UFP:Upstream Facing Port 上行端口可理解为Device,从VBUS中取电,并可提供数据。

    DRP:Dual Role port双角色端口既可做DFP(Host),也可做UFP(Device),也可在DFP与UFP间动态切换。

     

    8. USB芯片种类

    接口芯片:通用USB接口芯片 Usb interface chip

    USB 主控制器:USB HOST功能芯片 Usb host chip

    USB微控制器:带USB接口MCU  usb with mcu

    并口桥:USB转并口芯片   Usb to parallel bridge   8bit  16bit  32bit

    串口桥:USB转串口芯片  Usb to serial bridge   IIC、SPI或者UART

    音频控制器: Usb Audio Controller  IIS接口

    HUB控制器:USB HUB  USB HUB Controller

    USB-USB桥:通过USB实现PC互连USB to USB bridge

    闪盘控制器:Usb flash controller

    读卡器:智能卡设备类  Usb smart card

     

     

     

     

     

     

     

     

     

    展开全文
  •  自动测试系统ATS(Automatic Test System)集成测试所需的全部激励与测量设备,计算机高效完成各种模式的激励及响应信号的采集、存储与分析,对被测单元进行自动状态监测、性能测试和故障诊断。总线是ATS的重要组成...
  • 以前写的一个项目,通过USB把MCU的程序下载到EEPROM中保存(这个是... 软件上有显示USB连接状态;软件要求通过授权文件的方式进行授权使用(怎么处理授权可以看说明及源程序)。 用到了CSV文件的读取,ini文件读写。
  • Android实战技巧之四十九:Usb通信之USB Host

    万次阅读 多人点赞 2016-02-25 17:27:55
    USB背景知识USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一。 硬件上,它是用插头连接。一边是公头(plug),一边是母头(receptacle)。例如,PC上的插座就是母头,USB设备使用公头与PC连接...

    零 USB背景知识

    USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一。
    硬件上,它是用插头连接。一边是公头(plug),一边是母头(receptacle)。例如,PC上的插座就是母头,USB设备使用公头与PC连接。
    目前USB硬件接口分三种,普通PC上使用的叫Type;原来诺基亚功能机时代的接口为Mini USB;目前Android手机使用的Micro USB。

    Host
    USB是由Host端控制整个总线的数据传输的。单个USB总线上,只能有一个Host。
    OTG
    On The Go,这是在USB2.0引入的一种mode,提出了一个新的概念叫主机协商协议(Host Negotiation Protocol),允许两个设备间商量谁去当Host。

    预了解更多USB知识,请参考USB官网以及下面这篇文章:
    http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html

    一、Android中的USB

    Android对Usb的支持是从3.1开始的,显然是加强Android平板的对外扩展能力。而对Usb使用更多的,是Android在工业中的使用。Android工业板子一般都会提供多个U口和多个串口,它们是连接外设的手段与桥梁。下面就来介绍一下Android Usb使用模式之一的USB Host。

    android.hardware.usb包下提供了USB开发的相关类。
    我们需要了解UsbManager、UsbDevice、UsbInterface、UsbEndpoint、UsbDeviceConnection、UsbRequest、UsbConstants。
    1、UsbManager:获得Usb的状态,与连接的Usb设备通信。
    2、UsbDevice:Usb设备的抽象,它包含一个或多个UsbInterface,而每个UsbInterface包含多个UsbEndpoint。Host与其通信,先打开UsbDeviceConnection,使用UsbRequest在一个端点(endpoint)发送和接收数据。
    3、UsbInterface:定义了设备的功能集,一个UsbDevice包含多个UsbInterface,每个Interface都是独立的。
    4、UsbEndpoint:endpoint是interface的通信通道。
    5、UsbDeviceConnection:host与device建立的连接,并在endpoint传输数据。
    6、UsbRequest:usb 请求包。可以在UsbDeviceConnection上异步传输数据。注意是只在异步通信时才会用到它。
    7、UsbConstants:usb常量的定义,对应linux/usb/ch9.h

    二、USB插入事件

    Usb的插入和拔出是以系统广播的形式发送的,只要我们注册这个广播即可。

        @Override
        protected void onResume() {
            super.onResume();
            IntentFilter usbFilter = new IntentFilter();
            usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
            usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
            registerReceiver(mUsbReceiver, usbFilter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            unregisterReceiver(mUsbReceiver);
        }
    
        private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                tvInfo.append("BroadcastReceiver in\n");
    
               if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
                    tvInfo.append("ACTION_USB_DEVICE_ATTACHED\n");
                } else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
                    tvInfo.append("ACTION_USB_DEVICE_DETACHED\n");
                }
            }
        };

    三、Usb插入时启动程序

    有些应用场景是,Usb插入后启动特定程序处理特定问题。
    我们的做法就是在Manifest中某个Activity加入Usb插入的action。

     <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
    </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/usbfilter" />

    在usbfilter中加入厂商id和产品id的过滤,如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <usb-device vendor-id="1234" product-id="5678" />
    </resources>

    结果就是,当此型号设备通过Usb连接到系统时,对应的Activity就会启动。

    四、UsbManager的初始化

    mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);

    五、列出Usb设备

            HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();
            Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();
            while (iterator.hasNext()) {
                UsbDevice device = iterator.next();
                tvInfo.append("\ndevice name: "+device.getDeviceName()+"\ndevice product name:"
                        +device.getProductName()+"\nvendor id:"+device.getVendorId()+
                        "\ndevice serial: "+device.getSerialNumber());
            }

    六、USB使用权限

    安卓系统对USB口的使用需要得到相应的权限,而这个权限要用户亲自给才行。
    首先我们会确认一下上一节中的device是否已经获得权限,如果没有就要主动申请权限:

                //先判断是否为自己的设备
                //注意:支持十进制和十六进制
                //比如:device.getProductId() == 0x04D2
                if(device.getProductId() == 1234 && device.getVendorId() == 5678) {
                    if(mUsbManager.hasPermission(device)) {
                        //do your work
                    } else {
                        mUsbManager.requestPermission(device,mPermissionIntent);
                    }
                }
    

    我们仍然使用广播来获得权限赋予情况。

    public static final String ACTION_DEVICE_PERMISSION = "com.linc.USB_PERMISSION";

    注册广播

            mPermissionIntent = PendingIntent.getBroadcast(this,0,new Intent(ACTION_DEVICE_PERMISSION),0);
            IntentFilter permissionFilter = new IntentFilter(ACTION_DEVICE_PERMISSION);
            registerReceiver(mUsbReceiver,permissionFilter);

    接收器的代码:

     private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                tvInfo.append("BroadcastReceiver in\n");
                if (ACTION_DEVICE_PERMISSION.equals(action)) {
                    synchronized (this) {
                        UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                            if (device != null) {
                                tvInfo.append("usb EXTRA_PERMISSION_GRANTED");
                            }
                        } else {
                            tvInfo.append("usb EXTRA_PERMISSION_GRANTED null!!!");
                        }
                    }
                } 
            }
        };

    七、通信

    UsbDevice有了权限,下面就可以进行通信了。
    这里要用到:UsbInterface、UsbEndpoint(一进一出两个endpoint,双向通信)、UsbDeviceConnection。
    注意:通信的过程不能在UI线程中进行。
    得到授权后,将做一些通信前的准备工作,如下:

    private void initCommunication(UsbDevice device) {
            tvInfo.append("initCommunication in\n");
            if(1234 == device.getVendorId() && 5678 == device.getProductId()) {
                tvInfo.append("initCommunication in right device\n");
                int interfaceCount = device.getInterfaceCount();
                for (int interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) {
                    UsbInterface usbInterface = device.getInterface(interfaceIndex);
                    if ((UsbConstants.USB_CLASS_CDC_DATA != usbInterface.getInterfaceClass())
                            && (UsbConstants.USB_CLASS_COMM != usbInterface.getInterfaceClass())) {
                        continue;
                    }
    
                    for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
                        UsbEndpoint ep = usbInterface.getEndpoint(i);
                        if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                            if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {
                                mUsbEndpointIn = ep;
                            } else {
                                mUsbEndpointOut = ep;
                            }
                        }
                    }
    
                    if ((null == mUsbEndpointIn) || (null == mUsbEndpointOut)) {
                        tvInfo.append("endpoint is null\n");
                        mUsbEndpointIn = null;
                        mUsbEndpointOut = null;
                        mUsbInterface = null;
                    } else {
                        tvInfo.append("\nendpoint out: " + mUsbEndpointOut + ",endpoint in: " +
                                mUsbEndpointIn.getAddress()+"\n");
                        mUsbInterface = usbInterface;
                        mUsbDeviceConnection = mUsbManager.openDevice(device);
                        break;
                    }
                }
            }
        }

    发送数据如下:

    result = mUsbDeviceConnection.bulkTransfer(mUsbEndpointOut, mData, (int)buffSize, 1500);//需要在另一个线程中进行

    八、其他

    作为一个普通的开发者,如果没有USB设备,那么调试程序是个问题。
    可以使用AdbTest程序用OTG线连接两个手机或平板试试。
    有USB设备的同事,会根据设备的通信协议规则去编码。这里面要用到byte与其他类型转换,以及十六进制的问题。
    具体问题具体分析吧。这篇文章磕磕绊绊,就先到这里了。

    参考:
    1、endpoint的介绍:http://blog.chinaunix.net/uid-25314474-id-3040231.html

    展开全文
  • 本文介绍STM32F USB OTG FS主机的中断过程及时序,关于USB通信的原理与报文不在本文的介绍,请参考其他文档。本文根据实际的使用USB主机详细的描述的USB主机中断发生的过程及顺序,是全网少有的文章。本文介绍所...

    1、STM32F USB主机

           本文介绍STM32F USB OTG FS主机的中断过程及时序,关于USB通信的原理与报文不在本文的介绍,请参考其他文档。本文根据实际的使用USB主机详细的描述的USB主机中断发生的过程及顺序,是全网少有的文章。本文介绍所涉及的USB主机程序请参考rt thread操作系统的USB主机协议栈与USB主机驱动。

    2、连接、断开中断

          一个USB设备在连接USB主机端口时会发生连接中断,通知应用程序发生了连接中断。USB设备与USB主机端口断开时会发生断开中断,通知应用程序发生了断开中断。

           设备插入USB主机端口时,USB主机产生中断,中断程序中会进入连接中断,如下图,即调用HAL_HCD_Connect_Callback函数,此函数会调用主机协议栈中的rt_usbh_root_hub_connect_handler函数,在此函数中会设置中设备连接标志,并且发送一个消息邮箱,通知协议栈线程来处理设备连接后的复位端口,枚举设备等。

          设备从USB主机端口断开时,USB主机产生中断, 中断程序会进入断开连接中断,如下图,即调用HAL_HCD_Disconnect_Callback函数,此函数会调用主机协议栈中的rt_usbh_root_hub_disconnect_handler函数,在此函数中会设置设备断开连接标志,并且发送一个消息邮箱,通知协议栈线程来处理设备断开后来释放之前加载的类驱动、释放USB主机管道。

           对着代码,认真看图,认真看图,认真看图!

     3、USB主机中断问题

            在实际测试过程中,发现了插入一次USB设备时,主机发生1次连接中断,在1ms左右又发生了1次断开中断,之后再发生1次连接中断这样的现象,也许是设备插入产生的抖动产生,不是每次发出,但是出现的机率也有50%以上,实际未对设备连接后的枚举产生影响,所以未加处理。如果要避免这种情况,可以在usb断开中对连接中断发生的时间进行超时判断,在2ms以内连续发生就不执行相应操作。

    展开全文
  • HID USB 通信

    千次阅读 2018-06-11 15:13:49
    摘要: 详细介绍 Visual C ++ 6.0 环境下利用 Windows API(应用程序...通信函数,具有更大灵活性,可定制性也更强,在设置通信配置和发送错误敏感,无时间限制的数据时,该接口尤其有用。 下载实例  点击打开链接
  • USB通信协议深入理解

    千次阅读 2017-08-21 14:07:07
    USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。2.包(Packet)包(Packet)是USB系统中信息传输的基本单元...
  • USB 到底是如何通信的(三)?

    千次阅读 2020-08-16 20:06:00
    USB通信格式 前面简单提到过,USB接口最少有四根线连接,其中有两根是数据线,而所有的USB数据传输都是通过这两根线完成的,那么它是怎么做到的? 我们知道,串口为了实现通信,规定了起始位、停止位,有时候也可能...
  • 今天有空,开贴讲讲,怎样配合ST 提供的库函数理解STM32F103 的USB模块,以及怎么调用这些库函数来实现基本的USB通信。题目很大,先只讲讲最简单的应用。 1 关于512字节的Packet Buffer 在STM32F103的USB模块中有一...
  • USB2.0 通信协议

    千次阅读 2020-10-31 13:51:11
    USB通信协议深入理解 1.基本概念 一个【传输】(控制、批量、中断、等时):由多个【事务】组成; 一个【事务】(IN、OUT、SETUP):由一多个【Packet】组成。 USB数据在【主机软件】与【USB设备特定的端点】间被传输...
  • VC6.0+MFC+USBCAN上位机通信控制实例

    热门讨论 2016-07-08 21:27:55
    在VC6.0中利用MFC技术,结合周立功USBCAN函数库,编写了上位机程序界面控制下位机进行相应运动。
  • 整理完善usb通信(usb打印),可判断设备连接状态和开关机状态,设备连接过程中断开连接后,自动连接. UncaughtExceptionHandler接口实现本地捕获异常log信息保存到本地内存,方便查看调试!
  • labview与USB通信

    万次阅读 多人点赞 2017-12-13 11:17:31
     首先介绍一下USB设备(STM32 USB),设备通过一个接口2个端点与主机通信,两个端点分别为端点1输入和端点1输出。两个端点均为中断端点。  好,下面来正式介绍一下基于labview的USB调试小助手。  USB口的HID类...
  • FPGA USB串口通信(一)

    千次阅读 2020-04-07 18:27:04
    1.串口通信协议简介 2.串口的物理层和协议层 2.1物理层 2.2协议层 二、实验平台 三、实验要求 四、设计输入 五、仿真测试 六、下板测试 一、Uart串口原理 1.串口通信协议简介 串行接口简称串口,也称串行...
  • Android USB通信

    千次阅读 热门讨论 2017-06-07 09:10:39
    1.说在前面的话 这次做了一个项目,要求android端与外接设备进行通信,用到的是...然而网上有关USB host通信的资料很少,这里我就把自己的想法以及遇到的坑说一下吧()。 2.Android Studio 配置 2.1Manifest配置
  • 为了实现遥控遥测地面接收机的测控信息和关键信道参数的实时备份、显示以及测控指令的准确发送,提出一种基于USB2.0协议的通用测控通信接口的设计方案,并完成了系统的软硬件设计。该系统的硬件部分主要包含FPGA与CY...
  • 行业资料-电子功用-USB低功耗状态退出方法、USB电子装置及通信系统.pdf
  • 本文的电路将USB(通用串行总线)信号D+、D-的三种状态转换为发射激光的三种强度全亮、半亮、暗,并且通过光纤传输到对方激光接收器再通过相应电路恢复D+、D-的三种状态。激光接收器电路的输出信号之一触发单稳延时...
  • 端点位于USB 外设内部,所有通信数据的来源或目的都基于这些端点,是一个可寻址的FIFO。 每个USB 外设有一个唯一的地址,可能包含最多十六个端点。主机通过发出器件地址和每次数据传输的端点号,向一个具
  • QT 如何写USB通信

    万次阅读 2014-03-08 14:07:42
    接到任务要求通过USB连接的设备进行通信,从而控制硬件设备,遗憾的是自己之前没有搞过软硬结合的东东。头一次搞这样的东西,我们先来了解一下当USB设备插入电脑后,在电脑里能显示出来该设备的VID、PID及端口号,...
  • USB2.0 通信协议 <1>

    千次阅读 2018-10-19 20:45:10
    USB2.0协议分析   一、USB硬件介绍 1.1、概述   ... 一条USB传输线分别由地线、电源线、D+和D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的... USB设备可以直接和HOST通信,或者通过Hub和Host通信。一个...
  • STM32F103 USB EP0通信数据详解

    千次阅读 2020-10-03 11:21:22
    可以用一个变量gUsbDevState.state记录USB状态,开始的时候USB状态USB_CTRL_IDLE。 1. HOST第一笔数据是SETUP数据,即告知Device接下来的数据要如何处理。从USB buffer中读入8字节数据获取Setup信息。下面是...
  • USB2.0 通信协议 <4>

    千次阅读 2018-10-19 22:52:41
    0. 预备理论 1. USB Core 2. USB Hub 3. USB OTG ...想要深入研究USB的话,USB协议(外加Host和OTG协议)是必要的知识,另外,国内有本fudan_abc的&lt;&lt;USB那些事&gt;&gt;也写...
  • USB通信协议包格式

    千次阅读 2017-07-22 14:59:19
    0. 基本概念 一个【传输】(控制、批量、中断、等时):由多个【事务】组成; ...USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipe

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,428
精华内容 12,571
关键字:

usb通信状态