ch375收到很多USB_INT_EP0_OUT中斷,但是數(shù)據(jù)長(zhǎng)度為0

用ch375作為USB設(shè)備的外部固件模式,在枚舉階段就收到USB_INT_EP0_OUT中斷,讀出的數(shù)據(jù)長(zhǎng)度為0,這是怎么回事?現(xiàn)在枚舉也過不了呀

這個(gè)主要是獲取設(shè)備描述符,獲取配置描述符之類的控制傳輸,在完成一次傳輸之后會(huì)返回一個(gè)0長(zhǎng)度的包做為響應(yīng)。枚舉不過需要看下你首先有沒有獲取到設(shè)備描述符的命令。你可以借助BUSHOUND這個(gè)軟件看下數(shù)據(jù)在分析原因。


我的程序大概是這樣的:中斷處理函數(shù)在收到USB_INT_EP0_SETUP中斷后,就向ch372任務(wù)發(fā)一條消息,ch372任務(wù)被喚醒后處理相關(guān)事宜(這時(shí)處于開中斷狀態(tài)),如讀取usb請(qǐng)求,返回描述符等。這樣就會(huì)收到很多USB_INT_EP0_OUT中斷,并且讀出的數(shù)據(jù)長(zhǎng)度為0。

我看你們的例子程序中斷處理完全都是在中斷處理函數(shù)中進(jìn)行的,改成你們那種方式后就不會(huì)出現(xiàn)這種現(xiàn)象了。

我前面那種方式會(huì)導(dǎo)致時(shí)序不正確還是什么原因?


按照你的描述可能是丟中斷了。建議你按照我們的操作流程來操作。


新手求解,程序運(yùn)行到”檢測(cè)U盤是否插入的地方”就重新單片機(jī)了 #include #include #include

#define EN_DISK_QUERY 1 /* 啟用磁盤查詢 */

#include "HAL.H" #include "DEBUG.H" #include "FILE_SYS.H" #include "CH376INC.H"

UINT8 xdata buf[64];

