CH376檢測(cè)不到U盤

在使用貴公司CH376評(píng)估板時(shí),檢測(cè)不到U盤.初始化376正常,但是到了檢測(cè)U盤是否連接時(shí),用DEBUG.C觀察,一直輸出 Start Wait Udisk/SD 這是什么原因了??或者我可以用什么辦法進(jìn)一步調(diào)試呢??本人新手,望不吝賜教,謝謝

使用的程序是參考貴公司提供的EXAM8,就改了硬件連接部分,初始化能成功,說明硬件應(yīng)該沒什么問題吧


單片機(jī)的RAM有沒有溢出?


關(guān)于中斷定義是否正確?和實(shí)際連接的是否一致? 當(dāng)插入U(xiǎn)盤后,中斷引腳是否有中斷輸出?MCU是否能夠檢測(cè)到?


我用示波器測(cè)了一下INT#腳: 不連接U盤的情況下,是一個(gè)15ms寬周期兩秒的正脈沖 連接U盤后,是一個(gè)15ms寬周期兩秒的負(fù)脈沖 這是什么原因???連U盤跟不連U盤輸出相反??


單片機(jī)RAM沒有益處,我外擴(kuò)了32K. 而且我用串口調(diào)試助手觀察,一直輸出Start Wait Udisk/SD,但是按照程序,他不是應(yīng)該只輸出一次Start Wait Udisk/SD就行了嗎,然后等待U盤連接..我插上U盤,他還是輸出Start Wait Udisk/SD


如果一直輸出Start Wait Udisk/SD,那么程序應(yīng)該是在復(fù)位,程序編譯鏈接有沒有異常警告阿


還是程序有點(diǎn)問題, 你把這部分貼出來看看,不應(yīng)該老是輸出的。


UINT8 s; UINT8 month, date, hour; UINT16 year, adc; P4SW=0x10; P4_4=0; Delayzz(100000); /*while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }*/ P1_0=0; mDelaymS( 1000 ); /* 延時(shí)100毫秒 */ mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ printf( "Start\n" );

s = mInitCH376Host( ); /* 初始化CH376 */ /*while(s==USB_INT_SUCCESS) {while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }}*/ mStopIfError( s ); /* 其它電路初始化 */ while(1);//標(biāo)志 謝謝SCM的提醒,但是我在主函數(shù)中加了一個(gè)while(1)測(cè)試,發(fā)現(xiàn)程序不在一直復(fù)位(若一直復(fù)位應(yīng)該輸出Start,但他只輸出一次); 于是我把標(biāo)志那一行換成了檢查磁盤連接的函數(shù)CH376DiskConnect( ); 結(jié)果程序就一直復(fù)位,即一直輸出Start, CH376DiskConnect( );函數(shù)對(duì)程序有什么影響嗎?


而且此時(shí)INT#腳輸出的是一個(gè)15ms寬周期兩秒的正脈沖


CH376DiskConnect( );這個(gè)函數(shù)有原型,你找到這個(gè)代碼看一下,就讀了一下中斷狀態(tài)而已。沒做什么。 因?yàn)槔鲜侵貜?fù)執(zhí)行s = mInitCH376Host( ); ,所以CH376不斷的能檢測(cè)到U盤連接,不斷的產(chǎn)生中斷。這就是不斷產(chǎn)生中斷的原因。 你把主函數(shù)所有的部分打包上傳。你貼的函數(shù)很多地方是看不到的。 你把標(biāo)注這一行換成 CH376DiskConnect( ); 后面要加while(1); 否則的話,程序執(zhí)行完CH376DiskConnect( );后MCU不知道怎么執(zhí)行了,PC值重新開始執(zhí)行,你看到的現(xiàn)象就是一直復(fù)位。PC從0考試執(zhí)行了 建議你直接用我們提供的CH376HFT.C,就不會(huì)有這種問題。


