CH376读取MP3文件读出来的数据不正确不能播放,求大神指点

在打开MP3文件的过程中,用串口去监控,一开始的时候还是能看到一些数据的,后来的数据全位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( "硬件复位\n" );

}

else

{

 uart1_printf( "硬件复位失败\n" );

 while(1);

}    

VS_Soft_Reset();  //软复位VS10XX   

set10XX();        //设置音量等信息   

//VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);

   while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */

mDelaymS( 100 );

}

 mDelaymS(200);  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */

      for ( i = 0; i < 100; i ++ ) 

{  

mDelaymS( 50 );

            s = CH376DiskMount( );  /* 初始化磁盘并测试磁盘是否就绪 */

if ( s == USB_INT_SUCCESS ) break;  /* 准备好 */

else if ( s == ERR_DISK_DISCON ) break;  /* 检测到断开,重新检测并计时 */

if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break;  /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试 */

}

 if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) 

{  /* 未知USB设备,例如USB键盘、打印机等 */

uart1_printf( "Unknown device\n" );

   while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) 

{  /* 检查U盘是否连接,等待U盘拔出 */

   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");  // 打开文件,只能是根目录

if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE ) /* 没有找到目录或者没有找到文件 */

 {  

uart1_printf("没有找到目录或者没有找到文件...\n"); //10.22日注释掉的打印语句

 }

else  //打开成功

 {

            mStopIfError( s );

TotalCount_1=CH376GetFileSize();  /* 准备读取总长度 */

//uart1_printf("TotalCount= %d\n",(UINT16)TotalCount);

   while ( TotalCount_1 ) /* 如果文件比较大,一次读不完,可以再调用CH376ByteRead继续读取,文件指针自动向后移动 */  

{

 if ( TotalCount_1 > sizeof(music_buf) ) 

{

i = sizeof(music_buf);  /* 剩余数据较多,限制单次读写的长度不能超过缓冲区大小 */

}

 else i = TotalCount_1;  /* 最后剩余的字节数 */

 s = CH376ByteRead( music_buf, i, &RealCount );  /* 以字节为单位读取数据块,单次读写的长度不能超过缓冲区大小,第二次调用时接着刚才的向后读 */

 mStopIfError( s );

 TotalCount -= (UINT8)RealCount;  /* 计数,减去当前实际已经读出的字符数 */

// 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("发送音频文件中 \n");

//  uart1_printf( "%02 x", ( int)music_buf[s] );  /* 显示错误 */

}

//uart1_printf( "32字节完毕\n");  /* 显示错误 */

k += 32;

}

VS_XDCS=1;    

}

 if ( RealCount < i ) /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */

{  

uart1_printf( "\n" );

                    break;

}

            }

uart1_printf( "\n" );

uart1_printf( "\n" );

uart1_printf( "\n" );

            uart1_printf(0x0A);

s = CH376FileClose( FALSE );  /* 关闭文件 */

mStopIfError( s );

         }

}

blob.png

读出来的数据用串口显示出来了,这些数据不正确,在MP3那边听到刺刺的声音,有没有人遇到过类似的情况啊,我是用51单片机做的,VS1053采用的是IO口模拟的SPI协议


void VS_spi_write(unsigned char x)

{

 dat=x;  //将x赋值给可位寻址的变量dat


 VS_SI=dat7; //从高位开始输出,从dat7一直到dat0

 VS_SCK=0;   //时钟的上升沿,位被写出

 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单片机IO作输入时,先置为1


 VS_SCK=1; //时钟下降沿,从设备输出数据

 VS_SCK=0;

 dat7=VS_SO; //读取从设备数据输出上的值,放到dat7上,8次后可读到一个字节

 //uart1_printf( "dat7: %02X\n", (unsigned int)dat7 );  /* 显示错误 */

 VS_SCK=1; 

 VS_SCK=0;

 dat6=VS_SO;

// uart1_printf( "dat6: %02X\n", (unsigned int)dat6 );  /* 显示错误 */

 VS_SCK=1; 

 VS_SCK=0;

 dat5=VS_SO;

//  uart1_printf( "dat5: %02X\n", (unsigned int)dat5 );  /* 显示错误 */

 VS_SCK=1;

 VS_SCK=0;

 dat4=VS_SO; 

// uart1_printf( "dat4: %02X\n", (unsigned int)dat4 );  /* 显示错误 */

 VS_SCK=1; 

 VS_SCK=0;

 dat3=VS_SO;

//  uart1_printf( "dat3: %02X\n", (unsigned int)dat3 );  /* 显示错误 */

 VS_SCK=1; 

 VS_SCK=0;

 dat2=VS_SO;

 // uart1_printf( "dat2: %02X\n", (unsigned int)dat2 );  /* 显示错误 */

 VS_SO=1;

 VS_SCK=1; 

 VS_SCK=0;

 dat1=VS_SO;

// uart1_printf( "dat1: %02X\n", (unsigned int)dat1 );  /* 显示错误 */

 VS_SCK=1; 

 VS_SCK=0;

 dat0=VS_SO;

 // uart1_printf( "dat0: %02X\n", (unsigned int)dat0 );  /* 显示错误 */

 return (dat); //将读到的字节返回

}

