#include \"config.h\"
mian.c xdata FILE TmpFile
void main() { UINT32 lba = 0;
UINT16 i;
UartInit(); //初始化串口
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"*********51MP3播放器演示程序**********\\r\\n\");
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"**************************************\\r\\n\");
UartSendStr(\"初始化SPI接口\\r\\n\");
InitSPI(); //初始化SPI接口
UartSendStr(\"初始化VS1003\\r\\n\");
RstVs1003();
UartSendStr(\"正弦测试\\r\\n\");
//Sintest(); DelayMs(300);
UartSendStr(\"退出正弦测试\\r\\n\");
SoftRstVs1003();
UartSendStr(\"初始化CH375\\r\\n\");
InitCH375();
//初始化液晶
LCD_Init();
//显示logo
LCD_SET_CURSOR(1,1);
Print(\" mp3 player \
LCD_SET_CURSOR(2,1);
Print(\" stuelab \
SPI_HIGH_SPEED(); //高速SPI接口
UartSendStr(\"初始化文件系统\\r\\n\");
InitFat (SectorBuf);
UartSendStr(\"统计文件信息\\r\\n\");
i = StatFileNum(2, \"MP3\
sprintf(SectorBuf,\"根目录下MP3文件个数为%d .\\r\\n\
UartSendStr(SectorBuf);
i = StatFileNum(2, \"WMA\
sprintf(SectorBuf,\"根目录下WMA文件个数为%d .\\r\\n\
UartSendStr(SectorBuf);
i = StatFileNum(2, \" \
sprintf(SectorBuf,\"根目录下文件夹个数为%d .\\r\\n\
UartSendStr(SectorBuf);
UartSendStr(\"查找根目录下第一个MP3文件\\r\\n\");
SearchFile(2, 1, \"MP3\
UartSendStr(\"\\r\\n开始播放\\r\\n\");
//UartSendStr(TmpFile.short_name);
lba = ClusToLba(TmpFile.start_clus);
while (1)
{
RdSDblock(lba++,SectorBuf);
PlaySector();
}
}
#include \"config.h\" spi.c
sbit SCK = P1^7;
sbit SO = P1^5;
sbit SI = P1^6;
void InitSPI (void)
{
SCK = 1;
SO = 1;
SI = 1;
SPCR = 0xdc+3; //主机模式,允许中断,时钟常高,4分频
ES = 0; //串口中断允许。SPI和UART共用同一个中断。
EA = 0; //中断总控位
}
void SPIsendByte (unsigned char dat)
{ SDAT = dat;
while (!(SPSR & 0x80)); //等待发送完毕
SPSR = 0; //清除中断标志
}
unsigned char SPIrecvByte (void)
{ unsigned char dat
SDAT = 0XFF;
while (!(SPSR & 0x80)); //等待发送完毕
SPSR = 0; //清除中断标志
dat = SDAT; //发送的过程中同时完成接收
return dat //return SDAT;
}
void SPIsendByte2(unsigned char temp) //软件模拟SPI发送接口
{ char i;
for (i = 0; i < 8; i++)
{ SCK = 0
SO = (bit)(temp&0x80)
SCK = 1 temp <<= 1; } } /*
unsigned SPIrecvByte2(void) { char i
unsigned char temp;
for(i = 0; i < 8; i++)
SO = 1
//软件模拟SPI接收接口
{ temp <<= 1; SCK = 0
temp = ((char)SI) | temp SCK = 1
} return(temp);
} */
#include \"config.h\" void DelayMs(UINT16 ticks)
{ UINT16 tmp;
while (ticks--){ for (tmp=1000; tmp>0; tmp--); }
void DelayUs(UINT16 ticks)
{
while (ticks--);
}
} delay.c
#include \"config.h\" vs1003.c
char tmp;
void SoftWrVs1003Cmd(unsigned char addr,unsigned int cmd)
{
SPCR = 0;//关闭SPI
//SCK = 1;
//SO = 1;
//SI = 1;
WaitVs1003();
SelectCmdVs1003(); DelayUs(5);
SPIsendByte2(0x02);
SPIsendByte2(addr);
//片选
SPIsendByte2((unsigned char)(cmd>>8));
SPIsendByte2((unsigned char)cmd);
DelayUs(5);
ReleaseCmdVs1003(); //释放
SPCR = 0xdf; //打开SPI
}
void WrVs1003Cmd (unsigned char addr,unsigned int cmd)
{ WaitVs1003();
SelectCmdVs1003(); //片选
DelayUs(5);
SPIsendByte(0x02);
SPIsendByte(addr);
SPIsendByte((unsigned char)(cmd>>8));
SPIsendByte((unsigned char)cmd);
DelayUs(5);
ReleaseCmdVs1003(); //释放
}
void SoftRstVs1003(void)
{
//WrVs1003Cmd(0,0x0804); SoftWrVs1003Cmd(0,0x0804);
DelayMs(10);
SoftWrVs1003Cmd(2,0x00f6); DelayMs(1);
SoftWrVs1003Cmd(3,0x9800); DelayMs(10);
//具体功能见官方数据手册第28页(软件复位
//低音
//倍频
SoftWrVs1003Cmd(5,0xbb81); //采样率和通道数
DelayMs(1);
SoftWrVs1003Cmd(0x0b,0x2020); //音量
DelayMs(1);
}
void RstVs1003(void)
{ SelectRstVs1003(); DelayMs(10);
SPIsendByte(0xff);
ReleaseRstVs1003();
DelayMs(10);
WrVs1003Cmd(0x0b,0xffff); DelayMs(1);
//硬件复位
//音量
SoftRstVs1003();
}
void Sintest(void)
{
WrVs1003Cmd(0,0x0820); WaitVs1003();
SelectDatVs1003();
DelayUs(5);
SPIsendByte(0x53);
SPIsendByte(0xef);
SPIsendByte(0x6e);
SPIsendByte(0x30);
SPIsendByte(0);
//进入正弦测试
SPIsendByte(0);
SPIsendByte(0);
SPIsendByte(0);
DelayUs(5);
ReleaseDatVs1003();
}
void PlaySector(void)
{
UINT16 i
SelectDatVs1003();
for (i=0; i<512;) {//连续发32个字节(VS1003有32字节的缓冲区)
WaitVs1003(); // 查忙
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
SPIsendByte(SectorBuf[i++]);
}
ReleaseDatVs1003();
}
#include \"config.h\" #include //#include #include \"CH375INC.H\" /* CH375特性 */ 定义CH375.c #define CH375_BLOCK_SIZE 64 /* CH375 maximum data block size */ #define CH375_BLK_PER_SEC 8 /* CH375 block per sector, SECTOR_SIZE/CH375_BLOCK_SIZE */ /* 以下定义适用于MCS-51单片机,其它单片机参照修改,为了提供C语言的速度需要对本程序进行优化 */ #include /* CH375 命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xfe04; /* CH375数据端口的I/O地址 */ unsigned char xdata DATA_BUFFER[512] _at_ 0x0000; /* 外部RAM数据缓冲区的起始地址,长度不少于一次读写的数据长度 */ sbit CH375_INT_WIRE = 0xA0^5; /* P3.2, INT0, 连接CH375的INT#引脚,用于查询中断状态 */ /* 在P1.4连接一个LED用于监控演示程序的进度,低电平LED亮,当U盘插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低电平驱动LED显示 #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低电平驱动LED显示/* 延时2微秒,不精确 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); } /* 延时1微秒,不精确 */ void delay1us( ) */ { unsigned char i; for ( i = 1; i != 0; i -- ); } /* 延时100毫秒,不精确 */ void mDelay100mS( ) { unsigned char i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; } /* 基本操作 */ void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ delay2us(); CH375_CMD_PORT=cmd; delay2us(); } void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口 写入数据,周期不小于1.5uS,如果单片机较快则延时 */ CH375_DAT_PORT=dat; delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ } unsigned char CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ return( CH375_DAT_PORT ); } /* 等待CH375中断并获取状态 */ unsigned char mWaitInterrupt() { /* 主机端等待操作完成, 返回操作状态 */ while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ return( CH375_RD_DAT_PORT( ) ); /* c = CH375_RD_DAT_PORT( ); 返回中断状态 */ /* if ( c == USB_INT_DISCONNECT ) ?; 检测到USB设备断开事件 */ /* else if ( c == USB_INT_CONNECT ) ?; 检测到USB设备连接事件 */ } /* 设置CH375为USB主机方式 */ unsigned char mCH375Init( ) { unsigned char i; #ifdef TEST_CH375_PORT unsigned char c; CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试工作状态 */ CH375_WR_DAT_PORT( 0x55 ); /* 测试数据 */ c = CH375_RD_DAT_PORT( ); /* 返回数据应该是测试数据取反 */ if ( c != 0xaa ) { /* CH375出错 */ for ( i = 100; i != 0; i -- ) { /* 强制数据同步 */ CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* CH375执行 硬件复位 */ c = CH375_RD_DAT_PORT( ); /* 延时 */ } mDelay100mS( ); /* 延时至少30mS */ } #end if CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 设置USB工作 模式 */ CH375_WR_DAT_PORT( 6 ); /* 模式代码,自动检测USB设接 */ for ( i = 0xff; i != 0; i -- ) /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; /* 操作成功 */ if ( i != 0 ) return( 0 ); /* 操作成功 */ else return( 0xff ); /* CH375出错,例如芯片型号错或者处于串口方式或者 不支持 */ } /* 初始化磁盘 */ unsigned char mInitDisk( ) { unsigned char mIntStatus; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ mIntStatus = CH375_RD_DAT_PORT( ); if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB 设备断开 */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */ 因篇幅问题不能全部显示,请点此查看更多更全内容