謝謝紅桃六,我在CH376DiskConnect( );后面加了while(1);程序還是會(huì)出現(xiàn)復(fù)位 我貼的就是主函數(shù)了,就是按照CH376HFT.C來的 void main( ) { UINT8 s; UINT8 month, date, hour; UINT16 year, adc; P4SW=0x10; //這兩句是我設(shè)置的P4口,與U盤連接無關(guān) P4_4=0; Delayzz(100000); /延時(shí) /*while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }*/ P1_0=0; //標(biāo)志燈,與U盤連接無關(guān) mDelaymS( 1000 ); /* 延時(shí)100毫秒 */ mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ printf( "Start\n" );

s = mInitCH376Host( ); /* 初始化CH376 */ /*while(s==USB_INT_SUCCESS) {while(1) { P1_2=0;Delayzz(25000); P1_2=1;Delayzz(25000); }}*/ //測(cè)試用,與U盤連接無關(guān) mStopIfError( s ); /* 其它電路初始化 */ CH376DiskConnect( ); //用串口助手觀察,執(zhí)行到這程序就一直復(fù)位,曲調(diào)他就不會(huì) while(1); while ( 1 ) { printf( "Wait Udisk/SD\n" ); s=CH376DiskConnect( ); printf( "Error: %02X\n", s ); //s=CH376DiskConnect( );mStopIfError( s ); while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤插入,對(duì)于SD卡,可以由單片機(jī)直接查詢SD卡座的插拔狀態(tài)引腳 */ mDelaymS( 1000 ); } mDelaymS( 2000 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */

/* 對(duì)于檢測(cè)到USB設(shè)備的,最多等待10*50mS */ for ( s = 0; s < 10; s ++ ) { /* 最長(zhǎng)等待時(shí)間,10*50mS */ mDelaymS( 50 ); printf( "Ready ?\n" ); if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盤并測(cè)試磁盤是否就緒 */ } // s = CH376ReadBlock( buf ); /* 如果需要,可以讀取數(shù)據(jù)塊CH376_CMD_DATA.DiskMountInq,返回長(zhǎng)度 */ // if ( s == sizeof( INQUIRY_DATA ) ) { /* U盤的廠商和產(chǎn)品信息 */ // buf[ s ] = 0; // printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); // }

/* 檢查U盤或者SD卡的剩余空間 */ printf( "DiskQuery: " ); s = CH376DiskQuery( (PUINT32)buf ); /* 查詢磁盤剩余空間信息,扇區(qū)數(shù) */ mStopIfError( s ); // printf( "free cap = %ld MB\n", *(PUINT32)buf * DEF_SECTOR_SIZE / 1000000 ); /* 未用扇區(qū)數(shù)乘以扇區(qū)大小后,除以1M換算為兆字節(jié)單位 */ printf( "free cap = %ld MB\n", *(PUINT32)buf / ( 1000000 / DEF_SECTOR_SIZE ) ); /* 上面一行的計(jì)算可能會(huì)溢出,換個(gè)順序計(jì)算 */

/* 如果MY_ADC.TXT文件已經(jīng)存在則添加數(shù)據(jù)到尾部,如果不存在則新建文件 */ printf( "Open\n" ); s = CH376FileOpen( "/MY_ADC.TXT" ); /* 打開文件,該文件在根目錄下 */ if ( s == USB_INT_SUCCESS ) { /* 文件存在并且已經(jīng)被打開,移動(dòng)文件指針到尾部以便添加數(shù)據(jù) */ NewSize = CH376GetFileSize( ); /* 讀取當(dāng)前文件長(zhǎng)度,如果沒有零頭數(shù)據(jù),那么文件長(zhǎng)度是DEF_SECTOR_SIZE的倍數(shù) */ printf( "File size = %ld\n", NewSize ); printf( "Locate tail\n" ); s = CH376SecLocate( 0xFFFFFFFF ); /* 以扇區(qū)為單位移到文件尾部,如果文件尾部有不足一個(gè)扇區(qū)的零頭數(shù)據(jù)則被忽略,如果不做處理那么零頭數(shù)據(jù)將可能被寫入數(shù)據(jù)覆蓋 */ mStopIfError( s ); total = NewSize & ( DEF_SECTOR_SIZE - 1 ); /* 上次保存文件時(shí)如果尾部有零頭數(shù)據(jù),那么先取得零頭字節(jié)數(shù),不滿扇區(qū)長(zhǎng)度的零碎數(shù)據(jù) */ printf( "Read last tail = %d Bytes\n", total ); if ( total ) { /* 原尾部有零頭數(shù)據(jù),那么先調(diào)入內(nèi)存,以便接著添加數(shù)據(jù) */ s = CH376SecRead( FileDataBuf, 1, NULL ); /* 從文件讀取尾部零頭數(shù)據(jù) */ mStopIfError( s ); s = CH376SecLocate( 0xFFFFFFFF ); /* 重新回到原文件的尾部,下面如果寫入數(shù)據(jù)將覆蓋原尾部零頭數(shù)據(jù),不過原零頭數(shù)據(jù)剛才已經(jīng)被讀入內(nèi)存,所以請(qǐng)放心 */ mStopIfError( s ); } } else if ( s == ERR_MISS_FILE ) { /* 沒有找到文件,必須新建文件 */ printf( "Create\n" ); s = CH376FileCreate( NULL ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建,不必再提供文件名,剛才已經(jīng)提供給CH376FileOpen */ mStopIfError( s ); total = 0; /* 此前沒有零頭數(shù)據(jù) */ NewSize = 0; } else mStopIfError( s ); /* 打開文件時(shí)出錯(cuò) */ printf( "Write begin\n" ); total += sprintf( FileDataBuf + total, "在本次添加數(shù)據(jù)之前,該文件已有數(shù)據(jù)的長(zhǎng)度是 %ld 字節(jié)\xd\xa", NewSize ); /* 將新數(shù)據(jù)添加到緩沖區(qū)的尾部,累計(jì)緩沖區(qū)內(nèi)的數(shù)據(jù)長(zhǎng)度 */ mFlushBufferToDisk( 0 ); /* 自動(dòng)刷新緩沖區(qū),檢查緩沖區(qū)是否已滿,滿則寫盤 */ printf( "Write ADC data\n" ); TR0=1; /* 用定時(shí)器0的計(jì)數(shù)值代替ADC數(shù)據(jù) */ for ( month = 1; month != 12; month ++ ) { /* 因?yàn)闇y(cè)試板上沒有實(shí)時(shí)時(shí)鐘芯片,所以用循環(huán)方式模擬月份 */ for ( date = 1; date != 30; date ++ ) { /* 因?yàn)闇y(cè)試板上沒有實(shí)時(shí)時(shí)鐘芯片,所以用循環(huán)方式模擬日期 */ year = 2004; /* 假定為2004年 */ hour = TL1 & 0x1F; /* 因?yàn)闇y(cè)試板上沒有實(shí)時(shí)時(shí)鐘芯片,所以用定時(shí)器1的計(jì)數(shù)代替進(jìn)行演示 */ /* adc = get_adc_data( ); */ adc = ( (UINT16)TH0 << 8 ) | TL0; /* 因?yàn)闇y(cè)試板上沒有ADC,所以用定時(shí)器0的計(jì)數(shù)代替ADC數(shù)據(jù)演示 */ total += sprintf( FileDataBuf + total, "Year=%04d, Month=%02d, Date=%02d, Hour=%02d, ADC_data=%u\xd\xa", year, (UINT16)month, (UINT16)date, (UINT16)hour, adc ); /* 將二制制數(shù)據(jù)格式為一行字符串 */ if ( month == 6 && ( date & 0x0F ) == 0 ) mFlushBufferToDisk( 1 ); /* 強(qiáng)制刷新緩沖區(qū),定期強(qiáng)制刷新緩沖區(qū),這樣在突然斷電后可以減少數(shù)據(jù)丟失 */ else mFlushBufferToDisk( 0 ); /* 自動(dòng)刷新緩沖區(qū),檢查緩沖區(qū)是否已滿,滿則寫盤 */ printf( "Current total is %d\n", total ); /* 用于監(jiān)控檢查 */ } } printf( "Write end\n" ); total += sprintf( FileDataBuf + total, " ********************************* " ); /* 將新數(shù)據(jù)添加到緩沖區(qū)的尾部,累計(jì)緩沖區(qū)內(nèi)的數(shù)據(jù)長(zhǎng)度 */ total += sprintf( FileDataBuf + total, "這次的ADC數(shù)據(jù)到此結(jié)束,程序即將退出\xd\xa" ); /* 將新數(shù)據(jù)添加到緩沖區(qū)的尾部,累計(jì)緩沖區(qū)內(nèi)的數(shù)據(jù)長(zhǎng)度 */ mFlushBufferToDisk( 1 ); /* 強(qiáng)制刷新緩沖區(qū),因?yàn)橄到y(tǒng)要退出了,所以必須強(qiáng)制刷新 */ printf( "Close\n" ); s = CH376FileClose( FALSE ); /* 關(guān)閉文件,扇區(qū)模式通常不自動(dòng)更新文件長(zhǎng)度,因?yàn)閺?qiáng)制刷新緩沖區(qū)時(shí)已經(jīng)更新了文件長(zhǎng)度,所以這里不需要自動(dòng)更新文件長(zhǎng)度 */ mStopIfError( s );

printf( "Take out\n" ); while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤拔出 */ mDelaymS( 100 ); } mDelaymS( 200 ); } } 因?yàn)檫€沒調(diào)到后面,所以才沒貼出來 現(xiàn)在連U盤都沒連接到...


