找回密码
 立即注册
查看: 634|回复: 3

usb电脑重启之后可以识别但是没反应

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-1-31 10:37:50 | 显示全部楼层 |阅读模式
Snipaste_2024-01-31_10-34-26.png

usbhid手柄,电脑关机后电源是正常的,只有信号断了,再次开机后设备可以识别,但是设备无反应,重新插拔工作正常,各位大佬有遇到过吗?
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-1-31 10:53:13 | 显示全部楼层
这个是关机重启正常的代码
  1. void usb_class_in()
  2. {
  3.     BYTE button[3]; // 声明一个名为button的3个字节大小的数组,用于存储按钮状态
  4.     BYTE i; // 声明一个字节大小的变量i,用于循环计数
  5.     if (DeviceState != DEVSTATE_CONFIGURED)
  6.         return; // 如果设备状态不是已配置状态,就立即返回,不执行后续代码
  7.        
  8.        
  9.     if (!UsbInBusy&& fKeyOK )//
  10.     {
  11.         fKeyOK = 0;
  12.                
  13.         // 初始化按钮状态数组为0
  14.         for (i = 0; i < 3; i++) {
  15.             button[i] = 0;
  16.         }
  17.                 // 增加按钮
  18.         // 检查按键状态并设置对应的位
  19.         if (bKeyCode & 0x01) {
  20.             button[0] |= 0x01;
  21.         }
  22.         if (bKeyCode & 0x02) {
  23.             button[0] |= 0x02;
  24.         }
  25.                 if (bKeyCode & 0x04) {
  26.             button[0] |= 0x04;
  27.         }
  28.                 //继续检查其他按键状态并设置相应的位
  29.         IE2 &= ~0x80; // 清除IE2寄存器中的特定位,可能用于禁用某些USB中断
  30.         UsbInBusy = 1; // 设置UsbInBusy标志为1,表示USB输入忙
  31.         usb_write_reg(INDEX, 1); // 调用usb_write_reg函数,向USB设备的INDEX寄存器写入值1
  32.         for (i = 0; i < 3; i++)
  33.         {
  34.             usb_write_reg(FIFO1, button[i]); // 循环将按钮状态写入USB设备的FIFO1寄存器
  35.         }
  36.         usb_write_reg(INCSR1, INIPRDY); // 调用usb_write_reg函数,向USB设备的INCSR1寄存器写入INIPRDY值
  37.         IE2 |= 0x80; // 设置IE2寄存器的特定位,可能用于启用某些USB中断
  38.     }
  39. }
  40. void configure_P14_P15_P36_as_digital_inputs_with_pullup()
  41. {P1M1 &= ~0x01;   // 设置P1.0为输入模式,清除P1.0的P1M1位
  42. P1M0 |= 0x01;    // 设置P1.0为数字输入模式,置位P1.0的P1M0位
  43. P3M1 &= ~0x08;   // 设置P3.3为输入模式,清除P3.3的P3M1位
  44. P3M0 |= 0x08;    // 设置P3.3为数字输入模式,置位P3.3的P3M0位
  45. P3M1 &= ~0x40;   // 设置P3.6为输入模式,清除P3.6的P3M1位
  46. P3M0 |= 0x40;    // 设置P3.6为数字输入模式,置位P3.6的P3M0位
  47. }
  48. void scan_key()
  49. {
  50.     BYTE key;
  51.     configure_P14_P15_P36_as_digital_inputs_with_pullup(); // 配置 P14、P15 和 P36 为数字输入并启用上拉电阻
  52.     key = 0;      // 初始化按键状态变量 key 为 0
  53.     // 通过 P14、P15 和 P36 读取按钮状态,并将其存储到 key 变量中
  54.     key |= ((P10 == 0) ? 0x01 : 0x00); // 如果 P14 按键连接到 Vcc(高电平),设置 key 的第 0 位为 1,否则为 0
  55.     key |= ((P33 == 0) ? 0x02 : 0x00); // 如果 P15 按键连接到 Vcc(高电平),设置 key 的第 1 位为 1,否则为 0
  56.     key |= ((P36 == 0) ? 0x04 : 0x00); // 如果 P36 按键连接到 Vcc(高电平),设置 key 的第 2 位为 1,否则为 0
  57.     if (key != bKeyCode)
  58.     {
  59.         bKeyCode = key; // 如果检测到按键状态发生变化,则更新 bKeyCode 变量为当前按键状态
  60.         bKeyDebounce = 20; // 并设置按键抖动计数器为 20,用于处理按键抖动
  61.     }
  62.     else
  63.     {
  64.         if (bKeyDebounce)
  65.         {
  66.             bKeyDebounce--; // 如果按键抖动计数器不为 0,则递减计数器
  67.             if (bKeyDebounce == 0)
  68.             {
  69.                 fKeyOK = 1; // 如果按键抖动计数器达到 0,表示按键稳定,将 fKeyOK 标志置为 1
  70.             }
  71.         }
  72.     }
  73. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:71
  • 最近打卡:2025-04-18 11:38:43
已绑定手机

47

主题

96

回帖

355

积分

中级会员

积分
355
发表于 2024-1-31 10:53:45 | 显示全部楼层
这个是没反应的
  1. void usb_class_in()
  2. {
  3.         BYTE i;
  4.     if (DeviceState != DEVSTATE_CONFIGURED)
  5.         return;
  6.     if (!UsbInBusy) {
  7.         UsbInBusy = 1;
  8.         IE2 &= ~0x80;  // 清除USB中断标志位(禁用USB中断)
  9.         usb_write_reg(INDEX, 1);  // 选择USB寄存器的索引为1
  10.                 for (i = 0; i < 5; i++)
  11.         {
  12.             usb_write_reg(FIFO1, keyPadData[i]); // 循环将按钮状态写入USB设备的FIFO1寄存器
  13.         }
  14.         usb_write_reg(INCSR1, INIPRDY);  // 向INCSR1寄存器写入值,表示准备好发送数据
  15.         IE2 |= 0x80;  // 启用USB中断
  16.     }
  17.        
  18.    
  19. }
  20. // 转换摇杆ADC值的函数
  21. int joyConvert(int channel) {
  22.     static int emaValue = 0;
  23.     static int isEmaInitialized = 0;
  24.     u16 retValue = Get_ADC12bitResult(channel);
  25.     int retValueAverage = retValue;
  26.     if (!isEmaInitialized) {
  27.         emaValue = retValueAverage;
  28.         isEmaInitialized = 1;
  29.     } else {
  30.         emaValue = (int)(ALPHA * retValueAverage + (1.0 - ALPHA) * emaValue);
  31.     }
  32.     if (emaValue < 10 || !isEmaInitialized) {
  33.         return 0;
  34.     }
  35.     return emaValue;
  36. }
  37. // 发送键盘数据的函数
  38. void SendPadData(void) {
  39.     int LRXCode = 0x00;
  40.     int currentJoyValue;
  41.     int lowerBound;
  42.     int upperBound;
  43.         P1M1 &= ~0x01;   // 设置 P1.0 为输入模式,清除 P1.0 的 P1M1 位
  44.     P1M0 |= 0x01;    // 设置 P1.0 为数字输入模式,置位 P1.0 的 P1M0 位
  45.          keyPadData[0] = (P1 == 0) ? 0x01 : 0x00;
  46.     currentJoyValue = joyConvert(1);
  47.     // 如果是第一次调用函数,初始化最大值和最小值
  48.     if (!isInitialized && currentJoyValue > 2110) {
  49.         minJoyValue = currentJoyValue;
  50.         maxJoyValue = currentJoyValue;
  51.         isInitialized = 1;
  52.     }
  53.     if (!isInitialized) {
  54.         return;
  55.     }
  56.     if (currentJoyValue > maxJoyValue) {
  57.         maxJoyValue = currentJoyValue;
  58.     }
  59.     if (currentJoyValue < minJoyValue) {
  60.         minJoyValue = currentJoyValue;
  61.     }
  62.     lowerBound = minJoyValue + (int)(0.1 * (maxJoyValue - minJoyValue));
  63.     upperBound = minJoyValue + (int)(0.65 * (maxJoyValue - minJoyValue));
  64.    
  65.     if (currentJoyValue <= lowerBound) {
  66.         LRXCode = 0;
  67.     } else if (currentJoyValue >= upperBound) {
  68.         LRXCode = 32767;
  69.     } else {
  70.         LRXCode = (int)(((currentJoyValue - lowerBound) * (32767.0 / (upperBound - lowerBound))));
  71.     }
  72.     keyPadData[1] = (BYTE)(LRXCode & 0xFF);
  73.     keyPadData[2] = (BYTE)((LRXCode >> 8) & 0xFF);
  74. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-04-28 08:34:00
已绑定手机

5

主题

118

回帖

674

积分

高级会员

积分
674
发表于 2024-11-13 10:17:49 | 显示全部楼层
电脑重启后USB复位 UsbInBusy 标志没清零。
高级软件工程师-唐工
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:47 , Processed in 0.150666 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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