CH375B操作USB鍵盤問題

前段時間向貴公司申請了兩片CH375B,想用它做主機來和USB鍵盤通信,單片機用的是MSP430,

程序是參考的論壇里提供的CH375B操作HID設(shè)備的例程,開始程序在執(zhí)行設(shè)置CH375工作模式時中斷返

回正常,但在等待設(shè)備連接時中斷返回的卻是錯誤的,本來按照貴公司提供的頭文件CH375INC.H如果

連接正常,則應(yīng)返回0x15,但我的返回時0x95,硬件應(yīng)該沒問題,因為我仔細檢查過了,并且前面的

模式設(shè)置時中斷返回正常,請問這會是什么原因呢? 附上相關(guān)代碼: #define CH375_INT_WIRE P1IN&0x80 //P1.7 連接CH375的INT#引腳,用于查詢中斷狀態(tài) /************************************* //函數(shù)名稱:Wait_Interrupt //函數(shù)功能:主機端等待操作完成, 返回操作狀態(tài) //入口:無 //出口:Intout--狀態(tài)返回 //備注: ***************************************/ INT8U Wait_Interrupt(void) { while( CH375_INT_WIRE ); //查詢等待CH375操作完成中斷(INT#低電平) Ch375_Wr_Cmd_Port( CMD_GET_STATUS ); // 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) //return( Ch375_Rd_Dat_Port() ); Intout = Ch375_Rd_Dat_Port(); //此處僅僅為了測試,否者應(yīng)打開被屏蔽的語句 return (Intout); }

