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