小弟剛畢業(yè),最近做的項目是打印機(jī)的USB驅(qū)動,用的是CH374,由于沒有24MHz的晶振,只能用12M的替代,請問路過的大俠,這樣會有影響嗎?
不可以,通訊不穩(wěn)定,甚至無法通訊,強(qiáng)烈推薦24MHZ,官方所有資料都是24MHZ.
哦,謝謝啦
現(xiàn)在晶振換成24MHZ的了,不過,PC機(jī)無法識別usb設(shè)備。固件中的驅(qū)動能夠檢測到掛起、總線重啟中斷,但是沒有傳輸中斷,Get Descriptor請求沒有出現(xiàn)。請問哪位大俠知道可能是什么原因嗎?
先要去進(jìn)行寄存器的讀寫,看看CH374讀寫函數(shù)是否正確. 參考CH374EVT中DEVICE.C程序.修改和你硬件相關(guān)的就可以了.
(1)D+、D-是否接反,正確的次序:Vcc、D-、D+、GND (2)USB線必須為屏蔽線,USB口外殼要接地 (3)軟件上如4樓所說,對40H-7FH寄存器作讀寫測試,驗證讀寫接口函數(shù)是否正確
寄存器數(shù)據(jù)讀寫現(xiàn)在都是正確的。 因為打印機(jī)啟動后有一個操作系統(tǒng)初始化,硬件人員把D+上面的上拉電阻去掉了,這樣會不會對主機(jī)這邊設(shè)備的識別有影響?
CH374 UD+,UD-線上不要串接并接任何元器件.CH374內(nèi)部上拉.
現(xiàn)在CH374芯片能收到主機(jī)發(fā)過來的Get Descriptor請求(而且只收到這個請求),我把設(shè)備描述符前面8個字節(jié)數(shù)據(jù)送入了端點0的發(fā)送緩沖區(qū)(0x20),也設(shè)置了端點0的控制寄存器,但是還是無法識別的USB設(shè)備。是不是我的Get Descripto請求處理有問題,比如說端點0的控制寄存器設(shè)置有問題,導(dǎo)致了后續(xù)的請求無法進(jìn)行,所以設(shè)備無法識別。 說明:端點0發(fā)送緩沖區(qū)(0x20)寫入的內(nèi)容是正確的。
你首先一上電就讀取0-15號寄存器,如果可以的話可以把數(shù)據(jù)帖出來看下,如果沒有問題的話,那么你拿我們的CH374DEVICE。C這個程序修改下在去測試下看可以不可以。
是按這個C程序修改的,而且寄存器讀取的內(nèi)容也是正確的。只是有個疑問,端點0的緩沖區(qū)是8個字節(jié),而Get Descriptor請求有18個字節(jié),在CH374DEVICE.C里不知道是怎么處理的
你可以看下程序,在發(fā)完8個字節(jié)后,會產(chǎn)生一個中斷,然后繼續(xù)上傳剩余的字節(jié)數(shù),知道上傳完畢.
這是寄存器初始化前后的數(shù)據(jù) before init -----------index:0,regdata=0 before init -----------index:1,regdata=0 before init -----------index:2,regdata=80 before init -----------index:3,regdata=0 before init -----------index:4,regdata=d1 before init -----------index:5,regdata=0 before init -----------index:6,regdata=0 before init -----------index:7,regdata=f0 before init -----------index:8,regdata=0 before init -----------index:9,regdata=4 before init -----------index:a,regdata=ec before init -----------index:b,regdata=ed before init -----------index:c,regdata=0 before init -----------index:d,regdata=fb before init -----------index:e,regdata=0
初始化后: after init -----------index:0,regdata=0 after init -----------index:1,regdata=0 after init -----------index:2,regdata=80 after init -----------index:3,regdata=0 after init -----------index:4,regdata=89 after init -----------index:5,regdata=41 after init -----------index:6,regdata=3 after init -----------index:7,regdata=7 after init -----------index:8,regdata=0 after init -----------index:9,regdata=c0 after init -----------index:a,regdata=cc after init -----------index:b,regdata=ed after init -----------index:c,regdata=e after init -----------index:d,regdata=e after init -----------index:e,regdata=2
這是Get Descriptor請求信息: len_reg_data : 8 //寄存器中讀出來的數(shù)據(jù)長度 the 0 data is:80 the 1 data is:6 the 2 data is:0 the 3 data is:1 the 4 data is:0 the 5 data is:0 the 6 data is:40 the 7 data is:0
這是bus hound捕獲的信息 Bus Hound 5.00 capture. Complements of www.perisoft.net
Device Phase Data Description Cmd.Phase.Ofs(rep) ------ ----- ------------------------ ---------------- ------------------ 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 1.1.0(2) 14.0 DI 01 05 01 00 .... 1.2.0 14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 3.1.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 4.1.0(2) 14.0 DI 01 05 00 00 .... 4.2.0 14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 6.1.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 7.1.0 14.0 DI 00 85 11 00 .... 7.2.0 14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 8.1.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.1.0(3) 14.0 DI 00 85 01 00 .... 9.2.0 14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 12.1.0 14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 13.1.0 14.0 DI 00 05 00 00 .... 13.2.0 14.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 14.1.0 14.0 DI 00 05 00 00 .... 14.2.0 14.0 CTL a3 00 00 00 04 00 04 00 GET STATUS 15.1.0 14.0 DI 00 85 00 00 .... 15.2.0 14.0 CTL a3 00 00 00 05 00 04 00 GET STATUS 16.1.0 14.0 DI 03 05 00 00 .... 16.2.0 14.0 CTL a3 00 00 00 06 00 04 00 GET STATUS 17.1.0 14.0 DI 00 05 00 00 .... 17.2.0 14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 18.1.0 14.0 DI 00 85 00 00 .... 18.2.0 14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 19.1.0 14.0 DI 00 05 00 00 .... 19.2.0 14.0 CTL a3 00 00 00 03 00 04 00 GET STATUS 20.1.0 14.0 DI 00 05 00 00 .... 20.2.0 14.0 CTL a3 00 00 00 04 00 04 00 GET STATUS 21.1.0 14.0 DI 00 85 00 00 .... 21.2.0 14.0 CTL a3 00 00 00 05 00 04 00 GET STATUS 22.1.0 14.0 DI 03 05 00 00 .... 22.2.0 14.0 CTL a3 00 00 00 06 00 04 00 GET STATUS 23.1.0 14.0 DI 00 05 00 00 .... 23.2.0
如果出現(xiàn)這個可能你沒有返回ACK給計算機(jī),你確定拿我們的例子程序沒有修改嗎??
功能的實現(xiàn)都是按例子程序改的。 返回ACK給計算機(jī)是通過設(shè)置端點0的控制寄存器來實現(xiàn)的吧,這一步在數(shù)據(jù)放入端點0發(fā)送緩沖區(qū)之后就做了。 在發(fā)完8個字節(jié)后,會產(chǎn)生一個中斷,這個中斷是指傳輸中斷中的SETUP中斷還是端點0的IN中斷?我這里只收到一個SETUP的Get Descriptor 中斷,不像“在發(fā)完8個字節(jié)后,會產(chǎn)生一個中斷,然后繼續(xù)上傳剩余的字節(jié)數(shù),知道上傳完畢”這個過程。