u8 SPIx_ReadWriteByte(u8 da)

{

   VS_spi_write(da);

   return(VS_spi_read());

}


不对,我后来把读数据打方式改成扇区读取了,读MP3的部分应该是这样的

unsigned char   xdatamusic_buf[512];

void paly()

{

unsigned int a=0;

UINT16i=0, s,j,k;

UINT32TotalCount_1;

//UINT32RealCount;

UINT32  u32DataCnt = 0;

char a7[8]={"A.MP3"};

//P_FAT_DIR_INFOpDir;

u8 *pu8Temp;

//u8 u8Result;



s = mInitCH376Host();  /* 初始化CH376 */

   mStopIfError( s );

WaitDiskIn();//等待磁盘初始化


//while(1)

{

VS_Ram_Test(); 

}

   

VS_Sine_Test();


if(VS_HD_Reset()==1)

{

 uart1_printf( "硬件复位\n" );

}

else

{

 uart1_printf( "硬件复位失败\n" );

 while(1);

}    

//VS_Soft_Reset();  //软复位VS10XX   

//set10XX();        //设置音量等信息   

//VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);

/* 其它电路初始化 */


//u8Length = CH376ReadBlock(pu8Temp);/*从当前主机端点的接收缓冲区读取数据块,返回长度*/

//uart1_printf("u8Length= %d\n",(UINT16)u8Length);

//strcpy((char*)pu8Temp, a7[]); 


s = CH376FileOpen("/A.MP3");  // 打开文件,只能是根目录

mStopIfError( s );

if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE ) /* 没有找到目录或者没有找到文件 */

   {  

uart1_printf("没有找到目录或者没有找到文件...\n"); //10.22日注释掉的打印语句

   }

else if ( s == USB_INT_SUCCESS )  //打开成功

  {

  uart1_printf("打开文件成功\n");

  TotalCount_1=CH376GetFileSize();

while (TotalCount_1>512)

   {  /* 如果文件比较大,一次读不完,可以再调用CH376ByteRead继续读取,文件指针自动向后移动 */

uart1_printf("进入读取\n");

s=CH376SecRead( music_buf, 1, 0 );  // 以字节为单位读取数据块,单次读写的长度不能超过缓冲区大小,第二次调用时接着刚才的向后读 

pu8Temp= music_buf;

//   uart1_printf( "RealCount:%d\n", (unsigned int)RealCount );

  

   mStopIfError( s );

//TotalCount -= 512;  /* 计数,减去当前实际已经读出的字符数 */

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(*pu8Temp++);

// uart1_printf("发送音频文件中 \n");

 uart1_printf( "%02x", (unsigned int)*pu8Temp++ );  /* 显示错误 */

}

uart1_printf( "32字节完毕\n");  /* 显示错误 */

k += 32;

}

VS_XDCS=1; 

TotalCount_1-=512;   

}

}


}//


blob.png


CH376SecRead( music_buf, 1, 0 );改成CH376SecRead( music_buf, 1, NULL);

其实我觉着,要不这是你打印的问题,要么文件可能就是这样的,你这样试下,自己建一个MP3的文件,然后写512或者更多字节的数据,然后用CH376读出来看看,数据是否是对的。



                           

CH376SecRead( music_buf, 1, 0 );改成CH376SecRead( music_buf, 1, NULL);

其实我觉着,要不这是你打印的问题,要么文件可能就是这样的,你这样试下,自己建一个MP3的文件,然后写512或者更多字节的数据,然后用CH376读出来看看,数据是否是对的。

                       


楼主解决了吗?我也是按扇区读取文件,每个扇区不是读取512个字节的数据吗,我每次都只能读取到448个字节的数据,会丢失64个字节不知道怎么回事?


 for(jj=0;jj<30;jj++){

STATE = CH376SecLocate( jj );

printf( "指针moveto%d\n",jj );

mStopIfError(STATE );

STATE= CH376SecRead( Databuf, 1, NULL );

printf( "指针thisLen=%d\n",thisLen );

for(i=0;i<511;i++){

  printf( "%c",Databuf[i] );

}

mStopIfError( STATE );

 

   }

就是这段代码,我是循环读取30个扇区,每个扇区都会丢失64个字节,到底为什么呢?


试下调用CH376DiskReadSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ),读一个扇区,进入函数内部,USB_INT_DISK_READ中断执行几次?(仅对U盘)

查看一下芯片版本,以及DEF_IC_V43_U是否定义?


只有登录才能回复,可以选择微信账号登录