CH375和CH372常見問題的解決[討論]

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


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

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


多謝,很有價值


很好,收藏!


收益匪淺!


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

write_command(CMD_CHECK_EXIST); /* 1. 測試工作狀態(tài)是否正常? */ write_data(0x5a); /* 測試數(shù)據(jù) */ c = read_data(); for(j=0;j<100;j++) /* 延時等待U盤進入正常工作狀態(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盤連接 */  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盤連接 */ 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設備斷開 */ write_command( CMD_DISK_INIT ); /* 初始化USB存儲器 */ c = wait_interrupt(); /* 等待中斷并獲取狀態(tài) */ if ( c == USB_INT_SUCCESS ) return( 0 ); /* U盤已經(jīng)成功初始化 */ else return( c ); /* 出現(xiàn)錯誤 */ }

unsigned char read_sector( unsigned long start, unsigned char count ) { /* iLbaStart 是準備讀取的線性起始扇區(qū)號, count 是準備讀取的扇區(qū)數(shù) */

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

write_command( CMD_DISK_READ ); /* 從USB存儲器讀數(shù)據(jù)塊 */ 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 ); /* 扇區(qū)數(shù) */ ptr = &buf[0]; for ( i = count * CH375_BLK_PER_SEC; i != 0; i -- ) /* 數(shù)據(jù)塊計數(shù) */ { err = wait_interrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( err == USB_INT_DISK_READ ) /* USB存儲器讀數(shù)據(jù)塊,請求數(shù)據(jù)讀出 */ { write_command( CMD_RD_USB_DATA ); /* 從CH375緩沖區(qū)讀取數(shù)據(jù)塊 */ len = read_data( ); /* 后續(xù)數(shù)據(jù)的長度 */ while ( len ) /* 根據(jù)長度讀取數(shù)據(jù) */ { *ptr = read_data( ); /* 讀出數(shù)據(jù)并保存 */ ptr ++; len --; } return ( 0 ); //write_command( CMD_DISK_RD_GO ); /* 繼續(xù)執(zhí)行USB存儲器的讀操作 */ } else break; } if ( i == 0 ) err = wait_interrupt( ); if ( err == USB_INT_SUCCESS ) return( 0 ); else return( err ); }


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


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


讀天朗A10U盤的問題解決了。下面部分源代碼 /******************************************************************/ /*名稱: ReadSector(ulong Sectors,uchar xdata *pr) */ /*描述: 讀扇區(qū)內(nèi)容 每次讀1個扇區(qū) */ /*輸入?yún)?shù):扇區(qū)地址,接收緩沖區(qū)指針 */ /*輸出參數(shù):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;/*扇區(qū)數(shù)*/ 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);/*這里延時是關鍵*/ CH375_CMD_PORT=CMD_DISK_RD_GO;/*繼續(xù)執(zhí)行讀操作*/ 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文件的讀寫有沒有庫函數(shù)???


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


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


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


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


各位大蝦,請問我用彈片機往ch375緩沖區(qū)里寫數(shù),為什么寫不進呢.會有什么容易出現(xiàn)的錯誤呢?


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

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