爱吃西红柿 发表于 2024-1-31 10:37:50

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



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

爱吃西红柿 发表于 2024-1-31 10:53:13

这个是关机重启正常的代码void usb_class_in()
{
    BYTE button; // 声明一个名为button的3个字节大小的数组,用于存储按钮状态
    BYTE i; // 声明一个字节大小的变量i,用于循环计数

    if (DeviceState != DEVSTATE_CONFIGURED)
      return; // 如果设备状态不是已配置状态,就立即返回,不执行后续代码
       
       

    if (!UsbInBusy&& fKeyOK )//
    {
      fKeyOK = 0;


               
      // 初始化按钮状态数组为0
      for (i = 0; i < 3; i++) {
            button = 0;
      }
                // 增加按钮
      // 检查按键状态并设置对应的位
      if (bKeyCode & 0x01) {
            button |= 0x01;
      }
      if (bKeyCode & 0x02) {
            button |= 0x02;
      }
                if (bKeyCode & 0x04) {
            button |= 0x04;
      }

                //继续检查其他按键状态并设置相应的位

      IE2 &= ~0x80; // 清除IE2寄存器中的特定位,可能用于禁用某些USB中断
      UsbInBusy = 1; // 设置UsbInBusy标志为1,表示USB输入忙
      usb_write_reg(INDEX, 1); // 调用usb_write_reg函数,向USB设备的INDEX寄存器写入值1
      for (i = 0; i < 3; i++)
      {
            usb_write_reg(FIFO1, button); // 循环将按钮状态写入USB设备的FIFO1寄存器
      }
      usb_write_reg(INCSR1, INIPRDY); // 调用usb_write_reg函数,向USB设备的INCSR1寄存器写入INIPRDY值
      IE2 |= 0x80; // 设置IE2寄存器的特定位,可能用于启用某些USB中断
    }
}



void configure_P14_P15_P36_as_digital_inputs_with_pullup()
{P1M1 &= ~0x01;   // 设置P1.0为输入模式,清除P1.0的P1M1位
P1M0 |= 0x01;    // 设置P1.0为数字输入模式,置位P1.0的P1M0位

P3M1 &= ~0x08;   // 设置P3.3为输入模式,清除P3.3的P3M1位
P3M0 |= 0x08;    // 设置P3.3为数字输入模式,置位P3.3的P3M0位

P3M1 &= ~0x40;   // 设置P3.6为输入模式,清除P3.6的P3M1位
P3M0 |= 0x40;    // 设置P3.6为数字输入模式,置位P3.6的P3M0位


}

void scan_key()
{
    BYTE key;
    configure_P14_P15_P36_as_digital_inputs_with_pullup(); // 配置 P14、P15 和 P36 为数字输入并启用上拉电阻
    key = 0;      // 初始化按键状态变量 key 为 0

    // 通过 P14、P15 和 P36 读取按钮状态,并将其存储到 key 变量中
    key |= ((P10 == 0) ? 0x01 : 0x00); // 如果 P14 按键连接到 Vcc(高电平),设置 key 的第 0 位为 1,否则为 0
    key |= ((P33 == 0) ? 0x02 : 0x00); // 如果 P15 按键连接到 Vcc(高电平),设置 key 的第 1 位为 1,否则为 0
    key |= ((P36 == 0) ? 0x04 : 0x00); // 如果 P36 按键连接到 Vcc(高电平),设置 key 的第 2 位为 1,否则为 0

    if (key != bKeyCode)
    {
      bKeyCode = key; // 如果检测到按键状态发生变化,则更新 bKeyCode 变量为当前按键状态
      bKeyDebounce = 20; // 并设置按键抖动计数器为 20,用于处理按键抖动
    }
    else
    {
      if (bKeyDebounce)
      {
            bKeyDebounce--; // 如果按键抖动计数器不为 0,则递减计数器
            if (bKeyDebounce == 0)
            {
                fKeyOK = 1; // 如果按键抖动计数器达到 0,表示按键稳定,将 fKeyOK 标志置为 1
            }
      }
    }
}

爱吃西红柿 发表于 2024-1-31 10:53:45

这个是没反应的void usb_class_in()
{
        BYTE i;

    if (DeviceState != DEVSTATE_CONFIGURED)
      return;
    if (!UsbInBusy) {

      UsbInBusy = 1;
      IE2 &= ~0x80;// 清除USB中断标志位(禁用USB中断)
      usb_write_reg(INDEX, 1);// 选择USB寄存器的索引为1
                for (i = 0; i < 5; i++)
      {
            usb_write_reg(FIFO1, keyPadData); // 循环将按钮状态写入USB设备的FIFO1寄存器
      }

      usb_write_reg(INCSR1, INIPRDY);// 向INCSR1寄存器写入值,表示准备好发送数据
      IE2 |= 0x80;// 启用USB中断
    }
       
   
}

// 转换摇杆ADC值的函数
int joyConvert(int channel) {
    static int emaValue = 0;
    static int isEmaInitialized = 0;

    u16 retValue = Get_ADC12bitResult(channel);
    int retValueAverage = retValue;

    if (!isEmaInitialized) {
      emaValue = retValueAverage;
      isEmaInitialized = 1;
    } else {
      emaValue = (int)(ALPHA * retValueAverage + (1.0 - ALPHA) * emaValue);
    }

    if (emaValue < 10 || !isEmaInitialized) {
      return 0;
    }

    return emaValue;
}


// 发送键盘数据的函数
void SendPadData(void) {
    int LRXCode = 0x00;
    int currentJoyValue;
    int lowerBound;
    int upperBound;

        P1M1 &= ~0x01;   // 设置 P1.0 为输入模式,清除 P1.0 的 P1M1 位
    P1M0 |= 0x01;    // 设置 P1.0 为数字输入模式,置位 P1.0 的 P1M0 位
       keyPadData = (P1 == 0) ? 0x01 : 0x00;

    currentJoyValue = joyConvert(1);

    // 如果是第一次调用函数,初始化最大值和最小值
    if (!isInitialized && currentJoyValue > 2110) {
      minJoyValue = currentJoyValue;
      maxJoyValue = currentJoyValue;
      isInitialized = 1;
    }



    if (!isInitialized) {
      return;
    }

    if (currentJoyValue > maxJoyValue) {
      maxJoyValue = currentJoyValue;
    }

    if (currentJoyValue < minJoyValue) {
      minJoyValue = currentJoyValue;
    }

    lowerBound = minJoyValue + (int)(0.1 * (maxJoyValue - minJoyValue));
    upperBound = minJoyValue + (int)(0.65 * (maxJoyValue - minJoyValue));
   

    if (currentJoyValue <= lowerBound) {
      LRXCode = 0;
    } else if (currentJoyValue >= upperBound) {
      LRXCode = 32767;
    } else {
      LRXCode = (int)(((currentJoyValue - lowerBound) * (32767.0 / (upperBound - lowerBound))));
    }



    keyPadData = (BYTE)(LRXCode & 0xFF);
    keyPadData = (BYTE)((LRXCode >> 8) & 0xFF);
}

496649247 发表于 2024-11-13 10:17:49

电脑重启后USB复位 UsbInBusy 标志没清零。
页: [1]
查看完整版本: usb电脑重启之后可以识别但是没反应