精华内容
下载资源
问答
  • STM32-USB学习笔记(一) USB基础
    千次阅读
    2019-05-12 15:03:01

     

    USB基础知识扫盲

    前言

    本文将从USB的 插入检测身份识别数据传输三个方面对USB通讯整个过程扫盲,其中有些知识点的详细信息会放在文章最下面的附录中供查看,从而保证文章的整体简洁。在进入主题之前,首先了解一下USB的一些基础知识

    USB的分类

    • 按接口类型分

      • 控制器/主机(controller/host)
      • 设备(peripheral)
      • OTG(on-the-go),通过id线确定作为主机还是作为设备
    • 按照USB速度分

      • 低速(low speed)
      • 全速(full speed)
      • 高速(high speed)

    一、USB插入检测

    USB接口一般是4根线,VCC GND DM(D-) DP(D+)
    • A:USB是如何检测到设备插入的
    • Q:主机端将DM DP接入下拉电阻;设备端根据不同速度,将DM DP的某一根接上拉电阻,插入时通过压差即可判定是否插入

      • 低速设备:在DM线上接入上拉
      • 全速设备:在DP线上接入上拉
      • 高速设备:在DP线上接入上拉,在主机对设备进行复位后进一步的确认,详情

    二、USB身份识别

    对于插入的USB设备,主机需要发送比较短的请求来确认设备的身份、类型、速度等信息,这个过程称之为 枚举

    2.1 描述符

    设备的“身份”信息存储在描述符中。每个USB设备中都有如下描述符。需要注意的是

    • 一个USB设备只能有一个设备描述符
    • 其他描述符都可以有多个,对应复合设备,例如USB键鼠
    • 设备描述符(device description)

      • 配置描述符(config description)

        • 接口描述符 (interface description)

          • 端点描述符 (endpoint description)
          • 端点描述符
        • 接口描述符

          • 端点描述符
      • 配置描述符

        • 接口描述符

          • 端点描述符

    2.2 枚举过程

    1. 等待稳定:主机通过电平差检测到设备,等待100ms让设备电平趋于稳定
    2. 首次复位:HUB发起复位,让设备进入初始的地址0模式
    3. 首次查询设备描述符:GET_DESCRIPTOR 主机查询设备描述符,只要前8字节 ==> 80 06 01 00 00 00 12 00
    4. 二次复位:在接收到设备描述符前8个字节后,再次重启设备
    5. 设置地址:SET_ADDRESS 主机下发设置地址命令,设备获取新地址 ==> 00 05 01 00 00 00 00 00
    6. 二次查询设备描述符:GET_DEVICE_DESCRPTOR获取整个18字节的设备描述符 ==> 80 06 01 00 00 00 12 00
    7. 获取配置描述符:GET_CONFIGURATION 获取9字节配置描述符 ==> 80 06 02 00 00 00 09 00
    8. 完成配置:SET_CONFIGURATION,

    2.3 描述符详解

    搞懂了描述符,调好了枚举,就完成了USB通讯的一大半,下面就对描述符进行详细的探索
    设备描述符18配置描述符9接口描述符9终点描述符7
    bLength1bLength1bLength1bLength1
    bDescriptorType1bDescriptorType1bDescriptorType1bDescriptorType1
    bcdUSB2wTotalLength2bNumInterfaces1bEndpointAddress1
    bDeviceClass1bNumInterfaces1bAlterateSetting1bmAttributes1
    bDeviceSubClass1bConfigurationValue1bNumEndpoints1wMaxPacketSize2
    bDeviceProtocol1iConfiguration1bInterfaceClass1bInterval1
    bMaxPackeerSize01bmAttributes1bInterSubfaceClass1  
    idVendor2bMaxPower1bInterfaceProtocol1  
    idProduct2  iInterface1  
    bcdDevice2      
    iManufacturer1      
    iProduct1      
    iSerialNumber1      
    iNumConfigurations1      

    附录

    F1、USB通讯协议详解

    学习协议我个人觉得应该还是从整体流程向下详细到具体协议,上来就看最基本单元/协议会让人一头雾水,这段附录的大体流程也是如此。传输概念->传输流程->基础传输单元->传输流程控制->

    F1.1 USB通讯概念

    1. 在USB的通讯中,有传输(transfer),事务(Transaction),包(packet)三级。包是最基础的传输单元,与TCP/IP协议中的MAC层协议作用相同。
    2. 在一次传输中,由多次事务组成,每次的事务又由多个包组成
    3. 与众多协议相同,较高级别的协议的报文是基于/内嵌在低级协议的报文当中的,在USB中也不例外,例如,包中预留了DATA位,其目的就是填写报文
    • 传输(transfer): 控制(control)、中断(interrupt)、批量(bulk),同步(Isochronous)

      • 事务(transaction):传输方向、流程控制

        • 包(packet):

          1. 令牌(Token):IN、OUT、SETUP、SOF,前导包,用于确认本次事务的方向、目的等,是每次事务必须要有的包。
          2. 数据(data):DATA0、DATA1、DATA2、MDATA,夹带数据
          3. 握手(handshake):ACK、NAK、STALL、NYSET,作为应答、状态回复

    F1.2 一次完整传输过程

    下图为一次完整的获取设备描述符的过程

    • 传输:获取设备描述符

      • 设置事务:主机向设备下发 -> 80 06 00 01 00 00 40 00

        • 令牌包 --> :SETUP类型
        • 数据包 --> :由于令牌是SETUP类型,所以主机紧接着下发数据包,DATA0类型
        • 握手包 <-- :设备收到数据包,回复应答
      • 输入事务:设备向主机上发 -> 12 01 00 01 DC 00 00 10 71 04 F0 FF 00 01 00 00

        • 令牌包 --> :IN类型,主机准备好,设备可以上发数据
        • 数据包 <-- :DATA1类型:DATA0与DATA1在发送数据时需要交替,DATA中夹带设备描述符
        • 握手包 --> :主机收到回复,向设备应答
      • 输出事务:无

        • 令牌包 --> :OUT类型
        • 数据包 --> :DATA0类型,再一次切换为DATA0,没有需要发送给设备的
        • 握手包 <-- :设备收到数据包,回复应答

    F1.3 基础传输单元:传输基本单元 -- 包(packet)

    不同包的组成部分如下表所示,数字为每一个字段所代表位数。结合上面的完整流程可以更输入的理解包的概念。
    Token 令牌包SYNCPIDADDRENDPCRC5
     8/328745
    Data 数据包SYNCPIDDATACRC16
     8/3280-102316
    Handshake 握手包SYNCPID
     8/328
    SOF 起始包SYNCFrame NumberCRC5
     8/32115
    1. SYNC字段:为固定,FS/LS为8位,HS为32位
    2. PID字段:决定了该包的类型,例如Token包的SETUP,IN,OUT,数据包的DATA0,DATA1,握手包的ACK,NAK等
    3. ADDR字段/ENDP字段:前面说过,一个设备只有一个设备描述符和多个终点描述符,这两个字段就可以在多个设备中准确的找到目标设备以及设备中的目标终点,类似TCP/IP中的IP与PORT
    4. SOF包:在Token包之前发送,Frame Number为主机内部自增序列号,不断循环

      • FS/LS:每1ms发送一次
      • HS:每125us发送一次
    5. EOF:EOF不属于字段或者数据,而是在每个包最后加上2个数据位宽的SE0信号(DM DP都为低),用于表示包的结束

    F1.4 传输流程控制 -- 事务(Transaction)

    在分析那个设备描述符的流程时会发现,必须在每次事务的开始,要使用Token(令牌包)确认该次事务的传输“基调”。原因在于,USB是半双工,DM DP并非独立工作,所以采用"三段式"通讯,保证总线不会冲突

    • 令牌包(Token):主机发起
    • 数据包(Data):根据令牌包中的方向,由主机发起(OUT/SETUP)或者设备发起(IN)数据包
    • 握手包(Handshake):数据包接收方发起握手包,返回状态,包含ACK NAK STALL状态等。

    图片描述

    1. 不能中断:USB的每次事务是“堵塞”,必须该事务完整后才能做其他事务
    2. 状态判断:之前的举例当中,每次传输都是成功的回复了ACK,可以看到,上图中,事务发起了三次IN的Token包,设备才发送了下一帧数据。不会因为设备忙就退出事务。
    3. 流程控制: 下发/接收数据、控制进出方向、确认回复

    F1.5 传输(Transfer)

    终于说到顶层部分了,有点耐心马上就说完了,首先传输分为以下几种方式,对应不同需求
    传输方式令牌包数据包握手包特点及医用特殊性
    控制枚举过程中使用多次事务,简单的下发命令+回复需要2次事务6个包
    批量数据量大,要求准确性,常用于U盘等设备多次事务,DATA0/DATA1交替
    中断数据量小,要求固定频率,常用于USB键盘鼠标与批量相似,主机会按照固定间隔向设备发令牌包
    同步×数据量大,要求低延迟,常用于USB摄像头、声卡无握手包的批量传输

    F1.5.1 控制传输(Control Transfer)

    控制传输常用于USB枚举阶段,读取设备描述符、设置地址等少量频繁的工作。上面举的获取完整设备描述符就是一个非常典型的控制传输过程,分为以下几个阶段
    1. 建立阶段:SETUP事务,发下指定命令,设备应答
    2. 数据过程:设备等待主机发起IN事务,并将数据上传,主机回复应答
    3. 状态过程:确认完成,这个阶段传输方向必须与数据传输阶段相反,数据传输是IN,确认就应该用OUT。

    图片描述

    F1.5.2 批量传输(Bulk Transfer)

    • 区分方向,有批量读与批量写,不能同时执行
    • 一次批量传输由多次事务组成
    • 传输过程中数据包类型DATA0/DATA1不断切换,如果发生错误,则主机会要求重传

    图片描述

    F1.5.3 中断传输(Interrupt Transfer)

    中断传输在数据传输方面与批量传输相同,重点在于,主机对中断传输设备必须 保持固定扫描间隔,在设备描述符中标注了该扫面间隔。USB总线即使被其他设备批量传输占用,也会在完成中间抽空向中断传输设备下发令牌

    F1.5.4 同步传输(Isochronous Transfer)

    因为要求实时性,对数据准确性不是很敏感,所以同步传输中的事务是没有握手包的,如下图

    图片描述

    F2 USB通讯请求 Request

    命令bmRequestTypebRequestwValuewIndexwLengthData
    GET_STATUS 0   
    CLEAR_FEATURE 1   
    SET_FEATURE 3    
    SET_ADDRESS 5设备地址00
    GET_DESCRIPTOR80H6描述符类型+索引0/languageID描述符长度描述符
    SET_DESCRIPTOR 7    
    GET_CONFIGURATION 8    
    SET_CONFIGURATION00H900xxH 配置值,高字节固定0000
    GET_INTERFACE 10    
    SET_INTERFACE 11    
    GET_STATUS 12    

    bmRequest字段

    D7D6-D5D4-D0
    0:OUT
    1:IN
    00:标准请求
    01:类请求
    10:用户自定义
    00:设备
    01:接
    02:端
    03:其他
    •  

     

    from: https://segmentfault.com/a/1190000015995506

    更多相关内容
  • USB学习(一)

    2021-01-06 09:00:11
    USB描述USB学习(一)USB的电气特性USB接口介绍USB的信号走线以及可靠性USB的电流和电压电压下降预算浪涌电流限制驱动特性USB信号特性典型符合信号 USB学习(一) USB规范从1996年开始,正式发布USB1.0,从USB1.0的...
  • stm32 USB学习资料

    2018-07-18 13:03:04
    rar里面有stm32 USB 的培训文档,以及stm32f4xx的usb 官方代码,host,device以及host_device
  • 我觉得吧,学USB单单只靠理论知识是不够的,然后我在某宝上也看到各种各样的USB学习套件,但是感觉都花里胡哨,然后我选了一个比较简约的,参考上面的外设,自己做了一个对应的USB学习板卡,加上立创的5块钱打样...
  • 快速USB学习

    2016-08-23 10:19:09
    嵌入式,单片机用USB的应用广泛,而官方USB协议冗长,此文件适合快速了解学习USB
  • STM32单片机USB 学习资料STM32F10x_USB_培训资料USB程序开发笔记等文档资料: 022525_STM32F10x_USB_学习培训资料.pdf CD00158241.pdf STM32 USB Mass Storage学习资料.pdf STM32的USB详解.pdf STSW-STM32121.zip ...
  • USB学习资料合集

    2016-05-30 18:07:14
    主要是我是用到的USB学习资料,分享给大家
  • STM32 USB 学习资料大全
  • usb学习资料

    2019-01-30 13:54:03
    usb学习资料,包括U盘 hub 还有 core层的实现流程分析和学习
  • STM32-USB学习资料

    2015-10-07 14:04:38
    STM32的USB开发学习资料,有USB学习的相关基础知识。
  • STM32 USB 学习资料.zip

    2020-04-26 14:28:45
    含有STM32 USB MASS STORAGE 学习资料,STM32的详解,基于STM32的USB程序开发笔记等STM32的usb学习资料。
  • USB学习资料

    2018-09-08 11:38:01
    USB的相关学习资料,主要是用单片机来学习usb协议。
  • USB 学习 培训

    2017-03-13 22:07:29
    包含有USB入门必备知识。其中还有ST官方的相关关键培训知识。
  • STM32 USB 学习资料
  • WinUsb学习资料

    2018-09-29 11:08:01
    winusb相关的学习资料,英文的,拿来分享给大家,有需要的可以下载
  • STM32 USB 学习资料

    2014-06-09 17:46:54
    主要是开发过STM32的USB开发人员写的一些技巧。主要包括:STM32 USB Mass Storage学习资料;STM32的USB详解;基于STM32的USB程序开发笔记
  • usb学习[参考].pdf

    2021-10-12 01:10:20
    usb学习[参考].pdf
  • STM32 USB学习资料
  • STM32F-USB学习资料

    2019-01-25 14:30:50
    STM32F-USB学习资料
  • 圈圈教你玩USB学习板 v1.0元件清单
  • 目录 一、整体步骤 二、STM32CubeMX配置 三、usbd_storage_if.c 中的修改 四、注意事项 一、整体步骤 使用STM32CubeMX生成MSC与SDIO模版 在 usbd_storage_if.c 中的 获取容量函数、读函数、写函数中、分别写入SD卡...

    目录

     

    一、整体步骤

    二、STM32CubeMX配置

    三、usbd_storage_if.c 中的修改

    四、注意事项


    一、整体步骤

    1. 使用STM32CubeMX生成MSC与SDIO模版

    2. 在 usbd_storage_if.c 中的 获取容量函数、读函数、写函数中、分别写入SD卡容量信息、SD卡读、SD卡写。

    二、STM32CubeMX配置

    芯片:STM32F407VG

    基本上只需要使用STM32CubeMX给的默认配置就行了

     

     

     

    • 使用到USB,所以堆空间需要分配大一点

    三、usbd_storage_if.c 中的修改

    /* 这里可以放入SD卡的初始化函数 */
    int8_t STORAGE_Init_FS(uint8_t lun)
    {
      /* USER CODE BEGIN 2 */
      return (USBD_OK);
      /* USER CODE END 2 */
    }
    
    /* 获取SD卡容量信息 */
    int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
    {
      /* USER CODE BEGIN 3 */
    	HAL_SD_CardInfoTypeDef info;
    	if(HAL_SD_GetCardState(&hsd) ==  HAL_SD_CARD_TRANSFER)
    	{
    		HAL_SD_GetCardInfo(&hsd, &info);
    		*block_num = info.LogBlockNbr;
    		*block_size = info.LogBlockSize;
    
    		return  USBD_OK;
    	}
    	return  USBD_FAIL;
      /* USER CODE END 3 */
    }
    
    /* 这里可以写入SD卡状态判断 */
    int8_t STORAGE_IsReady_FS(uint8_t lun)
    {
      /* USER CODE BEGIN 4 */
      return (USBD_OK);
      /* USER CODE END 4 */
    }
    
    /* U盘类用户的读函数 */
    int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
    {
      /* USER CODE BEGIN 6 */
        int8_t ret = USBD_FAIL;
        if( HAL_SD_ReadBlocks(&hsd, buf, blk_addr,  blk_len, HAL_MAX_DELAY) == HAL_OK )
        {
        	ret = USBD_OK;
    
            while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY);
            while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER );
        }
    
        return ret;
      /* USER CODE END 6 */
    }
    
    /* U盘类用户的写函数 */
    int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
    {
      /* USER CODE BEGIN 7 */
        int8_t ret = USBD_FAIL;
        if( HAL_SD_WriteBlocks(&hsd, buf, blk_addr, blk_len, HAL_MAX_DELAY) == HAL_OK )
        {
        	ret = USBD_OK;
    
            while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY);
            while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER );
        }
    
        return ret;
      /* USER CODE END 7 */
    }

    四、注意事项

    1. 首先SD可以开启DMA读取或者单纯的SD的中断,但是其中优先级一定要为SD > SD DMA Rx/Tx > USB,不然当SD卡在读写的时候被其他中断打断,会直接导致U盘掉盘,中途卡顿。
    2. 由于是全速FS,USB通信速率最高为12Mbps,所以理论上的读写速度是位于1.5MB/s的。但实际上,经过本人测试,读速度在700KB/s左右,写速度在400KB/s左右。如果需要提高读写速度,则可以把 usbd_conf.h 中的 MSC_MEDIA_PACKET 设置大一点,并且将STM32的堆空间设置的更大一点,这样可以尽可能的接近理论速率。
    展开全文
  • 快速USB 学习USB的优点相信大家都知道了,而且还很赚钱,嘿嘿,这里就不多说,不懂的就去看看书吧,这里要说的是如何快速掌握USB技术
  • 任何USB 设备一旦上电就存在一个信息管道,即默认的控制管道,USB 主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。
  • 这资料很经典,找了好久的资料,今天与大家分享,分享是一种美德,今后会继续上传,请支持!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,686
精华内容 27,474
关键字:

usb学习

友情链接: 36289466.zip