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)
*/
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);
} 试过了,没成功。 已请内部增加 USB-HID 的中断库函数
已请内部增加 HID转串口@STC-ISP 使用以下代码可以发送成功
#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
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2392&page=
中断模式的 USB-CDC/虚拟串口库函数 及使用说明
中断模式的 HID库函数 及使用说明,2024/5/30更新
===STC32G12K128 / STC8H8K64U
===USB-CDC虚拟串口/就是最简单的串口, WIN10 及以后都不用装驱动了!!!
===USB-HID, 是免驱动安装的 !!!
神农鼎 发表于 2024-5-29 18:58
已请内部增加 USB-HID 的中断库函数
已请内部增加 HID转串口@STC-ISP
“已请内部增加 HID转串口@STC-ISP”这个居然也帮忙申请了,但是好像没看到 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]