【请问 ch374 设置NUMlock指示灯问题】

有一个问题,为什么设置Set_Report()键盘数字灯只是亮一下 就熄灭了 请问什么原因, buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //设置报表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //设置报告出错 //if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 } UploadImages/201272810295895.rar

设置命令成功了吗?按照SET-REPORT命令应该是可以点灯的。除非这条命令没有发送成功。


应该成功啦 , 指示灯只亮一下 ,之后就不亮了~!不知道是我程序哪里的原因


Set_Report命令紧接着得发个OUT命令,此时OUT对应的endp in addr=0,而不是endp in addr=1,点灯是对端点0操作的


UINT8 HostCtrlTransfer374( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 如果需要接收和发送数据,那么DatBuf需指向有效缓冲区用于存放后续数据,实际成功收发的总长度保存在ReqLen指向的字节变量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP阶段,200mS超时 if ( s == USB_INT_SUCCESS ) // SETUP成功 { tog = TRUE; // 默认DATA1,默认无数据故状态阶段为IN if((*(ReqBuf+3))==0x22) { total=*( ReqBuf + 6 )-0x40; } else total = *( ReqBuf + 6 ); if ( total && DatBuf ) // 需要收数据 { len = total; if ( *ReqBuf & 0x80 ) // 收 { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_IN, tog, 200 ); // IN数据 if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包 tog = tog ? FALSE : TRUE; } tog = FALSE; // 状态阶段为OUT } else { // 发 while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_LENGTH, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // OUT数据 if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? FALSE : TRUE; } tog = TRUE; // 状态阶段为IN } total -= len; // 减去剩余长度得实际传输长度 } if ( s == USB_INT_SUCCESS ) // 数据阶段成功 { Write374Byte( REG_USB_LENGTH, 0 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), TRUE, 200 ); // STATUS阶段 if ( tog && s == USB_INT_SUCCESS ) // 检查IN状态返回数据长度 { if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; // 状态阶段错误 } } } if ( RetLen ) *RetLen = total; // 实际成功收发的总长度 return( s ); }

UINT8 Set_Report(unsigned char *p) { UINT8 s,l=1; s=HostCtrlTransfer374(SetupSetReport,p,&l); //实际的数据可以写别的数据,这个你可以用计算机抓下数据在发下去 return s; }

Set_Report fun里面调用了HostCtrlTransfer374 里面已经包含了对 相应的操作, 请问如何 发送OUT 命令,


HostCtrlTransfer374 里面已经包含了对 相应的操作, s = HostTransact374( i & 0x7F, DEF_USB_PID_IN, i & 0x80 ); // CH374传输事务,获取数据 if ( s == USB_INT_SUCCESS ) { i ^= 0x80; // 同步标志翻转 // 保存同步标志位 RootHubDev[n].Endp_Attr[0] = i; i = Read374Byte( REG_USB_LENGTH ); // 接收到的数据长度 if ( i ) { Read374Block( RAM_HOST_RECV, i, TempBuf ); // 取出数据并打印 if(TempBuf[2]==0x53){ //是MumLock ,用于开启键盘灯 if(Led_Flag&0x01){ buffer[0] = Led_Flag&0XFE; } else{ buffer[0] = Led_Flag|0X01; } Led_Flag =Led_Flag^0x01; s = Set_Report(RootHubDev[n].bInterfaceList[0], buffer ); //点灯 printf("s=%d\n",(UINT16)s); } else if(TempBuf[2]==0x39){ if(Led_Flag&0x02){ buffer[0] = Led_Flag&0XFD; } else{ buffer[0] = Led_Flag|0X02; } Led_Flag =Led_Flag^0x02; s = Set_Report(RootHubDev[n].bInterfaceList[0], buffer ); } else if(TempBuf[2]==0x47){ if(Led_Flag&0x04){ buffer[0] = Led_Flag&0XFB; } else{ buffer[0] = Led_Flag|0X04; } Led_Flag =Led_Flag^0x04; s = Set_Report( RootHubDev[n].bInterfaceList[0],buffer ); }


我 按照你的代码修改的,可是 NUMlock 灯 还是亮一下就熄灭了了 我新建立一个HostCtrlTransfer374 函数 UINT8 HostCtrlTransfer374_1( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen ) // 如果需要接收和发送数据,那么DatBuf需指向有效缓冲区用于存放后续数据,实际成功收发的总长度保存在ReqLen指向的字节变量中 { UINT8 s, len, count, total; BOOL tog; Write374Block( RAM_HOST_TRAN, 8, ReqBuf ); Write374Byte( REG_USB_LENGTH, 8 ); mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_SETUP, FALSE, 200 ); // SETUP阶段,200mS超时 if ( s == USB_INT_SUCCESS ) // SETUP成功 { tog = TRUE; // 默认DATA1,默认无数据故状态阶段为IN if((*(ReqBuf+3))==0x22) { total=*( ReqBuf + 6 )-0x40; } else total = *( ReqBuf + 6 ); if ( total && DatBuf ) // 需要收数据 { len = total; if ( *ReqBuf & 0x80 ) // 收 { while ( len ) { mDelayuS( 100 ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // IN数据 if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包 tog = tog ? FALSE : TRUE; } tog = FALSE; // 状态阶段为OUT } else { // 发 while ( len ) { mDelayuS( 100 ); count = len >= UsbDevEndpSize ? UsbDevEndpSize : len; Write374Block( RAM_HOST_TRAN, count, DatBuf ); Write374Byte( REG_USB_H_PID, count ); s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // OUT数据 if ( s != USB_INT_SUCCESS ) break; DatBuf += count; len -= count; tog = tog ? FALSE : TRUE; } tog = TRUE; // 状态阶段为IN } total -= len; // 减去剩余长度得实际传输长度 } // if ( s == USB_INT_SUCCESS ) // 数据阶段成功 // { // Write374Byte( REG_USB_LENGTH, 0 ); // mDelayuS( 100 ); // s = WaitHostTransact374( 0, ( tog ? DEF_USB_PID_IN : DEF_USB_PID_OUT ), TRUE, 200 ); // STATUS阶段 // if ( tog && s == USB_INT_SUCCESS ) // 检查IN状态返回数据长度 // { // if ( Read374Byte( REG_USB_LENGTH ) ) s = USB_INT_BUF_OVER; // 状态阶段错误 // } // } }

我每条语句都仔细看了 看不出什么不对


s = WaitHostTransact374( 0, DEF_USB_PID_OUT, tog, 200 ); // 执行这条语句的时候 灯闪一下 之后反应了


用这个函数 HostCtrlTransfer374执行,DatBuf中装数据---灯的状态(一个字节)


我是用这个函数啊 问题解决不了


DatBuf里面的数据是多少


0x01, 我从0x00 到 0xff 都试过了


我已经把我的代码 上传上去了,这个问题困扰我很久了,麻烦 WanJ 你帮忙 查看一下


你在发送完SET-REPORT控制请求后加一个死循环在那边,你看下等还会不会灭掉。实在不行可以讲你的键盘发至我司帮你调试软件。


加死循环 还是如此 我的实验板就一块。


我想问 SetupSetReport[]={0x21,0x09,0x00,0x02,0x00,0x00,0x01,0x00}; 这个数组里的数据是怎么得到的 还有 NumLock 跟这些数据有关系么


只有登录才能回复,可以选择微信账号登录