1. STM32F4 USB协议研究 - USB协议

USB与USB的通信

https://blog.csdn.net/laifengyuan1/article/details/107954222

1、USB的背景简介

  • USB 是英文 Universal Serial BUS(通用串行总线)的缩写,而其中文简称为通串线, 是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。
  • USB 接口支持设备的即插即用和热插拔功能。
  • USB 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。

2、USB的几种概念

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

只有当一台Host设备与一台Slave设备相链接的时候,才能实现数据传输。
**OTG举例:**当OTG插到电脑上时, OTG的角色就是连接电脑的device,也就是Slave;当USB device 插到OTG上的时候,,OTG的角色就是Host。

3、USB的插入检测

STM32F1自带有USB OTG FS,像STM32F4自带有USB OTG FS (全速)和 USB OTG HS(高速),其中HS要外扩高速PHY芯片实现。

标准 USB 共四根线组成 , 除 VCC/GND 外,另外为 D+和 D-,这两根数据线采用的是差分电压的方式进行数据传输的。

USB Host判断设备端是何种速度设备的判别方法:

  • 在 USB 主机上,D-和 D+都是接了15K 的电阻到地的,所以在没 有设备接入的时候,D+、D-均是低电平。
  • **低速设备:**会在D-(DM)上接一个1.5K 的电阻到VCC
  • **全速设备:**会在D+(DP)上接一个1.5K 的电阻到VCC
  • **高速设备:**会在D+(DP)上接一个1.5K 的电阻到VCC,主机对设备进行复位后进一步进行确认

1、鼠标报文

鼠标发送给PC的数据每次4个字节
BYTE1 BYTE2 BYTE3 BYTE4
定义分别是:

**BYTE1** --  
       |--bit7:   1   表示   Y   坐标的变化量超出-256   ~   255的范围,0表示没有溢出  
       |--bit6:   1   表示   X   坐标的变化量超出-256   ~   255的范围,0表示没有溢出  
       |--bit5:   Y   坐标变化的符号位,1表示负数,即鼠标向下移动  
       |--bit4:   X   坐标变化的符号位,1表示负数,即鼠标向左移动  
       |--bit3:     恒为1  
       |--bit2:     1表示中键按下  
       |--bit1:     1表示右键按下  
       |--bit0:     1表示左键按下  
**BYTE2** -- X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量  
**BYTE3** -- Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量  
**BYTE4** -- 滚轮变化。

2、键盘报文

键盘发送给PC的数据每次8个字节
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8
定义分别是:

**BYTE0** --(0 = OFF,1 = ON,CONSTANT为保留位)  
       |--bit0:   NUM LOCK   
       |--bit1:   CAPS LOCK   
       |--bit2:   SCROLL LOCK   
       |--bit3:   COMPOSE  
       |--bit4:   KANA   
       |--bit5:   CONSTANT   
       |--bit6:   CONSTANT    
       |--bit7:   CONSTANT   
**BYTE1** \--  
       |--bit0:   Left Control是否按下,按下为1  
       |--bit1:   Left Shift  是否按下,按下为1  
       |--bit2:   Left Alt    是否按下,按下为1  
       |--bit3:   Left GUI    是否按下,按下为1  
       |--bit4:   Right Control是否按下,按下为1    
       |--bit5:   Right Shift 是否按下,按下为1  
       |--bit6:   Right Alt   是否按下,按下为1  
       |--bit7:   Right GUI   是否按下,按下为1  
**BYTE2** -- 保留位  
**BYTE3**\--**BYTE8** -- 这六个为普通按键

对应的结构体如下:

/* 鼠标报文结构体 */ 
 struct mouseHID_t {
    
    
      uint8_t buttons;
      int8_t x;
      int8_t y;
      int8_t wheel;
  };
 
/* 发送鼠标报文(一直发送该报文,鼠标会水平向右移动) */
  struct mouseHID_t mouseHID;
  mouseHID.buttons = 0;
  mouseHID.x = 10;
  mouseHID.y = 0;
  mouseHID.wheel = 0;
  USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&mouseHID, sizeof(struct mouseHID_t));

USB HID 描述符

举体细节和工具可以参考USB工具网,使用 http://www.usbzh.com/article/detail-19.html 对应工具生成。

其他参考细节参考:

http://www.usbzh.com/article/detail-13.html
http://www.usbzh.com/article/detail-215.html
https://zhuanlan.zhihu.com/p/427532595

猜你喜欢

转载自blog.csdn.net/bbdxf/article/details/125747265
今日推荐