各位好 我原來(lái)用CH374S做了鍵盤(pán) 用到現(xiàn)在很正常 這次想添加接收PC的NUMLOCK SCROLLLOCK燈的狀態(tài) 該如何入手 有沒(méi)有例程可提供啊 謝謝各位啦
你可以到這個(gè)里面去下載例子程序: http://m.findthetime.net/bbs/View.asp?S=101&I=19463 發(fā)送SET_REPORT命令就可以點(diǎn)燈了。
鏈接里的都是作為主機(jī)來(lái)點(diǎn)燈的例子,我想要的是有沒(méi)有作為設(shè)備接收點(diǎn)燈信號(hào)的例子
引用回復(fù): 各位好 我原來(lái)用CH374S做了鍵盤(pán) 用到現(xiàn)在很正常 這次想添加接收PC的NUMLOCK SCROLLLOCK燈的狀態(tài) 該如何入手 有沒(méi)有例程可提供啊 謝謝各位啦
在接收到PC的set_report中斷后該怎么做,在下面的中斷程序中怎么改 void USB_DeviceInterrupt( void ) { UCHAR8 s, l,j; static UCHAR8 SetupLen,SetupReq,i=0,k=0; static PUINT8 pDescr; s = Read374Byte( REG_INTER_FLAG ); // 獲取中斷狀態(tài) if ( s & BIT_IF_BUS_RESET )// USB總線復(fù)位 { Write374Byte( REG_USB_ADDR, 0x00 ); // 清USB設(shè)備地址 Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( 0 ) );//清端點(diǎn)0緩沖區(qū) Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( 0 ) );//清端點(diǎn)1緩沖區(qū) Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( 0 ) );//清端點(diǎn)2緩沖區(qū) Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_BUS_RESET ); // 清中斷標(biāo)志 } else if ( s & BIT_IF_TRANSFER ) // USB傳輸完成 { s = Read374Byte( REG_USB_STATUS ); //獲取中斷狀態(tài) switch( s & BIT_STAT_PID_ENDP ) //分析USB設(shè)備中斷狀態(tài);本例未用端點(diǎn)2;所以就不包含端點(diǎn)2的中斷事務(wù) { case USB_INT_EP2_OUT: // 批量端點(diǎn)下傳成功 { if ( s & BIT_STAT_TOG_MATCH ) // 僅同步包 { l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, gBuf ); } break; } case USB_INT_EP2_IN:// 批量端點(diǎn)上傳成功,未處理 { Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_TRAN_TOG ); break; } case USB_INT_EP1_IN:// 中斷端點(diǎn)上傳成功,未處理 { Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); break; } case USB_INT_EP1_OUT: // 端點(diǎn)1下傳成功,未處理 { Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); break; } case USB_INT_EP0_SETUP: // 端點(diǎn)0下傳成功 { // USB_SETUP_REQ SetupReqBuf; //定義結(jié)構(gòu)體,存儲(chǔ)接收的主機(jī)命令,結(jié)構(gòu)體的說(shuō)明在頭文件中 l = Read374Byte( REG_USB_LENGTH ); //首先讀取的是數(shù)據(jù)的長(zhǎng)度;因?yàn)閿?shù)據(jù)傳輸首先傳輸?shù)木褪菙?shù)據(jù)長(zhǎng)度; if ( l == sizeof( USB_SETUP_REQ ) ) { //sizeof( USB_SETUP_REQ )求出的長(zhǎng)度應(yīng)該為8 //按協(xié)議,只有長(zhǎng)度為8的命令才算是USB主機(jī)發(fā)送的命令 Read374Block( RAM_ENDP0_RECV, l, (PUINT8)&SetupReqBuf ); //讀取數(shù)據(jù)放入結(jié)構(gòu)體中 SetupLen = SetupReqBuf.wLengthL; if ( SetupReqBuf.wLengthH || SetupLen > 0x7F ) { SetupLen = 0x7F; // 限制總長(zhǎng)度 } l = 0; // 默認(rèn)為成功并且上傳0長(zhǎng)度 if ( SetupReqBuf.bType==0x40) { //廠商請(qǐng)求,未處理 } if ( SetupReqBuf.bType&0x20 ) {//類請(qǐng)求,未處理 if( SetupReqBuf.bReq==0x0a ) { } if( SetupReqBuf.bReq==0x09 ) { SetupReq = 0x09; // Read374Block( RAM_ENDP0_RECV , 1, gInBuf ); // 演示回傳,使用端點(diǎn)0的中斷傳輸 // Write374Block( RAM_ENDP0_TRAN, l, pDescr ); /* 加載上傳數(shù)據(jù) */ // Write374Byte( REG_USB_ENDP0, M_SET_EP1_RECV_ACK( Read374Byte( REG_USB_ENDP1 ) ) ^ BIT_EP1_TRAN_TOG ); // Write374Byte( REG_USB_ENDP0, M_SET_EP1_RECV_ACK( Read374Byte( REG_USB_ENDP1 ) ) ); if(gInBuf[0]!=0) { Delay1ms(100); } } } else if ( ( SetupReqBuf.bType & DEF_USB_REQ_TYPE )== DEF_USB_REQ_STAND ) { // 標(biāo)準(zhǔn)請(qǐng)求 SetupReq = SetupReqBuf.bReq; // 請(qǐng)求碼 switch( SetupReq ) { case DEF_USB_GET_DESCR: { switch( SetupReqBuf.wValueH ) {//獲取描述符的偏移量和描述符的長(zhǎng)度 case 1: { pDescr = (PUINT8)( &MyDevDescr[0] ); l = sizeof( MyDevDescr ); break; } case 2: { pDescr = (PUINT8)( &MyCfgDescr[0] ); l = sizeof( MyCfgDescr ); break; } case 34: { pDescr = (PUINT8)( &Hid_des[0] ); l = sizeof( Hid_des ); break; } default: { l = 0xFF; // 操作失敗 break; } } if ( SetupLen > l ) SetupLen = l; // 限制總長(zhǎng)度 l = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE : SetupLen; // 本次傳輸長(zhǎng)度 Write374Block( RAM_ENDP0_TRAN, l, pDescr ); /* 加載上傳數(shù)據(jù) */ SetupLen -= l; pDescr += l; break; } case DEF_USB_SET_ADDRESS: { SetupLen = SetupReqBuf.wValueL; // 暫存USB設(shè)備地址 break; } case DEF_USB_GET_CONFIG: { Write374Byte( RAM_ENDP0_TRAN, UsbConfig ); if ( SetupLen >= 1 ) l = 1; break; } case DEF_USB_SET_CONFIG: { UsbConfig = SetupReqBuf.wValueL; break; } case DEF_USB_CLR_FEATURE: { if ( ( SetupReqBuf.bType & 0x1F ) == 0x02 ) { // 不是端點(diǎn)不支持 switch( SetupReqBuf.wIndexL ) {//對(duì)于CLR_FEATURE命令按照不同的端點(diǎn),置位端點(diǎn)的發(fā)送或者接收狀態(tài) case 0x82: { Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_NAK( Read374Byte( REG_USB_ENDP2 ) ) ); break; } case 0x02: { Write374Byte( REG_USB_ENDP2, M_SET_EP2_RECV_ACK( Read374Byte( REG_USB_ENDP2 ) ) ); break; } case 0x81: { Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) ); break; } case 0x01: { Write374Byte( REG_USB_ENDP1, M_SET_EP1_RECV_ACK( Read374Byte( REG_USB_ENDP1 ) ) ); break; } default: { l = 0xFF; // 操作失敗 break; } } } else l = 0xFF; // 操作失敗 break; } case DEF_USB_GET_INTERF: { Write374Byte( RAM_ENDP0_TRAN, 0 ); // 上傳接口號(hào) if ( SetupLen >= 1 ) l = 1; break; } case DEF_USB_GET_STATUS: { Write374Byte( RAM_ENDP0_TRAN, 0 ); Write374Byte( RAM_ENDP0_TRAN + 1, 0 ); if ( SetupLen >= 2 ) l = 2; else l = SetupLen; break; } default: { l = 0xFF; // 操作失敗 break; } } } //else l=0xff; } else // 操作失敗 { l = 0xFF; } if ( l == 0xFF )// 操作失敗 { Write374Byte( REG_USB_ENDP0, M_SET_EP0_RECV_STA( M_SET_EP0_TRAN_STA( 0 ) ) ); // STALL } else if ( l <= RAM_ENDP0_SIZE )// 上傳數(shù)據(jù) { Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_ACK( M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ), l ) | BIT_EP0_TRAN_TOG ); // DATA1 } else // 下傳數(shù)據(jù)或其它 { Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ) ) | BIT_EP0_RECV_TOG ); // DATA1 } break; } case USB_INT_EP0_IN: { switch( SetupReq ) { case DEF_USB_GET_DESCR: { l = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE : SetupLen; // 本次傳輸長(zhǎng)度 Write374Block( RAM_ENDP0_TRAN, l, pDescr ); // 加載上傳數(shù)據(jù) SetupLen -= l; pDescr += l; Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_ACK( Read374Byte( REG_USB_ENDP0 ), l ) ^ BIT_EP0_TRAN_TOG );//同步切換 break; } case 0x09: { goto ag; } case DEF_USB_SET_ADDRESS: { Write374Byte( REG_USB_ADDR, SetupLen ); } default: { ag: Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_NAK( 0 ) ); // 結(jié)束
已經(jīng)搞定了 通過(guò)仿真 找到了收發(fā)信息的步驟 現(xiàn)已解決 謝謝
不過(guò)還有一個(gè)問(wèn)題,為什么設(shè)置Set_Report()鍵盤(pán)數(shù)字燈只是亮一下 就熄滅了 請(qǐng)問(wèn)什么原因, buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //設(shè)置報(bào)表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //設(shè)置報(bào)告出錯(cuò) //if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 }
PC發(fā)來(lái)Set_Report(),你接收數(shù)據(jù),怎么點(diǎn)燈是您軟件做的事情
例子里面不是有點(diǎn)燈的范例么?!