zoukankan      html  css  js  c++  java
  • 基于STM32CubeMX USB HID 鼠标学习和实现 --前言

      对USB这块,真是小白一个,脑子里一片空白,一点头绪都没,就是拿到人家调好的现成代码都无从下手,

    不知道从哪里开始看起,走的是一个什么样的流程,一查USB相关协议,什么令牌包、数据包、

    握手包,比如SOP-SYNC-Packet Content-EOP, Packet Content又分几大类等,看了还是一头雾水,

    见到代码还是头大。每次都对自己说,这次要好好调试USB开发代码的,几乎每次都是无功而返。

          这两天在网上搜了一些相关资料,发现“手把手教你玩开发”,淘宝上搜这个店铺也能找到相关视频,真是万分感谢

    这段视频的帮助,让我找到了调试USB的切入点。该视频有十五课,目前还没看完,只看到了第十一课。视频中用的是

    STM32+PDIUSBD12 的USB功能,主要是学习usb device 和 host 相关的操作过程,当usb device 接到主机上,

    主机和usb device需要哪些相关的操作,主机才能识别这个usb device,也就是枚举过程。

    大致步骤:

    1、usb device接到主机上,如何告诉主机当前usb device是高速/全速还是低速设备,主机是通过什么样的方式来判断

    >> 主机USB上的D+/D- 默认都有接下拉15K的电阻,所以初始状态都为低电平:

    (1)、usb device 的D+有上拉电阻1.5K至3.3V,接到主机host上,D+上的电平就从低变为高电平,电压V = 15/(15+1.5) * 3.3 =3V,主机就会认这usb device是高速/全速设备

    (2)、usb device 的D-有上拉电阻1.5K至3.3V,接到主机host上,D-上的电平就从低变为高电平,电压V = 15/(15+1.5) * 3.3 =3V,主机就会认这usb device是低速设备

      == 所以调试代码时,先确认这件事,有的是需外部接电阻,有的是通过MCU内部开关打开这个这电阻。

    2、主机检测到有usb device,主机会先对usb device产生一个复位请求,让usb device复位到一个状态。

    >>找到USB中断函数中的复位判断语句,在那打个断点,或是加个打印信息,看主机是不是产生了一个复位请求。

    3、复位产生后,主机会发送一组数据给usb device:0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 这组数据是干嘛用呢,所以MCU必须解析这段数据

    解析之前,MCU肯定是要将这组数据接收到才能解析,问题来了:

    (1)、因为USB 有多个端点 endpoint 0/1/2,主机和下位机收发数据断点必须一致,那、用哪个断点来接收呢?不同端点用来收发什么样的类型数据呢?

    >> 这组数据是主机通过端点0给下位机发的,也就是endpoint -out (out是相对主机,是主机输出),那么下位机得用端点0来收,所以会有先打开端点0 操作

    (2)、数据收到后会存到一个buf中,然后对每个数据进行解析,解析时就要对照 USB2.0 spec资料了,官方下载资料

           https://www.usb.org/developers ->Document Library 点击Access  在搜索条件里输入关键字查找要找的资料下载下来。

        是一个压缩包,里面有多个文档,找到usb_20.pdf

    直接翻到第九章的 --  9.3 USB Device Requests,刚才收到的那组数据就是通过表中来进行解析

  • 相关阅读:
    【LeetCode-树】找树左下角的值
    【LeetCode-贪心】合并区间
    MongoDB3.6版本新增特性
    MongoDB initial sync过程
    MongoDB3.4版本新增特性
    保险配置原则
    MongoDB批量操作时字段为null时没有入库
    Kafka消费者没有收到通知的分析
    Git分支的管理
    NoSQLBooster如何MongoDB的部分文档从一个集合拷贝到另外一个集合中
  • 原文地址:https://www.cnblogs.com/wen2376/p/13567588.html
Copyright © 2011-2022 走看看