- 打卡等级:常住居民II
- 打卡总天数:88
- 最近打卡:2025-05-14 10:37:39
高级会员
- 积分
- 627
|
有个键盘产品,本来使用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)
*/
|
|