这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » 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 跳转至

回复

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