找回密码
 立即注册
查看: 153|回复: 2

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

[复制链接]
  • TA的每日心情
    擦汗
    4 天前
  • 签到天数: 30 天

    [LV.5]常住居民I

    27

    主题

    70

    回帖

    423

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    擦汗
    4 天前
  • 签到天数: 30 天

    [LV.5]常住居民I

    27

    主题

    70

    回帖

    423

    积分

    中级会员

    积分
    423
     楼主| 发表于 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. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    4 天前
  • 签到天数: 30 天

    [LV.5]常住居民I

    27

    主题

    70

    回帖

    423

    积分

    中级会员

    积分
    423
     楼主| 发表于 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. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-18 19:36 , Processed in 0.074491 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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