这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 企业专区» Renesas» DIYMP3开发进程

共57条 4/6 |‹ 1 2 3 4 5 6 跳转至
高工
2012-10-06 15:13:04 打赏
31楼

歌曲列表

小说模式

播放界面

高工
2012-10-07 11:32:23 打赏
32楼
SD卡部分代码:




上面是几个最基本的SD卡函数

高工
2012-10-07 11:33:30 打赏
33楼

uint8 SDWriteSector(uint32 Addr,uint8 *pBuffer) //SD卡写扇区函数
{
uint8 pCmd[] = {0x58,0x00,0x00,0x00,0x00,0xff};
uint8 Count = 0;
uint8 Temp = 0;
uint16 i;
Addr <<= 9;
pCmd[1] = ((Addr & 0xff000000) >> 24);
pCmd[2] = ((Addr & 0x00ff0000) >> 16);
pCmd[3] = ((Addr & 0x0000ff00) >> 8);
do
{
Temp = SDWriteCommand(pCmd);
Count++;
if(Count >= DISPLAY_COUNT)
{
SDSetCS();
return 1;
}
}while(Temp != 0);
for(i = 0;i < 100;i++)
{
SpiReadByte();
}
SDClrCS();
SpiWriteByte(0xfe); //start
for(i = 0;i < 512;i++)
{
SpiWriteByte(pBuffer[i]);
}
SpiWriteByte(0xff);
SpiWriteByte(0xff); //CRC

Temp = SpiReadByte();
if((Temp & 0x1f) != 0x05)
{
SDSetCS();
return WRITE_BLOCK_ERROR;
}
while(SpiReadByte() != 0xff);
SDSetCS();
SpiReadByte();
return 0;
}


uint8 SDReadSector(uint32 Addr,uint8 *pBuffer) //SD卡读扇区函数
{
uint8 pCmd[] = {0x51,0x00,0x00,0x00,0x00,0xff};
uint8 Count = 0;
uint8 Temp = 0;
uint16 i;
Addr <<= 9;
pCmd[1] = ((Addr & 0xff000000) >> 24);
pCmd[2] = ((Addr & 0x00ff0000) >> 16);
pCmd[3] = ((Addr & 0x0000ff00) >> 8);
SDClrCS();
do
{
Temp = SDWriteCommand(pCmd);
Count++;
if(Count >= DISPLAY_COUNT)
{
SDSetCS();
return 1;
}
}while(Temp != 0);
while(SpiReadByte() != 0xfe);
for(i = 0;i < 512;i++)
{
pBuffer[i] = SpiReadByte();
}
SpiReadByte();
SpiReadByte();
SDSetCS();
SpiReadByte();
return 0;
}

有了上面的函数可以与znFAT挂接


高工
2012-10-07 11:38:22 打赏
34楼

void TFTWriteData(uint8 DH,uint8 DL)
{
TFTClrCS();
TFTSetRS();
DB_Prot_Data = DH;
TFTClrWR();
TFTSetWR();
DB_Prot_Data = DL;
TFTClrWR();
TFTSetWR();
TFTSetCS();
}

void TFTWriteCommand(uint8 DH,uint8 DL)
{
TFTClrCS();
TFTClrRS();
DB_Prot_Data = DH;
TFTClrWR();
TFTSetWR();
DB_Prot_Data = DL;
TFTClrWR();
TFTSetWR();
TFTSetCS();
}

void TFTWriteCmdData(uint8 Cmd,uint16 Dat)
{
uint8 m,n;
m = Dat >> 8;
n = Dat;
TFTWriteCommand(0x00,Cmd);
TFTWriteData(m,n);
}

void TFTWrite16bData(uint16 Dat)
{
uint8 m,n;
m = Dat >> 8;
n = Dat;
TFTWriteData(m,n);
}

