usb电脑重启之后可以识别但是没反应
usbhid手柄,电脑关机后电源是正常的,只有信号断了,再次开机后设备可以识别,但是设备无反应,重新插拔工作正常,各位大佬有遇到过吗?
这个是关机重启正常的代码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
}
}
}
} 这个是没反应的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);
}
电脑重启后USB复位 UsbInBusy 标志没清零。
页:
[1]