找回密码
 立即注册
查看: 928|回复: 7

USB HID设备如何使用中断方式发送数据 | 已提供库函数

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-05-14 10:37:39

12

主题

55

回帖

627

积分

高级会员

积分
627
发表于 2024-5-25 22:06:21 | 显示全部楼层 |阅读模式
有个键盘产品,本来使用USB HID键盘数据格式发送数据的,用了一段时间了。客户改需求了,USB HID键盘的数据可以上传,但不能让PC机识别到,所以想到使用USB HID协议只上传数据,参考了STC的《HID(Human Interface Device)协议范例》代码,枚举成功,使用STC-ISP软件的USB-HID助手测试可中断发送和接收,但把发送函数单独拎出来使用,发送失败。

STC万能的技术支持,帮忙看下USB HID如何使用中断发送数据,问题描述如下:


1: USB HID设备,使用中断收发数据,在收到USB HID数据后,立即发送时可以成功的,代码如下:


void usb_out_ep1()
{
        #ifdef        USB_HID_DATA
                u8 Size;
        #endif
        
    BYTE csr;
               
    usb_write_reg(INDEX, 1);                                        //准备使用端点1                                                               
    csr = usb_read_reg(OUTCSR1);                                //读取OUT端点控制状态寄存器
   
    if (csr & OUTSTSTL)                                                        //Send STALL信号发送完成标志
    {
        usb_write_reg(OUTCSR1, OUTCLRDT);                //复位OUT数据切换位
    }
        
    if (csr & OUTOPRDY)                                                        //OUT数据包接收完成
    {
            #ifdef        USB_HID_KEYBOARD
                ReceiveUSBData();
        #endif

       #ifdef        USB_HID_DATA
                        Size = usb_bulk_intr_out(UsbBuffer, 1);                        //接收数据                                
                        usb_bulk_intr_in(UsbBuffer, Size, 1);                                //发送数据

                        //usb_bulk_intr_in(UsbBuffer, usb_bulk_intr_out(UsbBuffer, 1), 1);    //STC的《HID(Human Interface Device)协议范例》参考代码,功能测试,收到的数据原路返回
        #endif
    }
}


USB中断发送函数:

void usb_bulk_intr_in(BYTE *pData, BYTE bSize, BYTE ep)
{
    usb_write_fifo((BYTE)(FIFO0 + ep), pData, bSize);
    usb_write_reg(INCSR1, INIPRDY);
}


2:  单独把发送函数拎出来,然后调用此函数,发送失败,如下。

void USBSendData(u8 newdata)
{


#ifdef        USB_HID_DATA
        u8 i;

        for(i=0; i<8; i++)
                UsbBuffer = newdata;               
        
    usb_write_reg(INDEX, 1);
    while (usb_read_reg(INCSR1) & INIPRDY);
    usb_bulk_intr_in(UsbBuffer, 64, 1);         
        

    MCU_RUN_LED_PIN = ~MCU_RUN_LED_PIN;
#endif
}


请问有没高手指点迷津,研究USB设备实在太花时间,目前着急解决客户问题。

目前的需求是,按一个键,可以任意配置发什么数据给上位机,上位机能接收到一串数据,但不能用HID键盘数据格式。

目前应急办法是使用HID键盘数据格式,把数据放在第二个字节,其它7个字节全部填0。

键盘的HID数据格式如下:

/*
Input Report:
0   Modifierkeys (D0:LCtrl D1:LShift D2:LAlt D3:LGui D4:RCtrl D5:RShift D6:RAlt D7:RGui)
1        Reserved
2        Keycode 1
3        Keycode 2
4        Keycode 3
5        Keycode 4
6        Keycode 5
7        Keycode 6
Output Report:
0   LEDs (D0:NumLock D1:CapLock D2:ScrollLock)
*/




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:459
  • 最近打卡:2025-06-16 00:13:00
已绑定手机

37

主题

2221

回帖

2658

积分

荣誉版主

积分
2658
发表于 2024-5-25 23:47:28 | 显示全部楼层
USB中断发送函数:
感觉你这个函数里面缺了东西
void usb_bulk_intr_in(BYTE *pData, BYTE bSize, BYTE ep)
{
    usb_write_reg(INDEX, 1);     //准备使用端点1   把这句加进去试试
    usb_write_fifo((BYTE)(FIFO0 + ep), pData, bSize);
    usb_write_reg(INCSR1, INIPRDY);
}
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-05-14 10:37:39

12

主题

55

回帖

627

积分

高级会员

积分
627
发表于 2024-5-28 21:58:38 | 显示全部楼层
试过了,没成功。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16651
发表于 2024-5-29 18:58:38 | 显示全部楼层
已请内部增加 USB-HID 的中断库函数
已请内部增加 HID转串口@STC-ISP
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:88
  • 最近打卡:2025-05-14 10:37:39

12

主题

55

回帖

627

积分

高级会员

积分
627
发表于 2024-5-29 20:11:44 | 显示全部楼层
使用以下代码可以发送成功
#ifdef        USB_HID_DATA       

                for(i=0; i<64; i++)                                                        //清除发送缓冲区
                        key[i] = newdata;
                               
                IE2 &= ~0x80;                                                                //EUSB = 0;
                UsbInBusy = 1;
                usb_write_reg(INDEX, 1);
                for (i=0; i<64; i++)                                                //需要与描述符的字节数量保持一致,否则HID工具收不到数据       
                        usb_write_reg(FIFO1, key[i]);                        //发送按键码               
               
                usb_write_reg(INCSR1, INIPRDY);
                IE2 |= 0x80;                                                                //EUSB = 1;
       
#endif
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16651
发表于 2024-5-30 14:01:09 | 显示全部楼层
截图202405301400502907.jpg


https://www.stcaimcu.com/forum.p ... ;tid=2392&page=
中断模式的 USB-CDC/虚拟串口库函数 及使用说明
中断模式的 HID库函数 及使用说明,2024/5/30更新
===STC32G12K128 / STC8H8K64U
===USB-CDC虚拟串口/就是最简单的串口, WIN10 及以后都不用装驱动了!!!
===USB-HID, 是免驱动安装的 !!!


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-06-03 11:49:33

26

主题

168

回帖

1251

积分

金牌会员

积分
1251
发表于 2024-5-31 14:19:06 | 显示全部楼层
神*** 发表于 2024-5-29 18:58
已请内部增加 USB-HID 的中断库函数
已请内部增加 HID转串口@STC-ISP

“已请内部增加 HID转串口@STC-ISP”这个居然也帮忙申请了,但是好像没看到

点评

后续有时间会加进去的,以前就做过: HID转CAN  详情 回复 发表于 2024-6-1 20:03
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16651
发表于 2024-6-1 20:03:10 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 06:22 , Processed in 0.141692 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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