void main(void) { UINT8 i, s; UINT16 len; P_FAT_DIR_INFO pDir; UINT8 xdata SrcName[64]; UINT8 xdata TarName[64]; mDelaymS( 100 ); /* 延時(shí)100毫秒 */ mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ printf( "系統(tǒng)啟動(dòng)---Start\n" );

s = mInitCH376Host( ); /* 初始化CH376 */ ; mStopIfError( s ); /* 其它電路初始化 */

while ( 1 ) { printf( "等待U盤或者SD卡插入---Wait Udisk/SD\n" );

while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤插入,對(duì)于SD卡,可以由單片機(jī)直接查詢SD卡座的插拔狀態(tài)引腳 */ mDelaymS( 100 ); }

mDelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */

/* 對(duì)于檢測(cè)到USB設(shè)備的,最多等待100*50mS,主要針對(duì)有些MP3太慢,對(duì)于檢測(cè)到USB設(shè)備并且連接DISK_MOUNTED的,最多等待5*50mS,主要針對(duì)DiskReady不過的 */ for ( i = 0; i < 100; i ++ ) { /* 最長(zhǎng)等待時(shí)間,100*50mS */ mDelaymS( 50 ); printf( "準(zhǔn)備好了? ---- Ready ?\n" ); s = CH376DiskMount( ); /* 初始化磁盤并測(cè)試磁盤是否就緒 */ if ( s == USB_INT_SUCCESS ) break; /* 準(zhǔn)備好 */ else if ( s == ERR_DISK_DISCON ) break; /* 檢測(cè)到斷開,重新檢測(cè)并計(jì)時(shí) */ if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; /* 有的U盤總是返回未準(zhǔn)備好,不過可以忽略,只要其建立連接MOUNTED且嘗試5*50mS */ }

if ( s == ERR_DISK_DISCON ) { /* 檢測(cè)到斷開,重新檢測(cè)并計(jì)時(shí) */ printf( "設(shè)備已斷開---Device gone\n" ); continue; }

if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) { /* 未知USB設(shè)備,例如USB鍵盤、打印機(jī)等 */ printf( "Unknown device\n" ); goto UnknownUsbDevice; } i = CH376ReadBlock( buf ); /* 如果需要,可以讀取數(shù)據(jù)塊CH376_CMD_DATA.DiskMountInq,返回長(zhǎng)度 */ if ( i == sizeof( INQUIRY_DATA ) ) { /* U盤的廠商和產(chǎn)品信息 */ buf[ i ] = 0; printf( "U盤廠商---UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); }

/* 讀取文件 */ strcpy( SrcName, "\\C51\\CH376HFT.C" ); /* 源文件名,多級(jí)目錄下的文件名和路徑名必須復(fù)制到RAM中再處理,而根目錄或者當(dāng)前目錄下的文件名可以在RAM或者ROM中 */ strcpy( TarName, "\\NEWFILE.TXT" ); /* 目標(biāo)文件名 */ printf( "打開文件 --- Open\n" ); s = CH376FileOpenPath( SrcName ); /* 打開文件,該文件在C51子目錄下 */ if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE ) { /* 沒有找到目錄或者沒有找到文件 */ /* 列出文件,完整枚舉可以參考EXAM13全盤枚舉 */ if ( s == ERR_MISS_DIR ) strcpy( buf, "\\*" ); /* C51子目錄不存在則列出根目錄下的文件 */ else strcpy( buf, "\\C51\\CH376*" ); /* CH376HFT.C文件不存在則列出\C51子目錄下的以CH376開頭的文件 */ printf( "列舉所有文件---List file %s\n", buf ); s = CH376FileOpenPath( buf ); /* 枚舉多級(jí)目錄下的文件或者目錄,輸入緩沖區(qū)必須在RAM中 */ while ( s == USB_INT_DISK_READ ) { /* 枚舉到匹配的文件 */ CH376ReadBlock( buf ); /* 讀取枚舉到的文件的FAT_DIR_INFO結(jié)構(gòu),返回長(zhǎng)度總是sizeof( FAT_DIR_INFO ) */ pDir = (P_FAT_DIR_INFO)buf; /* 當(dāng)前文件目錄信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本級(jí)或者上級(jí)目錄名則繼續(xù),否則必須丟棄不處理 */ if ( pDir -> DIR_Name[0] == 0x05 ) pDir -> DIR_Name[0] = 0xE5; /* 特殊字符替換 */ pDir -> DIR_Attr = 0; /* 強(qiáng)制文件名字符串結(jié)束以便打印輸出 */

/* 打印名稱,原始8+3格式,未整理成含小數(shù)點(diǎn)分隔符 */ printf( "*** EnumName: %s\n", pDir -> DIR_Name ); } xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 繼續(xù)枚舉文件和目錄 */ xEndCH376Cmd( ); s = Wait376Interrupt( ); } if ( s != ERR_MISS_FILE ) mStopIfError( s ); /* 操作出錯(cuò) */

/*--- 新建一個(gè)文件 ---*/ printf( "新文件被創(chuàng)建---Create\n" ); s = CH376FileCreatePath( TarName ); /* 新建多級(jí)目錄下的文件,支持多級(jí)目錄路徑,輸入緩沖區(qū)必須在RAM中 */ mStopIfError( s ); printf( "新文件被寫入---Write\n" ); strcpy( buf, "找不到/C51/CH376HFT.C文件,歡迎使用一鳴電子模塊!\xd\n" ); s = CH376ByteWrite( buf, strlen(buf), NULL ); /* 以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 */ mStopIfError( s ); printf( "新文件被關(guān)閉---Close\n" ); s = CH376FileClose( TRUE ); /* 關(guān)閉文件,對(duì)于字節(jié)讀寫建議自動(dòng)更新文件長(zhǎng)度 */ mStopIfError( s );

printf("\n"); strcpy( TarName, "\\YI.TXT" ); /* 目標(biāo)文件名 */ /*--- 新建另外一個(gè)文件;文件名:yimingtest.txt ---*/ printf( "創(chuàng)建另外一個(gè)文件---Create\n" ); s = CH376FileCreatePath( TarName ); mStopIfError( s ); printf( "新文件被寫入----Write\n" ); strcpy( buf, "恭喜發(fā)財(cái)了!\xd\n" ); s = CH376ByteWrite( buf, strlen(buf) , NULL); mStopIfError ( s ); printf( "文件被關(guān)閉 --- Close\n" ); s = CH376FileClose(TRUE); mStopIfError( s );

/*--- 追加文件數(shù)據(jù)的例子 ---*/ printf( "\n" ); strcpy( SrcName, "\\YI.TXT" ); s = CH376FileOpenPath( SrcName ); printf( "Error: %02X\n", (UINT16)s ); if( s == USB_INT_SUCCESS ) { //成功打開文件 strcpy( buf, "是不是要請(qǐng)哥們吃飯了呢?\xd\n" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL); mStopIfError ( s ); printf( "文件被關(guān)閉 --- Close\n" ); s = CH376FileClose(TRUE); mStopIfError( s ); } else mStopIfError( s ); /*--- 讀取文件數(shù)據(jù)的例子 ---*/ printf( "\n" ); printf( "讀取文件數(shù)據(jù)的例子:\n" ); strcpy( SrcName, "\\YI.TXT" ); s = CH376FileOpenPath( SrcName ); printf( "Error: %02X\n", (UINT16)s ); if( s == USB_INT_SUCCESS ) { len = CH376GetFileSize(); CH376ByteLocate( 0 ); CH376ByteRead(buf,len,NULL); printf( "%s \n", buf);

mStopIfError ( s ); printf( "文件被關(guān)閉 --- Close\n" ); s = CH376FileClose(TRUE); mStopIfError( s ); } else mStopIfError( s ); } else { /* 找到文件或者出錯(cuò) */ mStopIfError( s ); }

UnknownUsbDevice: printf( "設(shè)備拔出 --- Take out\n" ); while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤拔出 */ mDelaymS( 100 ); } mDelaymS( 200 ); }


你把原理圖發(fā)到我郵箱。正常連接的情況下,我們芯片不對(duì)導(dǎo)致你單片機(jī)復(fù)位的,單片機(jī)復(fù)位因素主要有電源不穩(wěn)定,復(fù)位引腳有復(fù)位信號(hào),看門狗復(fù)位,你檢測(cè)下是什么情況導(dǎo)致你單片機(jī)復(fù)位的


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

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