在打开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 );
}
}
读出来的数据用串口显示出来了,这些数据不正确,在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());
}