USB HID和CDC数据收发样例程序测试

8 篇文章 0 订阅
1 篇文章 0 订阅

HID例程

GD固件库自定义HID样例程序是收发两个字节控制按键和LED,这里以GD32F10x系列 USB例程讲解怎么实现100字节的数据接收和发送。

例程路径:

测试上位机软件:

例程和测试软件可以到GD官网下载,或找GD代理商和原厂FAE提供。

打开custom_hid工程,修改几个地方:

  1. 先修改报告描述符,在custom_hid_core.c文件里面
    const uint8_t customhid_report_descriptor[DESC_LEN_REPORT] =                    
    {
        0x06, 0x00, 0xFF,  /* USAGE_PAGE (Vendor Defined: 0xFF00) */
        0x09, 0x00,        /* USAGE (Custom Device)               */
        0xa1, 0x01,        /* COLLECTION (Application)            */
        0x09,0x00,
        0x15,0x00,          /* LOGICAL_MINIMUM (0)       */   
        0x26,0xff,0x00,       /* LOGICAL_MAXIMUM (255)       */
        0x75,0x08,        /* REPORT_SIZE (8)           */
        0x95,0x64,        /* REPORT_COUNT (100)       */
        0x81,0x06,         /* INPUT (Data,Var,Abs,Vol) */
        0x09,0x00,
        0x15,0x00,
        0x26,0xff,0x00,
        0x75, 0x08,     /* REPORT_SIZE (8)           */
        0x95, 0x64,     /* REPORT_COUNT (100)       */
        0x91, 0x06,     /* OUTPUT (Data,Var,Abs,Vol) */
        0xc0            /* END_COLLECTION        REPORT    */
    }

  2. 修改报告描述符长度DESC_LEN_REPORT为34,在custom_hid_core.h文件里 
 #define DESC_LEN_REPORT            34

    3. 修改端点IN和OUT数据包长度,改为最大值64,在usbd_conf.h文件里面  

 #define CUSTOMHID_IN_PACKET              64
 #define CUSTOMHID_OUT_PACKET             64

    4. 把custom_hid_init()里面的usbd_ep_recev()函数的接收数据长度的参数改为100

usbd_ep_recev (udev, CUSTOMHID_OUT_EP, hid_handler.data, 100U);

     5.  修改结构体custom_hid_handler中的数组元素data[100],在custom_hid_core.h文件里面

typedef struct {
    uint8_t data[100];                 
    uint8_t reportID;
    uint8_t idlestate;
    uint8_t protocol;
} custom_hid_handler;

     6.  修改custom_hid_data_out(),在custom_hid_core.c文件里面

static uint8_t custom_hid_data_out (usb_dev *udev, uint8_t ep_num)
{
 custom_hid_handler *hid =(custom_hid_handler*)udev>dev.class_data[CUSTOM_HID_INTERFACE];
    switch (hid->data[0]){
    case 0x11U:
        if (RESET != hid->data[1]) {
            gd_eval_led_on(LED5);
        } else {
            gd_eval_led_off(LED5);
        }
        break;
    case 0x12U:
        if (RESET != hid->data[1]) {
            gd_eval_led_on(LED2);
        } else {
            gd_eval_led_off(LED2);
        }
        break;
    case 0x13U:
        if (RESET != hid->data[1]) {
            gd_eval_led_on(LED3);
        } else {
            gd_eval_led_off(LED3);
        }
        break;

    case 0x14U:
        if (RESET != hid->data[1]) {
            gd_eval_led_on(LED4);
        } else {
            gd_eval_led_off(LED4);
        }
        break;
    default:
        break;
    }
    usbd_ep_recev (udev, CUSTOMHID_IN_EP, hid->data, 100U);
	custom_hid_report_send (&custom_hid, hid->data, 100U);	
    return USBD_OK;
}

      7. 编译下载测试

     发送和接收的第一个字节是报告符ID,默认是00,所以发送和接收的字节数是101.

虚拟串口CDC

 例程路径:

例程是通过串口向DEMO板发送多少数据,然后DEMO板通过串口返回多少数据。

把例程改为向上位机发送1K字节数据

  1. 修改app.c文件
 #include "drv_usb_hw.h"
 #include "cdc_acm_core.h"
 #include "systick.h"
 #include <string.h>

 usb_core_driver cdc_acm;
 void my_cdc_acm_data_send (usb_dev *udev, uint8_t* addr, uint32_t len);
/*!
    \brief      main routine will construct a USB virtual ComPort device
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    uint8_t arr1k[1024];
    uint16_t i;
    for(i=0;i<1024;i++){
        arr1k[i] = '0'+i%10;
    }
	char buf1[] = {"\r\n*********************\r\n"};
    systick_config();
    usb_rcu_config();
    usb_timer_init();
    usbd_init (&cdc_acm, USB_CORE_ENUM_FS, &cdc_desc, &cdc_class);   
    usb_intr_config();
    /* main loop */
    while (1) {
        if (USBD_CONFIGURED == cdc_acm.dev.cur_status) {
					delay_1ms(2000);
					my_cdc_acm_data_send (&cdc_acm,  arr1k, 1024);
					my_cdc_acm_data_send (&cdc_acm,  (uint8_t*)buf1, strlen(buf1));
        }
    }
}

void my_cdc_acm_data_send (usb_dev *udev, uint8_t* addr, uint32_t len)
{
    usb_cdc_handler *cdc = (usb_cdc_handler *)udev->dev.class_data[CDC_COM_INTERFACE];

    cdc->packet_sent = 0U;

    usbd_ep_send (udev, CDC_DATA_IN_EP, addr, len);
 }

     2. 添加systick.c和systick.h文件的同时,要在中断函数SysTick_Handler()中添加 delay_decrement(),不然延时不起作用。

void SysTick_Handler(void)
{
	 delay_decrement();
}

     3.  编译下载,串口调试显示如下:

       

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
USB HID设备是一种使用USB接口进行通信的设备,它可以通过发送和接收数据来实现和计算机的交互。为了读写USB HID设备数据,我们需要编写一个程序来实现这个功能。 首先,我们需要使用合适的编程语言和相关的库来开发这样一个程序。对于Windows系统,我们可以使用C#、C++或者Python等语言来编写程序;对于Linux系统,则可以选择C语言、Python等来实现。然后,我们需要选择一个合适的USB库,比如libusb,它提供了一些用于控制USB设备的函数和结构体。 接着,我们需要编写程序来进行USB设备的初始化和连接。一般来说,我们需要找到目标设备的vendor ID和product ID,然后使用相关函数来打开设备并进行数据的读写。 在程序运行的过程中,我们可以使用相关函数来读取设备发送的数据,也可以发送命令或者数据给设备。在读取数据时,我们需要根据设备的协议和数据格式进行解析和处理,以确保能正确地获取到设备发送的信息。 最后,我们需要进行错误处理和资源释放。当程序出现错误时,我们需要进行相应的处理,比如关闭设备,释放相关资源等,以确保程序的稳定性和可靠性。 总的来说,编写USB HID设备数据读写程序是一个需要考虑设备协议、数据格式等因素的复杂任务,但通过合适的编程语言和库的选择,以及认真的编程实现,我们可以成功地实现这一功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值