我參考了usb做host連接打印機的例子以及兩片單片機相連的例子,我的另外一個單片機是cypress的cy7c68013a,host這邊發(fā)送的數據,slave那邊能接收到,因為我那邊取了幾個數據對比是正確的?,F在問題是在host這邊,我用超級終端調試的時候數據發(fā)送會死在一個地方,看下面的程序: for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send[i] ); /* 發(fā)送256字節(jié)的數據給設備端 */ 按道理這里應該是發(fā)送了4次數據,現在問題來了,我每一次調用host_send這個函數都打印信息,結果前面4次都正常地退出了,但第5次就停在 unsigned char wait_interrupt() { /* 主機端等待操作完成, 返回操作狀態(tài) */ printf("enter wait_interrupt!\n"); while( CH375_INT_WIRE ); /* 查詢等待CH375操作完成中斷(INT#低電平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產生操作完成中斷, 獲取中斷狀態(tài) */ printf("leave wait_interrupt!\n"); return( CH375_RD_DAT_PORT() ); } 這里面的while循環(huán)了。 想問一下,如果我數據發(fā)送完了是不是要給個中斷還是什么的呢?我上面為什么還會進行第5次傳輸呢?謝謝。
數據發(fā)送完成給一個中斷,中斷狀態(tài)是0X14,表示數據傳輸完成。按照你的程序這么會有第5次傳輸??隙愕能浖袉栴},建議你查下你的軟件。
我就是按照link工程來改的,加上了枚舉部分,結果跟蹤,發(fā)現 for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send ); /* 發(fā)送256字節(jié)的數據給設備端 */ 前四次傳輸完了,第五次又從i=0開始,然后就停在這里面的那個等中斷函數了,這個是怎么回事呢,另外我的超級終端里面的數據顯示總是會多加上兩位16進制62,比如,我打印的數據為40,他就顯示4062,這個是怎么回事呢?
你i定義的什么類型的變量?打印顯示四位是因為你的變量是short型,你可以在打印輸出里定義位數%02X
i 是unsigned char的,沒有超過吧。
另外我在host端數據完成以后發(fā)一次中斷,slave端該如何操作呢,也要產生中斷吧,這個先后次序是怎樣的呢。
第5次的時候應該跳出for循環(huán)了在等待傳輸完成中斷,主機端發(fā)送數據流程:主機端主動發(fā)送數據給設備端,如果設備端尚未取走前一次接收到的數據,則在主機端執(zhí)行下一次ISSUE_TOKEN時一直等待,主機端不產生操作完成中斷,直到設備端準備好接收下一次數據或者通訊錯誤。
是不是設備端每次收到數據都要產生中斷,這個中斷是硬件完成還是軟件完成,我現在發(fā)送數據是進行了4次,在接收的時候就有問題,第1次接收就產生錯誤。我的功能是想發(fā)送256個byte數據,設備端在端點2接收,然后設備將這些數據傳送到端點6,再由host讀回,然后驗證數據的正確性。主機端的代碼: for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send[i],i ); /* 發(fā)送256字節(jié)的數據給設備端 */ host_send( 0, NULL ); /* 假定, 發(fā)送空數據給設備端就能通知設備端發(fā)送數據 */ printf("init success!\n");
for ( i=0; i<250; i+=len ) len=host_recv( &data_by_recv[i] ); /* 從設備端接收256字節(jié)的數據 */ 中間那句host_send( 0, NULL ); 是指發(fā)送空數據之后,設備接收后就開始發(fā)送數據給主機嗎?
是的 設備每次收到數據都會產生中斷,程序上會讀取這個中斷并作處理,接收產生錯誤你的意思是沒等到接收中斷嗎?這樣的話要么你發(fā)送的端點地址不對要么設備沒有數據發(fā)過來