IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> HID高速设备1024byte------上下位机搭建 -> 正文阅读

[嵌入式]HID高速设备1024byte------上下位机搭建

? HID设备全称:Human Interface Devices ,我们常使用的鼠标键盘,就是HID设备,当然不止这些了,随着USB速率不断提高,HID设备可以用在很多方面了。另外HID设备有一个优点就是免驱,正因为如此,笔者认为在使用USB通信,做上下位机开发,首选HID。像CDC这种(BULK传输方式),很多时候涉及到驱动问题,操作比较麻烦,特别对于用户小白,压根就不想关心这个,所以不是很建议。

在不同速度下,HID设备端点大小有很大的差异,下面是1笔事务下的速率。

低速设备:最大8byte/10ms 800byte/s 左右

全速设备:最大64byte/1ms 64000byte/s 左右

高速设备:最大1024byte/0.125ms 0.125ms最多可3笔事务,可达 24M/s 左右

前期准备:

1.带USB 2.0高速功能的MCU (笔者使用的NXP RT1052)

2.libusb 1.x 版本

3.VS2015 keil (IDE环境选择很多,因人而异)

下位机

1.描述符基本构成

请添加图片描述

部分描述符展示:

Device Descriptor:
------------------------------
0x12	bLength
0x01	bDescriptorType
0x0200	bcdUSB
0x00	bDeviceClass      
0x00	bDeviceSubClass   
0x00	bDeviceProtocol   
0x40	bMaxPacketSize0   (64 bytes)
0x0483	idVendor
0x5700	idProduct
0x00C8	bcdDevice
0x01	iManufacturer   "L17"
0x02	iProduct        "Hid High Boot"
0x03	iSerialNumber
0x01	bNumConfigurations

Configuration Descriptor:
------------------------------
0x09	bLength
0x02	bDescriptorType
0x0029	wTotalLength   (41 bytes)
0x01	bNumInterfaces
0x01	bConfigurationValue
0x00	iConfiguration
0xC0	bmAttributes   (Self-powered Device)
0x19	bMaxPower      (50 mA)

Interface Descriptor:
------------------------------
0x09	bLength
0x04	bDescriptorType
0x00	bInterfaceNumber
0x00	bAlternateSetting
0x02	bNumEndPoints
0x03	bInterfaceClass      (Human Interface Device Class)
0x00	bInterfaceSubClass   
0x00	bInterfaceProtocol   
0x00	iInterface

HID Descriptor:
------------------------------
0x09	bLength
0x21	bDescriptorType
0x0110	bcdHID
0x21	bCountryCode
0x01	bNumDescriptors
0x22	bDescriptorType   (Report descriptor)
0x001B	bDescriptorLength

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x81	bEndpointAddress  (IN endpoint 1)
0x03	bmAttributes      (Transfer: Interrupt / Synch: None / Usage: Data)
0x0400	wMaxPacketSize    (1 x 1024 bytes)
0x01	bInterval         (1 microframes)

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x02	bEndpointAddress  (OUT endpoint 2)
0x03	bmAttributes      (Transfer: Interrupt / Synch: None / Usage: Data)
0x0400	wMaxPacketSize    (1 x 1024 bytes)
0x01	bInterval         (1 microframes)

除上述展示的描述符外,另外一个特别重要的HID报告描述符也值得注意(特别是:数据域的数量,每个数据域的长度),HID描述符比较复杂就不展开说了,可以下载官方文档或者用报告描述符生成工具去配置深入了解。

Human Interface Devices (HID) Information | USB-IF

HID Descriptor Tool | USB-IF

2.hid发送接收测试

usb_status_t USB_DeviceHidCallback(class_handle_t handle, uint32_t event, void *param)
{
    usb_status_t error = kStatus_USB_Error;

    switch (event)
    {
        case kUSB_DeviceHidEventSendResponse:  //发送完成
		{
			iSSendEnd = true;
		}
		break;

        case kUSB_DeviceHidEventRecvResponse:    
            if (g_UsbDeviceHidGeneric.attach)
            {
			    error = USB_DeviceHidRecv(g_UsbDeviceHidGeneric.hidHandle, USB_HID_GENERIC_ENDPOINT_OUT,
									 (uint8_t *)g_UsbDeviceHidGeneric.buffer,USB_HID_GENERIC_OUT_BUFFER_LENGTH);
				
				HID_SendBuffer((uint8_t *)g_UsbDeviceHidGeneric.buffer);   //将接收的数据转发给上位机
//			    pUSBHidOutCallBack(g_HidOutBuf,USB_HID_GENERIC_OUT_BUFFER_LENGTH);
            }
            break;
        case kUSB_DeviceHidEventGetReport:
        case kUSB_DeviceHidEventSetReport:
        case kUSB_DeviceHidEventRequestReportBuffer:
            error = kStatus_USB_InvalidRequest;
            break;
        case kUSB_DeviceHidEventGetIdle:
        case kUSB_DeviceHidEventGetProtocol:
        case kUSB_DeviceHidEventSetIdle:
        case kUSB_DeviceHidEventSetProtocol:
            break;
        default:
            break;
    }

    return error;
}

usb_status_t HID_SendBuffer(unsigned char* buff)
{
	iSSendEnd = false;
    return USB_DeviceSendRequest(g_UsbDeviceHidGeneric.deviceHandle,USB_HID_GENERIC_ENDPOINT_IN,buff,HS_HID_GENERIC_INTERRUPT_IN_PACKET_SIZE);  
}

下位机将接收到的端点OUT数据,再通过端点IN转发给上位机。

上位机

上位机部分笔者调用的是第三方库:libusb 当然也可以用微软自带库开发。下面简单介绍下,开发流程

1.遍历Windows端口所有usb设备,获取设备数量
libusb_get_device_list

2.遍历所有设备的描述符信息,通过PID VID等信息找到我们指定的设备
libusb_get_device_descriptor

3.打开指定设备
libusb_open

4.根据指定设备查询设备接口类型(项目中有可能是组合设备,存在不同接口类型),找到HID接口,
获取该接口端点IN OUT

5.端点上通信(hid 是中断传输,所以调用中断传输sdk)
libusb_interrupt_transfer

具体代码就不展示了,毕竟也是个人成果。

void CHidDealDlg::OnBnClickedButtonSend()
{
#if 1
	int i;
	for (i=0;i<1024;i++)
	{
		hid20buf[i] = i & 0x00ff;
	}
#endif

	HidDevice.HID20_Write(hid20buf,1024,10);

	InsertMessageToListBox(TEXT("Send 1024 byte data to Mcu!!!"));
}

unsigned int WINAPI  xUSB_RxThread(PVOID lpParameter)
{
	CHidDealDlg* pThis = (CHidDealDlg*)lpParameter;

	int dataLen;

	while (1)
	{
		dataLen = HidDevice.HID20_Read(hid20_Rxbuf,10);

		if (dataLen > 0)
		{
			pThis->InsertMessageToListBox(TEXT("Receive 1024 byte data success!!!"));
		}

		Sleep(1);
	}

	return 0;
}

测试结果如下:

请添加图片描述
请添加图片描述
请添加图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:35:53  更:2022-05-11 16:36:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 12:07:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码