查看: 801|回复: 0

[原创] 【MCXC444 分享】5.USB HID双向通信测试

[复制链接]
  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    110

    主题

    3404

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    9002
    最后登录
    2025-7-17
    发表于 2024-11-18 19:52:59 | 显示全部楼层 |阅读模式
         板载有基于type-c 的Full Speed USB接口,在设备使用时这也是常用的外设,正常通讯还是用的到的。原理图如图1所示:
    5-3.png
    图1

    连接图如图2所示:
    5-1.jpg
    图2
    这部分依然参照官方的SDK例程,找到HID例程部分,如图3所示:
    5-4.png
    图3
    读完代码以后,发现例程设置的数据为一帧8个字节,接收到数据以后将数据发送出去。这个在描述符文件中也可以看到。
    为了便于测试,将一帧8个字节修改为一帧64个字节,同时接收和发送数据缓存也修改为64个字节,如下代码所示:
    1. uint8_t g_UsbDeviceHidGenericReportDescriptor[] = {
    2.     0x05U, 0x81U, /* Usage Page (Vendor defined)*/
    3.     0x09U, 0x82U, /* Usage (Vendor defined) */
    4.     0xA1U, 0x01U, /* Collection (Application) */
    5.     0x09U, 0x83U, /* Usage (Vendor defined) */

    6.     0x09U, 0x84U, /* Usage (Vendor defined) */
    7.     0x15U, 0x80U, /* Logical Minimum (-128) */
    8.     0x25U, 0x7FU, /* Logical Maximum (127) */
    9.     0x75U, 0x08U, /* Report Size (8U) */
    10.     0x95U, 0x40U, /* Report Count (8U),0x08 */
    11.     0x81U, 0x02U, /* Input(Data, Variable, Absolute) */

    12.     0x09U, 0x84U, /* Usage (Vendor defined) */
    13.     0x15U, 0x80U, /* Logical Minimum (-128) */
    14.     0x25U, 0x7FU, /* Logical Maximum (127) */
    15.     0x75U, 0x08U, /* Report Size (8U) */
    16.     0x95U, 0x40U, /* Report Count (8U) ,原值为0x08*/
    17.     0x91U, 0x02U, /* Output(Data, Variable, Absolute) */
    18.     0xC0U,        /* End collection */
    19. };
    复制代码
    1. #define USB_HID_GENERIC_IN_BUFFER_LENGTH  (64U) //(8U)
    2. #define USB_HID_GENERIC_OUT_BUFFER_LENGTH (64U) //(8U)
    复制代码


    例程里有一个很有意思的代码如下所示:
    1. USB_DeviceSendRequest(g_UsbDeviceHidGeneric.deviceHandle, USB_HID_GENERIC_ENDPOINT_IN,
    2.                               (uint8_t *)&g_UsbDeviceHidGeneric.buffer[g_UsbDeviceHidGeneric.bufferIndex][0],
    3.                               USB_HID_GENERIC_OUT_BUFFER_LENGTH);
    4.         g_UsbDeviceHidGeneric.bufferIndex ^= 1U;
    5.         return USB_DeviceRecvRequest(g_UsbDeviceHidGeneric.deviceHandle, USB_HID_GENERIC_ENDPOINT_OUT,
    6.                                      (uint8_t *)&g_UsbDeviceHidGeneric.buffer[g_UsbDeviceHidGeneric.bufferIndex][0],
    7.                                      USB_HID_GENERIC_OUT_BUFFER_LENGTH);
    复制代码


    这里其使用了一个双缓冲切换,用于提高数据处理效率。

    实际的测试效果如图4所示:
    5-2.png
    图4


    加油哦
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 18:28 , Processed in 0.092267 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表