CH375和CH372常見(jiàn)問(wèn)題的解決[討論]

CH375和CH372常見(jiàn)問(wèn)題的解決 1:?jiǎn)?wèn):U盤(pán)插在板子上,然后上電,工作正常。板子先上電,然后插U盤(pán),板子檢測不到U盤(pán)插上和拔除。 答:該問(wèn)題是由于U盤(pán)插上時(shí),電源對U盤(pán)供電,電源電壓產(chǎn)生波動(dòng),導致CH375復位,不產(chǎn)生中斷引起的??梢栽赨SB口上的電源和地之間接一個(gè)大于200UF的電解電容。 2:若要使用3.3V電壓對CH375供電,要求VCC和V3引腳接3.3V,與CH375相連的處理器的電壓也要是3.3V,除USB口的D+、D- 外,任何與CH375相連的引腳都必須是3.3V的。 3:?jiǎn)?wèn):當在我沒(méi)啟動(dòng)CH375設備模式時(shí)居然插在算計上能找到USB設備,不過(guò)不能裝驅動(dòng)。 答:如果這種情況屬實(shí)則是CH375沒(méi)有正常復位。 4:?jiǎn)?wèn):我用LPC的單片機作模擬IO口時(shí)做輸入時(shí)不正確。 答:用模擬IO時(shí)序要掌握好,IO口作輸入時(shí)要往口上寫(xiě)入1。 5:?jiǎn)?wèn):C8051F單片機可不可以用你們的U盤(pán)讀寫(xiě)的庫函數, 答:可以,不過(guò)C8051F大部分是單周期指令,所以要考慮速度,應用的時(shí)候要注意MOVX指令的時(shí)間周期,(61就可以了);或者用我們的第5個(gè)庫,讀寫(xiě)CH375靠用戶(hù)自己設定。 6:?jiǎn)?wèn):是不是可以用CH375作主機CH372作從機進(jìn)行通訊,并且不處理描述符? 答:可以。 7:?jiǎn)?wèn):直接寫(xiě)入U盤(pán)的數據為何不能格式化掉? 答:這牽扯到文件格式,對于現代格式化都是高級格式化(軟盤(pán)除外),格式化就是將引導區的文件信息刪除,對于存在存儲器的具體文件可能還在原處。用一些工具是可以看到文件的存在的。 所以對于直接寫(xiě)入的數據計算機就有可能不理會(huì )。這就是你所說(shuō)的刪除不掉。這不會(huì )對使用U盤(pán)有影響。如果想格式化掉可能需要重新分區。 8:?jiǎn)?wèn):我的U盤(pán)插上為什麼出現錯誤91? 答:這是因為庫不支持你的U盤(pán)格式建議你重新格式化。格成FAT16或者FAT12。 9:?jiǎn)?wèn):我的U盤(pán)寫(xiě)入時(shí)為什麼在寫(xiě)入64K是可以,寫(xiě)入90K時(shí)長(cháng)度變成20多K呢, 答:我們定義的長(cháng)度是16位的,當自動(dòng)修改長(cháng)度時(shí)只能識別64K之內,當長(cháng)度超過(guò)64K時(shí)要手動(dòng)修該長(cháng)度,或者重新定義長(cháng)度為32位。 10:?jiǎn)?wèn):下位機每次通過(guò)端點(diǎn)2上傳4字節,為什麼上位機有時(shí)候會(huì )收到一串其他數據? 答:這要看你寫(xiě)的具體程序。下位機每次發(fā)過(guò)一組數據后,沒(méi)有查看上位機是否接收就發(fā)第2組。假如第一次還沒(méi)被上傳就寫(xiě)入了第二組,數據被覆蓋掉。 11:?jiǎn)?wèn):為什麼我在用CH375直接讀取U盤(pán)設備描述符時(shí)會(huì )讀取不成功,而其他向U盤(pán)初始化等命令能成功。 答:第一是否設置模式。第二是否設備插上來(lái)延時(shí)充分。第三在給U盤(pán)操作時(shí)要對U盤(pán)復位一次,再操作。因為有的USB設備自己沒(méi)有復位功能,要依靠外界各其復位后才能工作。PC機給所有剛插上來(lái)的USB設備都是先復位總線(xiàn)再操作的。CH375中的初始化U盤(pán)命令也是先復位總線(xiàn)再操作的。 12:?jiǎn)?wèn):在用CH375做HOST時(shí),使用內部U盤(pán)讀寫(xiě)固件操作U盤(pán)進(jìn)行扇區操作均正常,但是當用程序進(jìn)行SETUP過(guò)程時(shí)出現問(wèn)題,程序執行過(guò)程: a.初始化CH375芯片:復位芯片,發(fā)送測試命令,發(fā)送設置工作模式(0x06)命令,等待USB設備連接。 b.USB設備連接產(chǎn)生中斷后,發(fā)送獲取設備描述符命令,此時(shí)CH375返回中斷狀態(tài)字為0x20,無(wú)論USB設備是U盤(pán)還是攝像頭均出現此錯誤,運行環(huán)境:CPU:89S52 ,11.0592Mhz,附源程序。 答:錯誤碼20H說(shuō)明目標USB設備應答超時(shí),可能原因有: a、目標設備尚未正常工作,例如未連接,或者已連接但未初始化好 解決方法,確認連接后再延時(shí)數百毫秒 b、通訊錯誤,例如,晶振頻率不準(電容不符),非標準USB信號線(xiàn) 解決方法,1、調整硬件,2、用SET-RETRY命令帶參數25H、8FH增加重試次數 c、目標USB設備連接時(shí)瞬時(shí)電流太大(降低了電源電壓),導致CH375不正常, 解決方法:分開(kāi)供電,或者為USB設備串入限流電阻或者電感 d、CH375操作時(shí)序不佳,導致數據不穩定,例如CMD與DATA之間不足2.5uS等 另外,您若是用I/O引腳模擬并口讀寫(xiě)的,要考慮在模擬到一半時(shí)出現中斷的情況, 如果關(guān)中斷,又會(huì )影響速度。如果是51單片機,想省點(diǎn)I/O引腳,可以用 MOVX @R0,A 和 MOVX A,@R0,這樣P2口只用兩個(gè):CS和A0,其它隨便用。 順便unsigned char u1_read_data(void) { unsigned char ch; U1_A0 = 0 ; U1_CS = 0 ; P0 = 0xff ; // 放在RD=0之前更安全,否則如果之前P0輸出0,CH375輸出1會(huì )短路 RD = 0 ; // CH375開(kāi)始輸出數據 P0 = 0xff ; // 原來(lái)的這一行就當延時(shí)吧,因為RD=0到CH375輸出數據要20納秒 ch = P0 ; RD = 1 ; U1_CS = 1; return ch ; } 13:?jiǎn)?wèn):341可以單獨控制外部設備嗎? 答:341的開(kāi)發(fā)就是考慮在沒(méi)有處理器使用的,假如要控制劇電器或者發(fā)光管,只要用CH341+74HC273就可以了。


熱門(mén)產(chǎn)品 : CH32L103: 32位PDUSB低功耗單片機

謝謝板主。波特率配制問(wèn)題得到解決。[Emot]6[/Emot][Emot]6[/Emot][Emot]6[/Emot]


多謝,很有價(jià)值


很好,收藏!


收益匪淺!


以下是我部分程序,前面執行都可以,就是read_sector中返回err=0x1f.請問(wèn)是為什么?

write_command(CMD_CHECK_EXIST); /* 1. 測試工作狀態(tài)是否正常? */ write_data(0x5a); /* 測試數據 */ c = read_data(); for(j=0;j<100;j++) /* 延時(shí)等待U盤(pán)進(jìn)入正常工作狀態(tài) */ for(i=0; i<10000; i++); for(j=0;j<100;j++) for(i=0; i<10000; i++);

write_command(CMD_SET_USB_MODE);/* 2. 設置USB工作模式 */ write_data(6); for (i=50000; i!= 0; i--) /* 等待操作成功,等待10uS-20uS */ { c = read_data(); if ( c == CMD_RET_SUCCESS ) break; }

while(1) {  c = wait_interrupt( );    /* 3. 等待U盤(pán)連接 */  if( c == USB_INT_CONNECT ); break; }

write_command(CMD_SET_USB_MODE);  /* 4. 復位 */ write_data(7); for (i=50000; i!= 0; i--)   /* 等待操作成功,等待10uS-20uS*/ {    c = read_data();    if ( c == CMD_RET_SUCCESS ) break; }

write_command(CMD_SET_USB_MODE);  /* 5. 設置USB工作模式 */ write_data(6); for (i=50000; i!= 0; i--)   /* 等待操作成功,待10uS-20uS */ {    c = read_data();    if ( c == CMD_RET_SUCCESS ) break; } while(1) { /* 6. 等待U盤(pán)連接 */ c = wait_interrupt( ); if( c == USB_INT_CONNECT ); break; }

for(i=0;i<10000; i++) { write_command(CMD_SET_USB_MODE); /* 4. 復位 */ write_data(7); for (j=50000; j!= 0; j--) /* 等待操作成功,等待10uS-20uS */ { c = read_data(); if ( c == CMD_RET_SUCCESS ) break; }

c = init_disk(); if(c) continue; c = read_sector( 0,1); if(c) continue; }

unsigned char init_disk() { unsigned char c;

write_command( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ c = read_data(); if ( c == USB_INT_DISCONNECT ) return( c ); /* USB設備斷開(kāi) */ write_command( CMD_DISK_INIT ); /* 初始化USB存儲器 */ c = wait_interrupt(); /* 等待中斷并獲取狀態(tài) */ if ( c == USB_INT_SUCCESS ) return( 0 ); /* U盤(pán)已經(jīng)成功初始化 */ else return( c ); /* 出現錯誤 */ }

unsigned char read_sector( unsigned long start, unsigned char count ) { /* iLbaStart 是準備讀取的線(xiàn)性起始扇區號, count 是準備讀取的扇區數 */

unsigned char err; unsigned char *ptr; unsigned char len; unsigned int i; unsigned char buf[1024];

write_command( CMD_DISK_READ ); /* 從USB存儲器讀數據塊 */ write_data( (unsigned char)start ); /* LBA的最低8位 */ write_data( (unsigned char)( start >> 8 ) ); write_data( (unsigned char)( start >> 16 ) ); write_data( (unsigned char)( start >> 24 ) ); /* LBA的最高8位 */ write_data( count ); /* 扇區數 */ ptr = &buf[0]; for ( i = count * CH375_BLK_PER_SEC; i != 0; i -- ) /* 數據塊計數 */ { err = wait_interrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( err == USB_INT_DISK_READ ) /* USB存儲器讀數據塊,請求數據讀出 */ { write_command( CMD_RD_USB_DATA ); /* 從CH375緩沖區讀取數據塊 */ len = read_data( ); /* 后續數據的長(cháng)度 */ while ( len ) /* 根據長(cháng)度讀取數據 */ { *ptr = read_data( ); /* 讀出數據并保存 */ ptr ++; len --; } return ( 0 ); //write_command( CMD_DISK_RD_GO ); /* 繼續執行USB存儲器的讀操作 */ } else break; } if ( i == 0 ) err = wait_interrupt( ); if ( err == USB_INT_SUCCESS ) return( 0 ); else return( err ); }


樓上和我的情況差不多,我用的U盤(pán)是天朗A10 64M。讀扇區內容的時(shí)候,寫(xiě)地址,扇區數成功,能讀出頭一段64個(gè)字節,讀第二段的64字節時(shí),返回只能讀0字節,在強行讀時(shí)就返回錯誤碼1FH。不知道是哪個(gè)地方出問(wèn)題?


上面貼的程序中多了一個(gè)return,提前返回了。不過(guò),估計還有其它問(wèn)題存在。 通常能讀第一個(gè)64字節,那么也能讀第二個(gè)64字節,如果不能,通常是循環(huán)程序有問(wèn)題。 另外,在讀寫(xiě)U盤(pán)程序中,不宜用單步跟蹤,有些U盤(pán)一跟蹤就會(huì )不工作。 如果要跟蹤,那么只能在命令與命令之間停頓,單個(gè)命令執行時(shí)間不能超過(guò)2mS。 各家做U盤(pán)的處理有差別,有些U盤(pán)在初始化后還需要發(fā)些其它命令才能工作。 最好用WCH的文件級子程序庫試試,里面針對這些兼容性問(wèn)題做了很多處理,可能會(huì )好些。


讀天朗A10U盤(pán)的問(wèn)題解決了。下面部分源代碼 /******************************************************************/ /*名稱(chēng): ReadSector(ulong Sectors,uchar xdata *pr) */ /*描述: 讀扇區內容 每次讀1個(gè)扇區 */ /*輸入參數:扇區地址,接收緩沖區指針 */ /*輸出參數:1:讀成功 0:讀失敗 */ /*******************************************************************/ uchar ReadSector(ulong Sectors,uchar xdata *pr) {union longEx Secaddr; uchar n,mBlockCount,mLength; Secaddr.lng=Sectors; CH375_CMD_PORT=CMD_DISK_READ; _nop_(); _nop_(); CH375_DAT_PORT=Secaddr.bytes[3]; CH375_DAT_PORT=Secaddr.bytes[2]; CH375_DAT_PORT=Secaddr.bytes[1]; CH375_DAT_PORT=Secaddr.bytes[0]; CH375_DAT_PORT=1;/*扇區數*/ n=Wait_Interrupt(); if(n!=USB_INT_DISK_READ) return FALSE; for(mBlockCount=0;mBlockCount<8;mBlockCount++) { CH375_CMD_PORT=CMD_RD_USB_DATA; _nop_(); _nop_(); mLength=CH375_DAT_PORT; while(mLength) { *pr++=CH375_DAT_PORT; n=CH375_DAT_PORT; mLength--; } wait_1mS(10);/*這里延時(shí)是關(guān)鍵*/ CH375_CMD_PORT=CMD_DISK_RD_GO;/*繼續執行讀操作*/ n=Wait_Interrupt(); if(n!=USB_INT_DISK_READ) break; } if(n==USB_INT_SUCCESS) return TRUE; else return FALSE; }


n=CH375_DAT_PORT;是調試用,忘了刪掉。


fat文件的讀寫(xiě)有沒(méi)有庫函數???


各位好! 我想問(wèn)一下ch372和51單片機如何USB通訊?單片機用匯編如何初始化ch372?片選 總線(xiàn) 中斷都有,就是通不起來(lái)! 如蒙指教,不勝感謝!


大家好! 我想問(wèn)一下 用ch375作為usb設備芯片開(kāi)發(fā)usb設備都需要哪些工具? 請各位賜教,在此表示感謝!


大家好?請問(wèn)那位大俠做過(guò)USB芯片和單片機連接通信,讀取數據的工程,比如說(shuō)PIC單片機,上位機電腦要讀取單片機測試來(lái)的數據,剛上電要監測單片機工作與否,發(fā)送測試命令,單片機回復信息在電腦上是怎么顯示的,是不是有軟件?讀去數據像不像U盤(pán),如果單片機的數據是一些純數值數據?


網(wǎng)上下載關(guān)于CH372評估板的資料,通過(guò)USB將下位機(單片機)和PC機進(jìn)行數據上下傳輸.


各位大蝦,請問(wèn)我用彈片機往ch375緩沖區里寫(xiě)數,為什么寫(xiě)不進(jìn)呢.會(huì )有什么容易出現的錯誤呢?


只有登錄才能回復,可以選擇微信賬號登錄
97精品依人久久久大香线蕉97-亚洲欧美日韩一区二区三区-国产亚洲欧美精品久久久-久久99精品久久久大学生-亚洲成a人片在线不卡一二三区 97精品依人久久久大香线蕉97-亚洲欧美日韩一区二区三区-国产亚洲欧美精品久久久-久久99精品久久久大学生-亚洲成a人片在线不卡一二三区