void TFTInit() //////////初始化
{


TFTSetCS();
TFTClrRST();
TFTSetRST();
TFTSetTouchCS();
TFTSetTouchCLK();
TFTSetTouchDIN();
TFTSetTouchCLK();
TFTWriteCmdData(0x00e5, 0x8000);
TFTWriteCmdData(0x0000, 0x0001);
TFTWriteCmdData(0x0001, 0x0100);//输出方式控制0x00,0x100,0x400,0x500,正常显示用0x00
TFTWriteCmdData(0x0002, 0x0700);//可设置为0x400或0x700;
TFTWriteCmdData(0x0003, 0x1010);//可设置为0x1030,0x1000,0x1010,0x1020,0x1038,0x1028,0x1018,0x1008;
//还可以把最前面的1去掉,如:0x18;
//BGR = " 0 ":遵循gb顺序来写的像素数据【即去掉那个1】
//BGR = " 1 ":将RGB数据换成BGR数据再写入GRAM【即不去掉那个1】
//横向设置0x1018最好/纵向设置0x1000最好
TFTWriteCmdData(0x0004, 0x0000);//显示大小尺寸控制寄存器0x00为1倍大小,即240x320
TFTWriteCmdData(0x0008, 0x0202);//可设置为0x0202,0x00,
TFTWriteCmdData(0x0009, 0x0000);//扫描设置
TFTWriteCmdData(0x000A, 0x0000);
TFTWriteCmdData(0x000C, 0x0000);
TFTWriteCmdData(0x000D, 0x0000);
TFTWriteCmdData(0x000F, 0x0000);
//-----Power On sequence
TFTWriteCmdData(0x0010, 0x0000);
TFTWriteCmdData(0x0011, 0x0007);
TFTWriteCmdData(0x0012, 0x0000);
TFTWriteCmdData(0x0013, 0x0000);
TFTWriteCmdData(0x0010, 0x17B0);
TFTWriteCmdData(0x0011, 0x0007);
TFTWriteCmdData(0x0012, 0x013A);
TFTWriteCmdData(0x0013, 0x1A00);
TFTWriteCmdData(0x0029, 0x000c);
//-----Gamma control
TFTWriteCmdData(0x0030, 0x0000);
TFTWriteCmdData(0x0031, 0x0505);
TFTWriteCmdData(0x0032, 0x0004);
TFTWriteCmdData(0x0035, 0x0006);
TFTWriteCmdData(0x0036, 0x0707);
TFTWriteCmdData(0x0037, 0x0105);
TFTWriteCmdData(0x0038, 0x0002);
TFTWriteCmdData(0x0039, 0x0707);
TFTWriteCmdData(0x003C, 0x0704);
TFTWriteCmdData(0x003D, 0x0807);
//-----Set RAM area
TFTWriteCmdData(0x0050, 0x0000);
TFTWriteCmdData(0x0051, 0x00EF);
TFTWriteCmdData(0x0052, 0x0000);
TFTWriteCmdData(0x0053, 0x013F);
TFTWriteCmdData(0x0060, 0x2700);
TFTWriteCmdData(0x0061, 0x0001);
TFTWriteCmdData(0x006A, 0x0000);
TFTWriteCmdData(0x0021, 0x0000);
TFTWriteCmdData(0x0020, 0x0000);
//-----Partial Display Control
TFTWriteCmdData(0x0080, 0x0000);
TFTWriteCmdData(0x0081, 0x0000);
TFTWriteCmdData(0x0082, 0x0000);
TFTWriteCmdData(0x0083, 0x0000);
TFTWriteCmdData(0x0084, 0x0000);
TFTWriteCmdData(0x0085, 0x0000);
//-----Panel Contro
TFTWriteCmdData(0x0090, 0x0010);
TFTWriteCmdData(0x0092, 0x0000);
TFTWriteCmdData(0x0093, 0x0003);
TFTWriteCmdData(0x0095, 0x0110);
TFTWriteCmdData(0x0097, 0x0000);
TFTWriteCmdData(0x0098, 0x0000);
//-----Display on
TFTWriteCmdData(0x0007, 0x0173);
}


void TFTSetPos(uint16 x0,uint16 x1,uint16 y0,uint16 y1) ////////定坐标
{
TFTWriteCmdData(WINDOW_XADDR_START,x0);
TFTWriteCmdData(WINDOW_XADDR_END,x1);
TFTWriteCmdData(WINDOW_YADDR_START,y0);
TFTWriteCmdData(WINDOW_YADDR_END,y1);
TFTWriteCmdData(GRAM_XADDR,x0);
TFTWriteCmdData(GRAM_YADDR,y0);
TFTWriteCommand(0x00,0x22);//LCD_WriteCMD(GRAMWR);
}

void ClearScreen(uint16 bColor) //清屏
{
unsigned int i,j;
TFTSetPos(0,240,0,320);//320x240
for (i=0;i<320;i++)
{

for (j=0;j<240;j++)
TFTWrite16bData(bColor);

}
}

void ClearPartScreen(uint16 x1,uint16 x2,uint16 y1,uint16 y2,uint16 color)//清部分屏幕
{
unsigned int i,j;
TFTSetPos(x1,x2,y1,y2);
for (i=0;i <= (y2 - y1);i++)
{

for (j=0;j <= (x2 - x1);j++)
TFTWrite16bData(color);

}
}

void TFTDrawPicture(uint16 x0,uint16 x1,uint16 y0,uint16 y1,uint8 const *pPicture)
{
uint16 i,j;
uint8 a,b;
TFTSetPos(x0,x1,y0,y1);
for (i = y0;i <= y1;i++)
{
for (j = x0;j <= x1;j++)
{
a = *pPicture++;
b = *pPicture++;
TFTWriteData(b,a);
}
}
}
/////////////////////////////////////////////////////////////////////////////////上面是最基本的彩屏程序了,其他的就加入字库后扩展


高工
2012-10-07 11:44:55 打赏
35楼