/************************************* //函數(shù)名稱:Ch375_Rd_Dat_Port //函數(shù)功能:從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 //入口:無 //出口:dout--讀得的數(shù)據(jù),一個字節(jié) //備注: ***************************************/ INT8U Ch375_Rd_Dat_Port(void) { INT8U dout; CH375_A0_CLR; //A0=1時為寫入命令 =0為寫入數(shù)據(jù) CH375_WR_SET; CH375_RD_CLR; //RD=0時表示讀入操作 Delay_X_Us(2);// 因為MSP430單片機較快所以需延時 CH375_DATA_IN; dout= P2IN; Delay_X_Us(1); CH375_RD_SET;//RD=0時表示讀入操作 Delay_X_Us(1); return(dout); }

/************************************* //函數(shù)名稱:Ch375_Wr_Cmd_Port //函數(shù)功能:向CH375寫命令,周期不小于4uS,如果單片機較快則延時 //入口:cmd--待寫命令 //出口:無 //備注: ***************************************/ void Ch375_Wr_Cmd_Port( INT8U cmd ) { CH375_A0_SET;//A0=1時為寫入命令 CH375_RD_SET;//RD=0時表示讀入操作 CH375_DATA_OUT; P2OUT=cmd; CH375_WR_CLR; Delay_X_Us(2); CH375_WR_SET; Delay_X_Us(2); }

貴公司提供的頭文件部分內(nèi)容如下: /* 以下狀態(tài)代碼1XH用于USB主機方式的操作狀態(tài)代碼, 僅CH375支持 */ #ifndef USB_INT_SUCCESS #define USB_INT_SUCCESS 0x14 /* USB事務(wù)或者傳輸操作成功 */ #define USB_INT_CONNECT 0x15 /* 檢測到USB設(shè)備連接事件 */ #define USB_INT_DISCONNECT 0x16 /* 檢測到USB設(shè)備斷開事件 */ #define USB_INT_BUF_OVER 0x17 /* USB控制傳輸?shù)臄?shù)據(jù)太多, 緩沖區(qū)

溢出 */ #define USB_INT_USB_READY 0x18 /* USB設(shè)備已經(jīng)被初始化(已分配

USB地址) */ #define USB_INT_DISK_READ 0x1D /* USB存儲器讀數(shù)據(jù)塊, 請求數(shù)據(jù)讀

出 */ #define USB_INT_DISK_WRITE 0x1E /* USB存儲器寫數(shù)據(jù)塊, 請求數(shù)據(jù)寫

入 */ #define USB_INT_DISK_ERR 0x1F /* USB存儲器操作失敗 */ #endif

這個頭文件應(yīng)該沒問題吧,它對于鍵盤設(shè)備應(yīng)該是一樣的吧? 誰對這方面比較熟悉請幫我分析一下,先謝謝了!

設(shè)置模式不會產(chǎn)生中斷,而且模式設(shè)置成功應(yīng)該返回0x51,如果硬件沒問題,檢查你的操作流程。


1、官方提供的頭文件沒問題 2、參考手冊作2次測試命令,測試數(shù)據(jù)分別是0x55, 0xAA


謝謝兩位的解答,我按照上面的流程試了,測試程序如下: void Usb_Key(void) { INT8U i; Init_Usb_Ports(); //初始化端口 Delay_X_Ms(250); Set_Usb_Mode(7); // 復(fù)位USB設(shè)備,CH375向USB信號線的D+和D-輸出低電平 Delay_X_Ms(10); Set_Usb_Mode( 6 ); // 結(jié)束復(fù)位 Ch375_Wr_Cmd_Port( CMD_GET_IC_VER ); Ceshi=Ch375_Rd_Dat_Port(); //得到固件版本號,正常為0x0B7 Ch375_Wr_Cmd_Port(CMD_CHECK_EXIST); // 測試工作狀態(tài)是否正常? Ch375_Wr_Dat_Port(0x55); // 測試數(shù)據(jù) Ceshi = Ch375_Rd_Dat_Port(); } 在上面的程序中,如果我不把鍵盤接上去,則得到的版本號為0x0B7和測試返回數(shù)據(jù)0xAA,但是當(dāng)我把鍵盤接上去后得到的版本號就是0x37和測試返回數(shù)據(jù)0x2A了,請問這是為什么了?還請高手給予指教!先謝謝了!


Ch375_Wr_Cmd_Port( CMD_GET_IC_VER ); Ceshi=Ch375_Rd_Dat_Port(); //得到固件版本號,正常為0x0B7 Ch375_Wr_Cmd_Port(CMD_CHECK_EXIST); // 測試工作狀態(tài)是否正常? Ch375_Wr_Dat_Port(0x55); // 測試數(shù)據(jù) Ceshi = Ch375_Rd_Dat_Port(); 初始化CH376之前做。


補充一下:剛才又用其他數(shù)據(jù)進行了測試,發(fā)現(xiàn)鍵盤不連接時,D7始終為高電平;當(dāng)鍵盤接上去后,D7始終為低電平;這是硬件的問題嗎?


謝謝4樓的解答。 void Usb_Key(void) { INT8U i; Init_Usb_Ports(); //初始化端口 Delay_X_Ms(250); Ch375_Wr_Cmd_Port( CMD_GET_IC_VER ); Ceshi=Ch375_Rd_Dat_Port(); //得到固件版本號,正常為0x0B7 Ch375_Wr_Cmd_Port(CMD_CHECK_EXIST); // 測試工作狀態(tài)是否正常? Ch375_Wr_Dat_Port(0x55); // 測試數(shù)據(jù) Ceshi = Ch375_Rd_Dat_Port(); Ch375_Wr_Cmd_Port(CMD_CHECK_EXIST); // 測試工作狀態(tài)是否正常? Ch375_Wr_Dat_Port(0xff); // 測試數(shù)據(jù) Ceshi = Ch375_Rd_Dat_Port(); } 我在剛才的基礎(chǔ)上,去掉了初始化,增加了一個0xff測試數(shù)據(jù),結(jié)果是無論連接鍵盤與否,D7都是高電平,即0xff測試數(shù)據(jù)返回始終是0x80,這說明是我的硬件有問題了嗎?


Ch375_Wr_Cmd_Port(CMD_CHECK_EXIST); // 測試工作狀態(tài)是否正常? Ch375_Wr_Dat_Port(0x55); // 測試數(shù)據(jù) Ceshi = Ch375_Rd_Dat_Port();

Ch375_Wr_Cmd_Port(CMD_CHECK_EXIST); // 測試工作狀態(tài)是否正常? Ch375_Wr_Dat_Port(0xaa); // 測試數(shù)據(jù) Ceshi = Ch375_Rd_Dat_Port(); 連續(xù)做兩次測試,看看數(shù)據(jù)是否全部正常。 如果D7始終為1,建議檢查端口方向是否設(shè)置正確,檢查外部電路是否虛焊。


謝謝您的解答,我按照您說的測試了,但是還是若不初始化,D7返回始終為1,檢查硬件并無虛焊存在,IO口方向設(shè)置正確。如果連接上鍵盤后,用語句Set_Usb_Mode( 6 );設(shè)置模式,返回值為0x51,即正常,但若不接,返回為0x0D1,即返回錯誤,D7始終為1。僅僅把鍵盤接上去,而不初始化,用數(shù)據(jù)測試和不接鍵盤無區(qū)別。 補充:我用的是CH375B,接鍵盤時數(shù)據(jù)線是不用反接的吧?我目前是沒有反接的。 請問如果連接正確,會不會是CH375B本身壞了?謝謝!


芯片壞的可能性很小,先不用測試是否插入USB鍵盤。按照7樓測試,最終的結(jié)果是什么?芯片壞的可能性應(yīng)該是很小的,還是懷疑IO設(shè)置,硬件部分有問題。單片機和CH375之間的通訊和CH375與USB設(shè)備的通訊應(yīng)該是相互獨立的。另外仔細檢查一下AO線變化是否正確,你沒有貼出寫數(shù)據(jù)的函數(shù)。


謝謝您的解答,我按照7樓的測試了,結(jié)果當(dāng)測試數(shù)據(jù)為0x55時,返回為0x0aa;當(dāng)測試數(shù)據(jù)為0x0aa時,返回數(shù)據(jù)為0xD5;當(dāng)我用0x0ff作為測試數(shù)據(jù)時,返回值為0x80。 我再把我的相關(guān)程序附上: //宏定義 #define DATAIN P2IN #define DATAOUT P2OUT #define CH375_DATA_IN P2DIR = 0x00 //單片機P2口設(shè)為輸入 #define CH375_DATA_OUT P2DIR = 0xff //單片機P2口設(shè)為輸出 #define CH375_INT_WIRE P1IN&0x80 //P1.7 連接CH375的INT#引腳,用于查詢中斷狀態(tài) #define CH375_WR_SET P3OUT |= BIT0 //P3.0 寫選通(注:BIT0=0x0001) #define CH375_WR_CLR P3OUT &= ~BIT0 #define CH375_RD_SET P3OUT |= BIT1 //P3.1 讀選通(注:BIT1=0x0002) #define CH375_RD_CLR P3OUT &= ~BIT1 #define CH375_A0_SET P3OUT |= BIT2 //P3.2 地址線口,若為1,寫命令;若為0,讀寫數(shù)據(jù)(注:BIT2=0x0004) #define CH375_A0_CLR P3OUT &= ~BIT1 #define CH375_CS_SET P3OUT |= BIT3 //p3.3 片選信號(注:BIT3=0x0008) #define CH375_CS_CLR P3OUT &= ~BIT3

/************************************* //函數(shù)名稱:Init_Usb_Ports //函數(shù)功能:初始化與USB模塊相關(guān)的引腳 //入口:無 //出口:無 //備注: ***************************************/ void Init_Usb_Ports(void) { P3DIR |= 0x0f; //控制引腳設(shè)為輸出 P1DIR &= ~BIT7;//USB中斷引腳設(shè)為輸入 P1IFG &= ~BIT7;//清除中斷標(biāo)志0 P1IES |= BIT7;//下降沿中斷 P1IE &= ~BIT7;//禁止管腳P1.7中斷 CH375_CS_SET; _NOP(); _NOP(); CH375_CS_CLR; _EINT();//使能中斷 } //基本讀寫函數(shù) /************************************* //函數(shù)名稱:Ch375_Wr_Cmd_Port //函數(shù)功能:向CH375寫命令,周期不小于4uS,如果單片機較快則延時 //入口:cmd--待寫命令 //出口:無 //備注: ***************************************/ void Ch375_Wr_Cmd_Port( INT8U cmd ) { CH375_DATA_OUT;//數(shù)據(jù)口輸出 CH375_A0_SET;//A0=1時為命令 CH375_RD_SET;//RD=1、WR=0時表示寫入操作 DATAOUT=cmd; CH375_WR_CLR; Delay_X_Us(4); CH375_WR_SET; Delay_X_Us(2); } /************************************* //函數(shù)名稱:Ch375_Wr_Dat_Port //函數(shù)功能:向CH375寫數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 //入口:dat--待寫數(shù)據(jù) //出口:無 //備注: ***************************************/ void Ch375_Wr_Dat_Port( INT8U dat ) { CH375_DATA_OUT;//數(shù)據(jù)口輸出 CH375_A0_CLR;//A0=1時為命令 =0為數(shù)據(jù) CH375_RD_SET;//RD=1、WR=0時表示寫入操作 DATAOUT=dat; CH375_WR_CLR; Delay_X_Us(3); CH375_WR_SET; Delay_X_Us(2); }

/************************************* //函數(shù)名稱:Ch375_Rd_Dat_Port //函數(shù)功能:從CH375的數(shù)據(jù)端口讀出數(shù)據(jù),周期不小于1.5uS,如果單片機較快則延時 //入口:無 //出口:dout--讀得的數(shù)據(jù),一個字節(jié) //備注: ***************************************/ INT8U Ch375_Rd_Dat_Port(void) { INT8U dout; CH375_DATA_IN; //數(shù)據(jù)口輸入 CH375_A0_CLR; //A0=1時為命令 =0為數(shù)據(jù) CH375_WR_SET; CH375_RD_CLR; //RD=0、WR=1時表示讀入操作 dout= DATAIN; Delay_X_Us(3); CH375_RD_SET; return(dout); } 關(guān)于硬件部分,我昨天重新?lián)Q了一個測試的板子,效果一樣,除非我的原理圖有錯,焊接、連線本身是不存在問題的,由于我的單片機在3.3V工作,所以CH375B也是3.3V供電的的,具體原理圖如下: 2010575371843.jpg


原理圖我是參考貴公司的《USB 芯片的電路及PCB 設(shè)計的重要注意事項》設(shè)計的,不知道我的原理圖有誤沒,請您幫忙看看,麻煩您了!


檢查D7數(shù)據(jù)線有沒有虛焊,或者短路,用萬用表或者示波器測試一下A0信號線,發(fā)送命令的時候A0為高,在發(fā)送數(shù)據(jù)的時候A0為低電平


復(fù)位電容C26換成0.47UF或者更大點,保證復(fù)位的可靠性


非常感謝樓上各位的解答,都怪我粗心,程序的宏定義搞錯了,哎,忙了一天!剛才按照樓上兩位的意思測了一下,發(fā)現(xiàn)問題了!再次深表感謝!謝謝樓上各位熱心的幫助!


又遇到新問題了,貴公司提供的代碼中在開始得到鍵盤描述符的時候為什么不直接用下面這個函數(shù): INT8U Get_Descr( INT8U type ) { Status=0xff; Ch375_Wr_Cmd_Port( CMD_GET_DESCR ); Ch375_Wr_Dat_Port( type ); // 描述符類型, 只支持1(設(shè)備)或者2(配置) Status=Wait_Interrupt(); // 等待CH375操作完成 if ( Status==USB_INT_SUCCESS ) // 操作成功 { INT8U i, len; len=Rd_Usb_Data( Data_Buf ); //printf( "%s描述符是:", type==1?"設(shè)備":"配置" ); for ( i=0; i!=len; i++ ); //printf( "%02x ", (unsigned int)Data_Buf[i] ); //printf( "\n" ); } return( Status ); } 而是采用控制傳輸?shù)姆绞酵ㄟ^先設(shè)置請求包的各個值, Request.Req.bmRequestType=0x80; //獲取設(shè)備描述符 Request.Req.bRequest=0x06; Request.Req.wValue=0x0001; Request.Req.wIndex=0x0000; Request.Req.wLength=0x1200; 然后調(diào)用下面這個函數(shù)呢? INT8U Get_Descr_Ex(void) { INT8U descr_len; INT8U *p=Data_Buf; Endp7_Mode=0x80; Toggle_Send(); Wr_Usb_Data(8,Request.Req_buf); Issue_Token(( 0 << 4 ) | DEF_USB_PID_SETUP); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS)// SETUP階段操作成功 { Endp6_Mode=0xc0; Toggle_Recv(); } else return(0); Issue_Token(( 0 << 4 ) | DEF_USB_PID_IN); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS)// DATA階段操作成功 { if(Flag_Config_2) descr_len=Data_Buf[2]-Rd_Usb_Data(Data_Buf); else descr_len=Data_Buf[0]-Rd_Usb_Data(Data_Buf); while(descr_len>0) { Toggle_Recv(); p+=0x08; Issue_Token(( 0 << 4 ) | DEF_USB_PID_IN); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS) // DATA階段操作成功 descr_len-=Rd_Usb_Data(p); else return(0); } } else return(0); Endp7_Mode=0xc0; Toggle_Send(); Wr_Usb_Data(0,Request.Req_buf); Issue_Token(( 0 << 4 ) | DEF_USB_PID_OUT); Status=Wait_Interrupt(); if(Status==USB_INT_SUCCESS)// 狀態(tài)階段操作成功 return(1); else return(0); } 我在調(diào)用這個函數(shù)的時候,前面的建立階段返回狀態(tài)正確,,但是數(shù)據(jù)階段返回總是0x2E而不是所想的0x14,這可能是什么原因照成的呢?

另外,在設(shè)置CH375B進入低速模式的時候,使用下面這個函數(shù)嗎? void Set_Freq(void) { Ch375_Wr_Cmd_Port(0x0b); // 切換使375B進入低速模式 Ch375_Wr_Dat_Port(0x17); Ch375_Wr_Dat_Port(0xd8); }

請各位高手給予解答,小弟在這里先謝過了!


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频