古人来者_昌 发表于 2024-5-25 22:06:21

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

有个键盘产品,本来使用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)
*/




晓飛飛 发表于 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);
}

古人来者_昌 发表于 2024-5-28 21:58:38

试过了,没成功。

神农鼎 发表于 2024-5-29 18:58:38

已请内部增加 USB-HID 的中断库函数
已请内部增加 HID转串口@STC-ISP

古人来者_昌 发表于 2024-5-29 20:11:44

使用以下代码可以发送成功
#ifdef        USB_HID_DATA       

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

神农鼎 发表于 2024-5-30 14:01:09




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


ahong 发表于 2024-5-31 14:19:06

神农鼎 发表于 2024-5-29 18:58
已请内部增加 USB-HID 的中断库函数
已请内部增加 HID转串口@STC-ISP

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

神农鼎 发表于 2024-6-1 20:03:10

ahong 发表于 2024-5-31 14:19
“已请内部增加 HID转串口@STC-ISP”这个居然也帮忙申请了,但是好像没看到 ...
后续有时间会加进去的,以前就做过: HID转CAN






CAN视频教学, USB 转 2组CAN, STC-ISP V6.94E 【CAN助手】收发测试 - CAN/Lin/CANOpen/已通过车规 AEC-Q100 Grade1(-40 ~ +125度) 国芯技术交流网站 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)



页: [1]
查看完整版本: USB HID设备如何使用中断方式发送数据 | 已提供库函数