void VS1003WriteByte(uint8 Dat)
{
uint8 i;
VS1003ClrSCLK();
for(i = 0;i < 8;i++)
{
if(Dat & 0x80)
VS1003SetMOSI();
else
VS1003ClrMOSI();
VS1003SetSCLK();
Dat <<= 1;
VS1003ClrSCLK();
}
}

uint8 VS1003ReadByte()
{
uint8 i,Temp = 0;
VS1003ClrSCLK();
for(i = 0;i < 8;i++)
{
Temp <<= 1;
VS1003SetSCLK();
if(Read_MISO)
Temp |= 0x01;
VS1003ClrSCLK();
}
return Temp;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

void VS1003WriteRegister(uint8 Addr,uint8 DBH,uint8 DBL)
{
while(!Read_DREQ);
VS1003ClrXCS();
VS1003WriteByte(VS_WRITE);
VS1003WriteByte(Addr);
VS1003WriteByte(DBH);
VS1003WriteByte(DBL);
VS1003SetXCS();
}

uint16 VS1003ReadRegister(uint8 Addr)
{
uint16 Temp = 0;
while(!Read_DREQ);
VS1003ClrXCS();
VS1003WriteByte(VS_READ);
VS1003WriteByte(Addr);
Temp = VS1003ReadByte();
Temp <<= 8;
Temp |= VS1003ReadByte();
VS1003SetXCS();
return Temp;
}
/////////////////////////////////////////////////////////////////////////////////////

void VS1003Init()
{

uint16 TestDb = 0;
uint8 TestPort = 0;
TestPort = Read_MISO;
VS1003PortInit();
TestPort = Read_MISO;
VS1003ClrXREST();
delay100us();
VS1003SetXCS();
VS1003SetXDCS();
VS1003ClrSCLK();
VS1003SetXREST();
while(!Read_DREQ);
VS1003WriteRegister(VS_MODE,0x08,0x04);
while(!Read_DREQ);
VS1003WriteRegister(VS_CLOCKF,0x98,0x00);
delay100us();

VS1003WriteRegister(VS_AUDATA,0xbb,0x81);
delay100us();
VS1003WriteRegister(VS_BASS,0x00,0x55);
delay100us();
VS1003WriteRegister(VS_VOL,31,31);
delay100us();
VS1003WriteByte(0);
VS1003WriteByte(0);
VS1003WriteByte(0);
VS1003WriteByte(0);
delay100ms();
TestDb = VS1003ReadRegister(VS_BASS);
delay100ms();
}


高工
2012-10-07 11:53:41 打赏
36楼
LZ存货不少吗,以前用其他芯片驱动过VS1003?

高工
2012-10-07 12:46:24 打赏
37楼
彩屏是以前竞赛用430单片机调试过的,SD卡和VS1003是这次用瑞萨调的!

高工
2012-10-07 14:00:40 打赏
38楼
不错,支持~

高工
2012-10-08 19:04:26 打赏
39楼
对MP3文件ID3V2分析来获取mp3文件的一些信息
每个ID3V2.3的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3文件的首部。
标签头
  在文件的首部顺序记录10个字节的ID3V2.3的头部。数据结构如下:
char Header[3]; /*必须为"ID3"否则认为标签不存在*/
  char Ver; /*版本号;ID3V2.3就记录03,ID3V2.4就记录04*/
  char Revision; /*副版本号;此版本记录为00*/
  char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/
  char Size[4]; /*标签大小,包括标签帧和扩展标签头。(不包括标签头的10个字节)*/
  1.标志字节
  标志字节一般为0,定义如下:
  abc00000
  a -- 表示是否使用不同步(一般不设置)
  b -- 表示是否有扩展头部,一般没有(至少Winamp没有记录),所以一般也不设置
  c -- 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)
  2.标签大小
  一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下
  0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
  计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如下:
  int total_size;
  total_size = Size[0]*0x200000
  +Size[1]*0x4000
  +Size[2]*0x80
  +Size[3]
标签帧
  每个标签帧都有一个10个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中得到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。
  帧头的定义如下:
char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
  char Flags[2]; /*存放标志,只定义了6位,稍后详细解说*/
  1.帧标识
  用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2=标题 表示内容为这首歌的标题,下同
  TPE1=作者
  TALB=专集
  TRCK=音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
  TYER=年代 是用ASCII码表示的数字
  TCON=类型 直接用字符串表示
  COMM=备注 格式:"eng\0备注内容",其中eng表示备注所使用的自然语言
  2.大小
  这个可没有标签头的算法那么麻烦,每个字节的8位全用,格式如下
  xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
  算法如下:
 int FSize;
  FSize = Size[0]*0x1000000
  +Size[1]*0x10000
  +Size[2]*0x100
  +Size[3];


用以上信息可以获取MP3歌曲文件的一些基本信息了!

高工
2012-10-11 21:44:06 打赏
40楼





上面是各个东西的界面

共57条 4/6 |‹ 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]