導(dǎo)致復(fù)位還有可能是RAM溢出,請(qǐng)檢查,看門狗復(fù)位,有沒有啟動(dòng)看門狗? 如果外部導(dǎo)致復(fù)位的話,無非就是復(fù)位引腳導(dǎo)致的。其他應(yīng)該不會(huì)有什么原因了。


謝謝紅桃六的提醒,這些我都查過了 主要是我前面說的,加上CH376DiskConnect( )才出現(xiàn)復(fù)位..不加就不會(huì)

另外,我在UINT8 CH376GetIntStatus( void ) /* 獲取中斷狀態(tài)并取消中斷請(qǐng)求 */ { UINT8 s; xWriteCH376Cmd( CMD01_GET_STATUS ); s = xReadCH376Data( ); printf( "Error: %02X\n", s );//加上的 xEndCH376Cmd( ); return( s ); }中加了一句用作調(diào)試,發(fā)現(xiàn)輸出的s為150B, 好象是說明能檢測(cè)的U盤連接吧??而且能發(fā)現(xiàn)USB總線復(fù)位? 但是連上U盤后一直輸出 Start Wait Udisk/SD Error: 150B //Error是我自己加上的,為了看s的值 不連U盤一直輸出 Start Wait Udisk/SD


問題解決了 單片機(jī)老是復(fù)位是因?yàn)檫@個(gè)警告*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL 我在file_sys.c中沒有定義 xEndCH376Cmd( ); 雖然這個(gè)#define xEndCH376Cmd( ) /* 結(jié)束CH376命令,僅用于SPI接口方式 */ 但是如果在file_sys.c中不定義宏,會(huì)導(dǎo)致單片機(jī)找不到宏定義而一直復(fù)位,不知道我分析的對(duì)不對(duì) 我在file_sys.c中加上宏定義#define xEndCH376Cmd( ) 1 ,就好了 謝謝貴公司技術(shù)支持人員提供的調(diào)試建議~~~以后還請(qǐng)多幫助


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

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