[求助]CH376主機方式讀取鍵盤的問題

參考的程序是“ch376host”,其他帖子中推薦的 開頭部分寫: /**************************************** ** Copyright (C) WCH 1999-2009 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB 1.1 Host Examples for CH376 ** ** KC7.0@MCS-51 ** ** Version: v1.0 ** ** Author: tech14 ** ** Time : 2009/11/18 ** **************************************** 應該是沁恒官方提供的,但是在官方頁面上沒找到下載的地方 我參照這個程序編寫自己的程序,一點一點的添加 增加一點,運行一下看看效果 我用的是8位并口,軟件模擬接口方式

寫到“獲取設備描述符”時就不成功了,輸出“get device descr failed” 我懷疑是前面設置速度的問題 前有面調(diào)用這樣的函數(shù) void set_freq(void) { CH376_WR_CMD_PORT(0x0b); // 切換使375B進入低速模式 CH376_WR_DAT_PORT(0x17); CH376_WR_DAT_PORT(0xd8); } 我不明白0x0b,0x17,0xd8這三個參數(shù)是什么意思 查數(shù)據(jù)手冊中的命令,似乎與速度沒有關系

我重新寫設置低速的函數(shù): void CH376_SET_USB_SPEED(void) { ? ? CH376_WR_CMD_PORT(CMD_SET_USB_SPEED); //0x04 ? ? CH376_WR_CMD_PORT(0x02); } 替換原先的設置速度,獲取設備描述符就成功了 但不是很穩(wěn)定,有時還是會失敗

修改 UINT8 Get_Dev_Descr(),增加輸出語句 發(fā)現(xiàn)是 DATA階段 不成功, issue_token(receive_mode, (0<<4) | DEF_USB_PID_IN); status = wait_interrupt(); 讀出的狀態(tài)值是 0x16 (檢測到USB設備斷開事件) 不明白為什么

另外,不知道 (0<<4) 有什么用,0左移4為不還是0么?

請問,void set_freq(void) 中的那三個參數(shù),能解釋一下是什么意思么? 另外問個小問題,這兩種復位方法效果一樣么: 1. 用 CMD_RESET_ALL 命令復位 2. 在CH376芯片第2腳RSTI,高電平一段時間再恢復低電平(不知道高電平需要持續(xù)多長時間?)

今天繼續(xù)編寫函數(shù),獲取設備描述符幾乎總是失敗,很郁悶

我跳過這一步,不獲取設備描述符了,注釋掉相關的語句,繼續(xù)編寫 接下來是設置地址和獲取配置描述符 很奇怪,都成功。

獲取設備描述符和獲取配置描述符,這兩個函數(shù)差不多的呀,為什么一個成功,一個卻不成功呢?


(1)set_freq(void)函數(shù)里面的設置是很早以前的命令,也可以用,也可以用CH376_SET_USB_SPEED來設置成低速。 (2)在獲取設備描述符之前,芯片正常復位(25腳電平為低),確保測試命令正常通過。 (3) (0<<4) | DEF_USB_PID_IN只是C語言的一個用法,取低4位令牌PID (4)關于復位,軟件復位和硬件復位效果是一樣的,福為高電平持續(xù)時間至少100ns,復位完成需要延時50MS。


回復2樓 (似乎沒有回復哪一樓的按鈕,希望這個回復能被2樓看到)

非常感謝您的回答,(1)(3)(4)我已經(jīng)弄明白了 第(2)條回復我不太明白,想再問一下:

芯片中第25腳的描述如下: “電源上電復位和外部復位輸出,高電平有效” 這句話我沒完全弄明白。 如果是用第2腳進行硬件復位,25腳的輸出等于2腳的輸入么?

“復位高電平持續(xù)時間至少100ns,復位完成需要延時50MS”

我想問,第2腳100ns高電平之后恢復低電平,然后的50ms時間之內(nèi),第25腳輸出是什么? 是立即跟著變成低電平? 還是保持高電平,等到復位完成后再變成低電平?

我的電路是開發(fā)板上的,25腳是懸空的,沒法改。引腳太密了,也沒法用示波器測

我把延時50ms的語句延長到100ms。但還是沒有用,獲取設備描述符大多數(shù)時候失敗 跳過他,繼續(xù)寫,一直把所有的內(nèi)容都搬到我自己的程序。 后面的部分全都成功的,回過頭再試獲取設備描述符,還是失敗。

////////////////

請問關于 receive_mode 和 send_mode 這兩個全局變量 大部分的地方我都看明白的,比如說 send_mode = 0x00; issue_token(send_mode, (0<<4) | DEF_USB_PID_SETUP); 還有: receive_mode = 0x80; // ........ issue_token(receive_mode, (0<<4) | DEF_USB_PID_IN); 看數(shù)據(jù)手冊,我知道參數(shù) 0x80 和 0x40 的含義。 技術手冊2中,命令CMD_ISSUE_TKN_X 有這樣的說明: 同步標志的位7為主機端點的接收器的同步觸發(fā)標志,位6為主機端點的發(fā)送器的同步觸發(fā)標志

我不明白的是這里: 獲取配置描述符的函數(shù) Get_Cfg_Descr(UINT8 *buf)中,DATA階段里有這樣的語句: receive_mode ^= 0x80; 有兩處,一處是 while(descr_len>0) 循環(huán)中,另一處是循環(huán)之前 使用該變量的語句是 issue_token(receive_mode, (0<<4) | DEF_USB_PID_IN);

字面上看,receive_mode 的值是0x80和0x00交替,我不知道這有什么用。 請問,什么時候需要同步觸發(fā)標志,什么時候不需要同步觸發(fā)標志? 連續(xù)讀取(或?qū)懭?都要這樣交替么?


第25腳是外部復位輸出引腳,顯示復位的狀態(tài),復位的時候是高電平,復位完成是低電平。復位電平從高變低需要一個過程,這個過程就是復位后的延時。 同步標志交替,是根據(jù)USB協(xié)議來的,如果數(shù)據(jù)連續(xù)寫入,相同端點包與包之間同步標志需要切換。 你現(xiàn)在主要的問題是查一下為什么獲取設備描述符不成功,而獲取配置描述符是成功的?兩者操作是一樣的。


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

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