[求助]PIC讀取U盤,出現(xiàn)讀取錯誤

我用PIC MCU控制CH375,讀取U盤中的MP3數(shù)據(jù)到VS1003中解碼播放,在播放中途出現(xiàn)數(shù)據(jù)讀取錯誤,經(jīng)過仿真跟蹤,發(fā)現(xiàn)CH375無法產(chǎn)生中斷信號,CH375的中斷處理采用查詢方式.請問這種情況是什么原因,該怎么解決呢? 相關(guān)的程序如下: /******************************************* 函數(shù)名稱:Ch375WaitInt() 作 用:等待CH375中斷 入 口:無; 出 口:中斷狀態(tài) *******************************************/ unsigned char Ch375WaitInt( void ) { unsigned long x; x = 0x3fffff; while( USBINT>0 ) { // 查詢等待CH375操作完成中斷(INT#低電平) USBINT_T = 1; x--; if( x == 0 ) { break; } } if(x == 0) { return USB_INT_DISK_ERR; }

Ch375WrCmdPort( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */ return( Ch375RdDatPort( ) ); }

/******************************************* 函數(shù)名稱:CH375WriteSector() 作 用:CH375扇區(qū)寫入 入 口:扇區(qū)號LBA,緩沖區(qū)地址 出 口:返回狀態(tài); *******************************************/ unsigned char CH375WriteSector( unsigned long lba, unsigned char *buff ) { unsigned char blockcnt,cnt; Ch375WrCmdPort( CMD_DISK_WRITE ); Ch375WrDatPort( (unsigned char)(lba&0xff) ); Ch375WrDatPort( (unsigned char)((lba>>8)&0xff) ); Ch375WrDatPort( (unsigned char)((lba>>16)&0xff) ); Ch375WrDatPort( (unsigned char)((lba>>24)&0xff) ); Ch375WrDatPort( 1 ); //寫一個扇區(qū) for( blockcnt=8; blockcnt>0; blockcnt--) { cnt = Ch375WaitInt(); if( cnt == USB_INT_DISK_WRITE ) { Ch375WrCmdPort( CMD_WR_USB_DATA7 ); Ch375WrDatPort( 64 ); //寫入64字節(jié) for( cnt=64 ; cnt>0; cnt--) { Ch375WrDatPort( *buff ); buff++; } Ch375WrCmdPort( CMD_DISK_WR_GO ); } else { break; } } if( blockcnt == 0 ) { return( Ch375WaitInt() ); } else { return(cnt); } }

補充說明一下,上述故障是隨機出現(xiàn)的,有時候出現(xiàn)在剛開始播放,有時候在播放的中途出現(xiàn),播放高速率音樂和低速率的時候都是一樣的~~~


(1)讀文件的部分的程序在哪? (2)可以做個實驗,把讀取出來數(shù)據(jù)扔掉,不送給VS1003播放,看看能否正確讀完一個文件。 (3)能否把整個流程貼出來,從讀文件到送給VS1003播放


SCM您好~~程序如下: /******************************************* 函數(shù)名稱:_ISR _CNInterrupt() 作 用:電平變化中斷處理 入 口:無; 出 口:無; *******************************************/ void _ISR _CNInterrupt( void ) { unsigned int cnt = 0; static unsigned char tcnt = 0; char buff[32]; unsigned char state; static unsigned long size = 0L;

if( ( _CNIE && _CN17IE ) && _CNIF ) { while( _RF4 == 1 ) { Mp3VolumeSet(); //音量設(shè)置 Mp3EffectSet(); //音效設(shè)置 cnt = FSfread ((char *)buff, 1, 32, gAudioFilePointer);//讀取數(shù)據(jù) size += cnt;//調(diào)整已讀文件大小 state = 0; if( cnt != 32 ) { Isr_CN_Close();//關(guān)閉中斷 FSfclose( gAudioFilePointer );//關(guān)閉文件 gMp3Status &= 0xfc;//清除播放狀態(tài)標志 gMp3Status |= MP3OVERMODE; //播放結(jié)束 state = 1; if( ( size != gAudioFilePointer->size )&&( cnt == 0 ) ) {//文件讀取錯誤 break; } }

//數(shù)據(jù)讀取正常,裝載數(shù)據(jù) tcnt++; WaitBusy(); LoadAudioData( (char *)buff, cnt ); if( (tcnt&0x7f) == 0 ) {//每4K數(shù)據(jù)讀取時間寄存器 gAudioDecodeTime = Mp3SCIRead( SPI_DECODE_TIME ); WaitBusy();//等待VS1003命令處理完畢 tcnt = 0; } cnt = 0; if( size == gAudioFilePointer->size ) { break; }//文件播放完畢,退出 } if( state > 0 ) { size = 0; ClearMp3Ram(); //清除VS1003的內(nèi)部RAM Mp3SCIWrite(SPI_VOL, 0xffff); //靜音 tcnt = 0; } cnt = PORTF; _CNIF = 0; //清除標志 } }

數(shù)據(jù)讀取是采用VS1003中斷來讀取數(shù)據(jù)的,VS1003可以輸入數(shù)據(jù)的時候,中斷程序讀取已經(jīng)打開的文件將VS1003緩沖器填滿后退出中斷,中送數(shù)據(jù)前檢查是否需要設(shè)置音量或者音效,每傳送4K數(shù)據(jù)讀取一次時間寄存器,防止頻繁的讀取時間寄存器影響CPU的工作效率. . 讀取程序如下,昨天是大意,本來是上傳讀程序,結(jié)果弄錯了.

************************************** 函數(shù)名稱:CH375ReadSector() 作 用:CH375扇區(qū)讀取 入 口:扇區(qū)號LBA,緩沖區(qū)地址 出 口:返回狀態(tài); *******************************************/ unsigned char CH375ReadSector( unsigned long lba, unsigned char *buff ) { unsigned char blockcnt,cnt; Ch375WrCmdPort( CMD_DISK_READ ); Ch375WrDatPort( (unsigned char)(lba&0xff) ); Ch375WrDatPort( (unsigned char)((lba>>8)&0xff) ); Ch375WrDatPort( (unsigned char)((lba>>16)&0xff) ); Ch375WrDatPort( (unsigned char)((lba>>24)&0xff) ); Ch375WrDatPort( 1 ); //讀取一個扇區(qū) for( blockcnt=8; blockcnt>0; blockcnt--) { cnt = Ch375WaitInt(); if( cnt == USB_INT_DISK_READ ) { Ch375WrCmdPort( CMD_RD_USB_DATA ); cnt = Ch375RdDatPort(); for( ; cnt>0; cnt--) { *buff = Ch375RdDatPort(); buff++; } Ch375WrCmdPort( CMD_DISK_RD_GO ); } else { break; } } if( blockcnt == 0 ) { return( Ch375WaitInt() ); } else { return(cnt); }

}

另外設(shè)置全文件讀取而不播放的方式,我需要修改程序試一下,由于公司另做安排,需要出差幾天,希望大家能多幫助一下,謝謝,等項目完成后,我會把PIC+CH375是全套FAT程序與大家共享~~


讀取扇區(qū)部分的流程基本沒問題。只是命令與數(shù)據(jù)之間的延時和數(shù)據(jù)與數(shù)據(jù)之間的延時是多少?具體的參數(shù)可以參考手冊 還有你所說的出錯,錯在哪一步,出什么錯


SCM,你好! 出差回來了,耽擱了幾天.

按照你建議的直接程序讀取我測試了,依然發(fā)生讀取錯誤.

我的命令之間的延遲4uS左右,數(shù)據(jù)間的延遲是4uS左右. 出錯是如下程序發(fā)生超時退出,具體是 CH375ReadSector( unsigned long lba, unsigned char *buff ) 中的那一句我還要再測試一下才知道. /******************************************* 函數(shù)名稱:Ch375WaitInt() 作 用:等待CH375中斷 入 口:無; 出 口:中斷狀態(tài) *******************************************/ unsigned char Ch375WaitInt( void ) { unsigned long x; x = 0x3fffff; while( USBINT>0 ) { // 查詢等待CH375操作完成中斷(INT#低電平) USBINT_T = 1; x--; if( x == 0 ) { break; } } if(x == 0) { return USB_INT_DISK_ERR; }

Ch375WrCmdPort( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷,獲取中斷狀態(tài) */ return( Ch375RdDatPort( ) ); }


斑竹,你好!

數(shù)據(jù)讀取錯誤的問題已經(jīng)解決了~~問題與芯片及程序都沒有關(guān)系,是因為我的并行口是模擬時序,與我的LCD發(fā)生了沖突,忘記了對LCD操作時候禁止中斷.現(xiàn)在已經(jīng)解決~~特報告一下!

不過現(xiàn)在也遇到了另外的問題,我的芯片是CH375B和CH375V,兩種型號的芯片都出現(xiàn)了U盤識別率比較低,很多SD卡讀卡器(單SD卡讀卡器)都無法識別,MP3\MP4也不能連接識別,想問問初始化連接這些USB設(shè)備需要注意些什么?請指點一二. 我的初始化程序如下:

/******************************************* 函數(shù)名稱:Ch375Init() 作 用:初始化CH375工作狀態(tài) 入 口:無; 出 口:無; *******************************************/ void Ch375Init( void ) { CH375PortInit(); UsbSelection( HOSTUSB1 ); //USB通道選擇 Ch375ResetAll(); Ch375WrCmdPort( CMD_SET_USB_MODE ); // 初始化CH375,設(shè)置USB工作模式 Ch375WrDatPort( 0x06 ); // 模式代碼,自動檢測USB設(shè)備連接 D_N_mS(1000); //延遲1S }

/******************************************* 函數(shù)名稱:DiskInit() 作 用:初始化移動存儲器 入 口:磁盤容量信息存放指針; 出 口:返回測試狀態(tài); *******************************************/ unsigned char DiskInit( unsigned char *buff ) { unsigned char state; unsigned char cnt; Ch375WrCmdPort( CMD_GET_STATUS ); CH375_Hold(10); state = Ch375RdDatPort(); if( state == USB_INT_DISCONNECT ) { return(state); } Ch375WrCmdPort( CMD_DISK_INIT ); // 初始化USB存儲器 state = Ch375WaitInt(); if( state != USB_INT_SUCCESS ) { return(state); } Ch375WrCmdPort( CMD_DISK_SIZE ); // 獲取USB存儲器的容量 state = Ch375WaitInt(); if( state != USB_INT_SUCCESS ) { D_N_mS(100); Ch375WrCmdPort( CMD_DISK_SIZE ); state = Ch375WaitInt(); } if( state != USB_INT_SUCCESS ) { return(state); } //讀取磁盤信息 Ch375WrCmdPort( CMD_RD_USB_DATA ); cnt = Ch375RdDatPort(); for(; cnt>0; cnt--) { *buff = Ch375RdDatPort(); buff++; } return( USB_INT_SUCCESS ); }

通過仿真跟蹤,無法識別的U盤設(shè)備都是在"Ch375WrCmdPort( CMD_DISK_INIT );"這條語句,返回的狀態(tài)都是錯誤狀態(tài).具體數(shù)值是0x20.

請問,為了提高識別率我的初始化工作應該怎么做?可以提供初始化流程嗎?


U盤的兼容性并不僅僅取決于芯片本身,還與程序有很大的關(guān)系。上面的初始化使用了芯片內(nèi)置U盤固件,初始化流程比較簡單,支持率也很難提升?,F(xiàn)在提供的始化流程也只有這么多。我們的子程序庫可以支持市面95%以上的U盤,建議使用我們的子程序庫操作U盤


Hi,sem,我也希望用你們的芯片用你們的程序庫,我們只能用PIC的芯片,而偏偏你們就是沒有PIC的程序庫~~~嘿嘿~~PIC也算數(shù)一數(shù)二的芯片,就是很奇怪你們?yōu)槭裁床恢С职~

現(xiàn)在也就是說想提高支持率如果不用你們的庫或者你們不支持的庫就完全沒有其他的方法了嗎?


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

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