在打開(kāi)MP3文件的過(guò)程中,用串口去監(jiān)控,一開(kāi)始的時(shí)候還是能看到一些數(shù)據(jù)的,后來(lái)的數(shù)據(jù)全位0xff,
void play_mp3()
{
? ?unsigned int i=0;
? ?UINT16s,j,k;
? ?UINT32TotalCount_1=0;
? ?s=mInitCH376Host( ); ?/* 初始化CH376 */
? ?mStopIfError( s );
//while(1)
{
VS_Ram_Test();?
}
? ?
VS_Sine_Test();
if(VS_HD_Reset()==1)
{
?uart1_printf( "硬件復(fù)位\n" );
}
else
{
?uart1_printf( "硬件復(fù)位失敗\n" );
?while(1);
} ? ?
VS_Soft_Reset(); ?//軟復(fù)位VS10XX ??
set10XX(); ? ? ? ?//設(shè)置音量等信息 ??
//VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
? ?while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) /* 檢查U盤(pán)是否連接,等待U盤(pán)插入,對(duì)于SD卡,可以由單片機(jī)直接查詢SD卡座的插拔狀態(tài)引腳 */
{?
mDelaymS( 100 );
}
?mDelaymS(200); ?/* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
? ? ? for ( i = 0; i < 100; i ++ )?
{ ?
mDelaymS( 50 );
? ? ? ? ? ? s = CH376DiskMount( ); ?/* 初始化磁盤(pán)并測(cè)試磁盤(pán)是否就緒 */
if ( s == USB_INT_SUCCESS ) break; ?/* 準(zhǔn)備好 */
else if ( s == ERR_DISK_DISCON ) break; ?/* 檢測(cè)到斷開(kāi),重新檢測(cè)并計(jì)時(shí) */
if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; ?/* 有的U盤(pán)總是返回未準(zhǔn)備好,不過(guò)可以忽略,只要其建立連接MOUNTED且嘗試 */
}
?if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED )?
{ ?/* 未知USB設(shè)備,例如USB鍵盤(pán)、打印機(jī)等 */
uart1_printf( "Unknown device\n" );
? ?while ( CH376DiskConnect( ) == USB_INT_SUCCESS )?
{ ?/* 檢查U盤(pán)是否連接,等待U盤(pán)拔出 */
? ?mDelaymS( 100 );
uart1_printf( "Please take out\n" );
? ?}
}
? ? ? ? n=rand()%100;
n=1;
//uart1_printf( "n= %d\n" );
? ? ?// ? change(n, a1);
? ? ? ? sprintf(a3, "%s%s", a1, a2);
? ? ? ? s = CH376FileOpen("/A.MP3"); ?// 打開(kāi)文件,只能是根目錄
if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE ) /* 沒(méi)有找到目錄或者沒(méi)有找到文件 */
?{ ?
uart1_printf("沒(méi)有找到目錄或者沒(méi)有找到文件...\n"); //10.22日注釋掉的打印語(yǔ)句
?}
else ?//打開(kāi)成功
?{
? ? ? ? ? ? mStopIfError( s );
TotalCount_1=CH376GetFileSize(); ?/* 準(zhǔn)備讀取總長(zhǎng)度 */
//uart1_printf("TotalCount= %d\n",(UINT16)TotalCount);
? ?while ( TotalCount_1 ) /* 如果文件比較大,一次讀不完,可以再調(diào)用CH376ByteRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) */ ?
{
?if ( TotalCount_1 > sizeof(music_buf) )?
{
i = sizeof(music_buf); ?/* 剩余數(shù)據(jù)較多,限制單次讀寫(xiě)的長(zhǎng)度不能超過(guò)緩沖區(qū)大小 */
}
?else i = TotalCount_1; ?/* 最后剩余的字節(jié)數(shù) */
?s = CH376ByteRead( music_buf, i, &RealCount ); ?/* 以字節(jié)為單位讀取數(shù)據(jù)塊,單次讀寫(xiě)的長(zhǎng)度不能超過(guò)緩沖區(qū)大小,第二次調(diào)用時(shí)接著剛才的向后讀 */
?mStopIfError( s );
?TotalCount -= (UINT8)RealCount; ?/* 計(jì)數(shù),減去當(dāng)前實(shí)際已經(jīng)讀出的字符數(shù) */
// for ( s=0; s!=RealCount; s++ ) uart1_printf( "%02x", buf[s] ); ?/* 顯示讀出的字符 */
// ?uart1_printf("i=%d\n",i);
// ?uart1_printf("RealCount=%d\n",RealCount);
k=0; ? ?
? ?VS_XDCS=0; ? ?
? ? ? ? ? while(k<512)
{//uart1_printf("TotalCount\n");?
while(VS_DQ!=0)//等待DREQ為高
{
for(j=0;j<32;j++)
{
?SPIx_ReadWriteByte(buf[j]);
// uart1_printf("發(fā)送音頻文件中 \n");
// ?uart1_printf( "%02 x", ( int)music_buf[s] ); ?/* 顯示錯(cuò)誤 */
}
//uart1_printf( "32字節(jié)完畢\n"); ?/* 顯示錯(cuò)誤 */
k += 32;
}
VS_XDCS=1; ? ?
}
?if ( RealCount < i ) /* 實(shí)際讀出的字符數(shù)少于要求讀出的字符數(shù),說(shuō)明已經(jīng)到文件的結(jié)尾 */
{ ?
uart1_printf( "\n" );
? ? ? ? ? ? ? ? ? ? break;
}
? ? ? ? ? ? }
uart1_printf( "\n" );
uart1_printf( "\n" );
uart1_printf( "\n" );
? ? ? ? ? ? uart1_printf(0x0A);
s = CH376FileClose( FALSE ); ?/* 關(guān)閉文件 */
mStopIfError( s );
? ? ? ? ?}
}
讀出來(lái)的數(shù)據(jù)用串口顯示出來(lái)了,這些數(shù)據(jù)不正確,在MP3那邊聽(tīng)到刺刺的聲音,有沒(méi)有人遇到過(guò)類似的情況啊,我是用51單片機(jī)做的,VS1053采用的是IO口模擬的SPI協(xié)議
void VS_spi_write(unsigned char x)
{
?dat=x; ?//將x賦值給可位尋址的變量dat
?VS_SI=dat7; //從高位開(kāi)始輸出,從dat7一直到dat0
?VS_SCK=0; ? //時(shí)鐘的上升沿,位被寫(xiě)出
?VS_SCK=1;
?VS_SI=dat6;
?VS_SCK=0; ?
?VS_SCK=1;
?VS_SI=dat5;
?VS_SCK=0;?
?VS_SCK=1;
?VS_SI=dat4;
?VS_SCK=0; ?
?VS_SCK=1;
?VS_SI=dat3;
?VS_SCK=0; ?
?VS_SCK=1;
?VS_SI=dat2;
?VS_SCK=0; ?
?VS_SCK=1;
?VS_SI=dat1;
?VS_SCK=0; ?
?VS_SCK=1;
?VS_SI=dat0;
?VS_SCK=0; ?
?VS_SCK=1;
}
unsigned char VS_spi_read()
{
?VS_SO=1; ?//51單片機(jī)IO作輸入時(shí),先置為1
?VS_SCK=1; //時(shí)鐘下降沿,從設(shè)備輸出數(shù)據(jù)
?VS_SCK=0;
?dat7=VS_SO; //讀取從設(shè)備數(shù)據(jù)輸出上的值,放到dat7上,8次后可讀到一個(gè)字節(jié)
?//uart1_printf( "dat7: %02X\n", (unsigned int)dat7 ); ?/* 顯示錯(cuò)誤 */
?VS_SCK=1;?
?VS_SCK=0;
?dat6=VS_SO;
// uart1_printf( "dat6: %02X\n", (unsigned int)dat6 ); ?/* 顯示錯(cuò)誤 */
?VS_SCK=1;?
?VS_SCK=0;
?dat5=VS_SO;
// ?uart1_printf( "dat5: %02X\n", (unsigned int)dat5 ); ?/* 顯示錯(cuò)誤 */
?VS_SCK=1;
?VS_SCK=0;
?dat4=VS_SO;?
// uart1_printf( "dat4: %02X\n", (unsigned int)dat4 ); ?/* 顯示錯(cuò)誤 */
?VS_SCK=1;?
?VS_SCK=0;
?dat3=VS_SO;
// ?uart1_printf( "dat3: %02X\n", (unsigned int)dat3 ); ?/* 顯示錯(cuò)誤 */
?VS_SCK=1;?
?VS_SCK=0;
?dat2=VS_SO;
?// uart1_printf( "dat2: %02X\n", (unsigned int)dat2 ); ?/* 顯示錯(cuò)誤 */
?VS_SO=1;
?VS_SCK=1;?
?VS_SCK=0;
?dat1=VS_SO;
// uart1_printf( "dat1: %02X\n", (unsigned int)dat1 ); ?/* 顯示錯(cuò)誤 */
?VS_SCK=1;?
?VS_SCK=0;
?dat0=VS_SO;
?// uart1_printf( "dat0: %02X\n", (unsigned int)dat0 ); ?/* 顯示錯(cuò)誤 */
?return (dat); //將讀到的字節(jié)返回
}
u8 SPIx_ReadWriteByte(u8 da)
{
? ?VS_spi_write(da);
? ?return(VS_spi_read());
}