搜索
bottom↓
回复: 67

MEGA16+STA013+SD Card+PCM1770+NOKIA3310的MP3解决方案完美结束!

[复制链接]

出0入0汤圆

发表于 2006-7-13 10:28:05 | 显示全部楼层 |阅读模式
先看看图片吧:





阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2006-7-13 10:41:32 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2006-7-13 10:52:35 | 显示全部楼层
现在支持中文(3700的简体)英文最多20个字的歌曲名显示(超过5个字的采用滚动显示);

STA013解决爆音问题;

DAC+攻放采用PCM1770,效果良好,只听声音不看硬件听不出来是自己DIY的;

GB-UNICODE-汉字字库问题完美解决,没有外加FLASH;

电池用手机电池;

支持32~320KBPS速率的MP3歌曲;



QQ:379225305 有兴趣和疑难的朋友来讨论哈!

出0入0汤圆

发表于 2006-7-13 11:12:54 | 显示全部楼层
漂亮!!!!

出0入0汤圆

发表于 2006-7-13 11:27:41 | 显示全部楼层
请问这个东东用1117降压的实际效果怎么样呢?

1117有1.1V~.1.2V左右的压降,这样的话3.3+1.1=4.4了

而手机电池充满也就4.3v左右

出0入0汤圆

 楼主| 发表于 2006-7-13 12:01:08 | 显示全部楼层
用1117并不好,只有在很满电的时候才可以播放,并且要加220UF的滤波电容

我现在换成了XC6204,有使能。高于3.3就可以降到3.3。

出0入0汤圆

发表于 2006-7-13 12:44:40 | 显示全部楼层
请问这个片子好卖吗?

多少钱?

出0入0汤圆

 楼主| 发表于 2006-7-13 12:53:11 | 显示全部楼层
不太清楚,也就几块钱。我的是在以前的公司拿的,现在离开了。

出0入0汤圆

 楼主| 发表于 2006-7-13 13:04:55 | 显示全部楼层




PROTEL 3D画面

出0入0汤圆

发表于 2006-7-13 16:53:32 | 显示全部楼层
屏幕能做成OLED的就不错!

出0入0汤圆

发表于 2006-7-13 17:09:10 | 显示全部楼层
漂亮,又是个N人!

出0入0汤圆

发表于 2006-7-13 18:46:10 | 显示全部楼层
能公布资料吗?偶也想做一个,谢谢了 

出0入0汤圆

发表于 2006-7-13 19:16:12 | 显示全部楼层
请问楼主的3310是怎么固定的?

出0入0汤圆

发表于 2006-7-13 19:40:24 | 显示全部楼层
字庫是不是安在sd card 中??

出0入0汤圆

 楼主| 发表于 2006-7-14 09:03:58 | 显示全部楼层
3310的上头有一对小细片,用于上头的固定。下边有一队导孔,虽然有胶,用排针插上面焊上固定下头;

字库放SD卡中

出0入0汤圆

 楼主| 发表于 2006-7-14 09:07:44 | 显示全部楼层
原理图就在上面!1770的电路我琢磨了很久的,希望给大家有用!

出0入0汤圆

发表于 2006-7-14 09:49:19 | 显示全部楼层
不错,羡慕中。。。。。

出0入0汤圆

发表于 2006-7-14 10:52:31 | 显示全部楼层
LZ发个原理图吧,最好是DXP2004格式的,不方便的话PDF的也行呀,上边那个看不太清楚呀。PCB文件就不想了,LZ一定不给的。。。



3310的安装能做个图解吗?想研究一下。

出0入0汤圆

发表于 2006-7-14 11:12:27 | 显示全部楼层
这个sta013,实在让人失望,有太多的mp3不能播放

出0入0汤圆

 楼主| 发表于 2006-7-14 11:24:44 | 显示全部楼层
18楼的兄弟:只要是标准的MP3,STA013绝对支持。

17楼的兄弟:原理图给大家分享。3310的图解有时间在做!

点击此处下载armok01123219.rar

出0入0汤圆

发表于 2006-7-14 11:32:31 | 显示全部楼层
LZ是好人啊~

MP3真是漂亮

出0入0汤圆

发表于 2006-7-14 12:38:42 | 显示全部楼层
好呀,等您的图解。



谢谢楼主了。

出0入0汤圆

发表于 2006-7-14 13:00:15 | 显示全部楼层
可问题在于,有多少MP3文件是标准的呢?估计很多网上下载的MP3都是不能播放的。这个可以搜索本论坛以前关于STA013的帖子看一下。



对于UNICODE显示的问题,解决起来也是很简单的,无非就是在SD卡的根目录放几个字库文件而已。都是成熟的不能成熟的技术了,没有必要搞得这么神秘兮兮。

出0入0汤圆

 楼主| 发表于 2006-7-14 13:00:37 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2006-7-14 13:03:02 | 显示全部楼层
请观察上面红色勾画过的地方,那就是固定的地方。拿着3310对照自然知道怎么固定的了。

出0入0汤圆

 楼主| 发表于 2006-7-14 13:10:39 | 显示全部楼层
TO 22楼:

MP3是成熟得不能在成熟的东西,干吗还讨论它!

还有就是如果STA013不能播放大部分网上下的MP3的话,问题在于速率没有达到要求(网上下的有很多都是是280KBPS和320KBPS的),是程序问题。不应该归结于硬件,我在网上下的大楷只有5%才不能播放,因为它不是真正的MP3,看看目录后缀名就知道了。

出0入0汤圆

发表于 2006-7-14 17:03:53 | 显示全部楼层
来个特写吧,看不清呀,不过已经差不多知道怎么固定了,觉得像是捆绑式固定,对吗?我开始以为只是把3310中间的那个定位孔穿过PCB用烙铁烫平就行了,这样的话觉得不可靠。



TO nipponhu:



看样子你好像也做过呀,发上来看看呀!

出0入0汤圆

发表于 2006-7-16 10:57:43 | 显示全部楼层
掉了,顶一下。



明天固定方法了,不错占用地方很少。

出0入0汤圆

 楼主| 发表于 2006-7-17 17:55:02 | 显示全部楼层
有可能的话换成OLED就爽了哈

出0入0汤圆

发表于 2006-7-17 18:41:59 | 显示全部楼层
不错.要是有时间我也做一个.

出0入0汤圆

 楼主| 发表于 2006-7-18 10:45:30 | 显示全部楼层
FAT16文件系统初始化代码公布!对你有帮助就顶一下。



//=======================================================================

void FATinit(void)

{/*SD卡的变量*/



uint16 BPB_BytePerSec;          //每扇区的字节数     512



uint8  BPB_NumFATs;             //此卷中FAT表的份数;

uint16 BPB_RootEntCnt;          //fat12/16根目录的目录项数;

uint16 BPB_FATsz16;             //FAT12/FAT16一个FAT表占的扇区数(FAT32此项必须为0);



uint16 RootDirSectors;          //根目录所占的扇区数



/*变量取值*/



SD_set_length(1);

SD_read_sector2(0,&fat_info.Relative,1);  



if(fat_info.Relative==0xEB)                       //判断有没有Relative Sectors

    fat_info.Relative=0;

else

    SD_read_sector2(454,&fat_info.Relative,1);        //取Relative Sectors



SD_set_length(13);

SD_read_sector2(((long)fat_info.Relative<<9)+11,buffer,13);   //取值

SD_set_length(512);

BPB_BytePerSec=buffer[0]+((int)buffer[1]<<8);

fat_info.BPB_SecPerClus=buffer[2];

fat_info.BPB_RsvdSecCnt=buffer[3];

BPB_NumFATs=buffer[5];

BPB_RootEntCnt=buffer[6]+((int)buffer[7]<<8);

BPB_FATsz16=buffer[11]+((int)buffer[12]<<8);



/*计算根目录的首扇区号*/

fat_info.Firstgengmulu=fat_info.Relative+fat_info.BPB_RsvdSecCnt+BPB_FATsz16*BPB_NumFATs;



/*计算FAT16根目录所占的扇区数*/

RootDirSectors=(((long)BPB_RootEntCnt<<5)+(BPB_BytePerSec-1) )/BPB_BytePerSec;

/*计算簇2的首扇区*/

fat_info.FirstDateSecter=fat_info.Relative+fat_info.BPB_RsvdSecCnt+((long)BPB_FATsz16*BPB_NumFATs)+RootDirSectors;



}


-----此内容被endylu1983于2006-07-18,10:50:28编辑过

出0入0汤圆

发表于 2006-7-19 15:51:34 | 显示全部楼层
LZ把SD卡操作代码贴一下吧,我目前想向sd卡里面存东西,也不用文件系统,借鉴一下读写代码。

出0入0汤圆

 楼主| 发表于 2006-7-20 09:59:29 | 显示全部楼层
好东西就要给大家分享!



//ICC-AVR application builder : 2005-11-12 17:11:59

// Target : M16

// Crystal: 8.0000Mhz

// copyright:endylu

#include <iom16v.h>

#include <macros.h>

#include "main.h"



//=======================================================================

uint8 Read_Byte_SD(void)

{

//char Byte;

SPDR=0xff;

while(!(SPSR&(1<<SPIF)));



//Byte=SPDR;

return(SPDR);

}



//=======================================================================

void Write_Byte_SD(uint8 Byte)

{

SPDR=Byte;

while(!(SPSR&(1<<SPIF)));

  

}



//=======================================================================

uint8 Write_Command_SD1(uint8*CMD)

{

uint8 a;

uint8 tmp=0xff;

uint8 Timeout=0;



// Raise chip select

SD_Disable();



// Send an 8 bit pulse

Write_Byte_SD(0xFF);



// Lower chip select

SD_Enable();



//Send the 6 byte command

for(a=0;a<0x06;a++)

    {

     Write_Byte_SD(*CMD++);

    }



//Wait for the response

while(tmp==0xff)

      {

       tmp=Read_Byte_SD();

       if(Timeout++>100)

         {

          break;

         }

      }

//for some reason we need to delay  10here

return(tmp);

}



//=======================================================================

uint8 Write_Command_SD(uint8 CMD,uint32 address)

{



uint8 tmp;

uint8 Timeout=0;



// Lower chip select

SD_Enable();

//Send the 6 byte command  

  Write_Byte_SD(CMD);

  Write_Byte_SD(address>>24);

  Write_Byte_SD(address>>16);

  Write_Byte_SD(address>>8);

  Write_Byte_SD(address);

  Write_Byte_SD(0xff);

  



//Wait for the response

tmp=Read_Byte_SD();

while((tmp==0xff)&(Timeout++<8))

      {

       tmp=Read_Byte_SD();  

      }

return(tmp);

}



//=======================================================================

uint8 SDInit(void)

{

uint8 a,b,retry;

uint8 CMD[]={0x40,0x00,0x00,0x00,0x00,0x95};



asm("cli"); //clear all interrupt.

// Set certain pins to inputs and others to outputs

// Only SPI_DI (data in) is an input

SD_Direction_REG&=~(1<<SPI_DI);

SD_Direction_REG|=(1<<SPI_Clock);

SD_Direction_REG|=(1<<SPI_DO);

SD_Direction_REG|=(1<<SD_Chip_Select);

SD_Direction_REG|=(1<<SPI_SS);

SD_Write|=(1<<SD_Chip_Select);



//We need to wait for the SD_Direction_REG to be ready

for(a=0;a<200;a++)

    {

     nop();

    };

//Enable SPI in Master Mode with IDLE low and clock at 8M/128

SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);

SPSR&=~(1<<SPI2X);

  

// We need to give the card about a Hundred cycles to load

for (b=0;b<0x0f;++b)

     {

      Write_Byte_SD(0xff);

     }



//Send the initialization commands to the card

retry=0;

  

while(Write_Command_SD1(CMD)!=0X01)

{

  Delay_ms(10);              //很重要,要不然就要REST才可以

//fail and return

if(retry++>50)

{

return 1;

}

}



  



//Send the 2nd command

retry=0;

CMD[0]=0x41;

CMD[5]=0xFF;



while(Write_Command_SD1(CMD)!=0)

      {

           Delay_ms(10);

       if (retry++>50)

          {

          return 2;

          }

       }



//Set the SPI bus to full speed 8M/2

SPCR&=~((1<<SPR0)|(1<<SPR1));

SPSR|=(1<<SPI2X);



//Raise Chip Select



SD_Disable();

asm("sei");

return 0;

}



//=======================================================================

uint8 SD_set_length(uint16 length)

{uint8 retry;

//Command to set the block length;



while(Write_Command_SD(0x50,length)!=0)

      {

       if (retry++>10)

          {

          return 1;

          }

       }

   

SD_Disable();



return 0;

}



//=======================================================================

uint8 SD_read_sector(uint32 addr,uint8*Buffer)

{

uint16 a;

uint8 retry=0;



// Send the read command  

while(Write_Command_SD(0x51,addr<<9)!=0)

      {

       if (retry++>10)

          {

          return 1;

          }

      }



//receive the start byte

while(Read_Byte_SD()!=0xfe);





                                                                             

//Read off all the bytes in the block

for(a=0;a<512;a++)

    {

         *Buffer++=Read_Byte_SD();

    }



//Read CRC byte

Read_Byte_SD();

Read_Byte_SD();

  

// Set SD_Chip_Select to high

SD_Disable();



return 0;

}



//=======================================================================

uint8 SD_start_read(uint32 addr)

{

uint8 retry;

  // Send the read command  

while(Write_Command_SD(0x51,addr<<9)!=0)

      {

       if (retry++>10)

          {

          return 1;

          }

      }



//Send the start byte

while(Read_Byte_SD()!=0xfe);



SD_Disable();

return 0;  //open successfully!

}



//=======================================================================

void SD_get_date(uint8 *Buffer,uint16 Number)

{

uint16 a;

SD_Enable();



for(a=0;a<Number;a++)

{

*Buffer++=Read_Byte_SD();



}  

  SD_Disable();          // Set SD_Chip_Select to high

}



//=======================================================================

uint8 SD_read_sector2(uint32 addr,uint8*Buffer,uint16 Bytes)

{

uint16 a;

uint8 retry=0;



// Send the read command  

while(Write_Command_SD(0x51,addr)!=0)

      {

       if (retry++>10)

          {

          return 1;

          }

      }



//receive the start byte

while(Read_Byte_SD()!=0xfe);

                                                                             

//Read off all the bytes in the block

for(a=0;a<Bytes;a++)

  {

   *Buffer++=Read_Byte_SD();  

  }

//Read CRC byte

Read_Byte_SD();

Read_Byte_SD();

  

// Set SD_Chip_Select to high

SD_Disable();



return 0;

}



//=======================================================================

//Routine for writing a Block(512Byte) to MMC/SD-Card

//Return 0 if sector writing is completed.

unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)

{  

   unsigned char tmp,retry;

   unsigned int i;

   #asm("cli"); //clear all interrupt.

   //Command 24 is a writing blocks command for MMC/SD-Card.

    while(Write_Command_SD(0x58,addr)!=0)

      {

       if (retry++>10)

          {

          return 1;

          }

      }

   

   //Before writing,send 100 clock to MMC/SD-Card

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

   {

      Read_Byte_SD();

   }

       

   //Send Start Byte to MMC/SD-Card

   Write_Byte_SD(0xFE);       

       

   //Now send real data Bolck (512Bytes) to MMC/SD-Card

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

   {

      Write_Byte_SD(*Buffer++); //send 512 bytes to Card

   }



   //CRC-Byte

   Write_Byte_SD(0xFF); //Dummy CRC

   Write_Byte_SD(0xFF); //CRC Code

   

   

   tmp=Read_Byte_SD();   // read response

   

   if((tmp & 0x1F)!=0x05) // data block accepted ?

   {

     SD_Disable();

     return 1; //Error!

   }

   //Wait till MMC/SD-Card is not busy

   while (Read_Byte_SD()!=0xff){};

       

   //set MMC_Chip_Select to high (MMC/SD-Card Invalid)

   SD_Disable();

   return 0;

}

出0入0汤圆

发表于 2006-7-21 15:11:43 | 显示全部楼层
谢谢lz。

出0入54汤圆

发表于 2006-7-21 15:22:41 | 显示全部楼层
厉害,呵呵

出0入0汤圆

 楼主| 发表于 2006-8-15 12:56:33 | 显示全部楼层
有谁知道阿莫卖的SD卡是不是我用的那种,我想从这儿购买!

出0入0汤圆

发表于 2006-8-15 13:11:46 | 显示全部楼层
哇顶啊!

好激动

出0入0汤圆

发表于 2006-8-26 21:11:54 | 显示全部楼层
不错啊!真想自己也做一个。



羡慕啊!

出0入0汤圆

发表于 2006-8-27 08:53:12 | 显示全部楼层
楼主能不能把代码一气发完?

出0入0汤圆

发表于 2006-8-27 09:54:38 | 显示全部楼层
不错,好玩。也想搞一个!!!!

出0入0汤圆

发表于 2006-12-7 10:05:41 | 显示全部楼层
羡慕。

高人。

我有那么好的技术,就随便拿钱了。

出0入0汤圆

发表于 2008-8-13 17:49:39 | 显示全部楼层
有没代码可以看下的呀??STA的代码,快疯掉了

出0入0汤圆

 楼主| 发表于 2008-11-30 21:30:49 | 显示全部楼层
你需要的代码.下面地址公布了!

STA013的老方案的MP3所有设计资料现在此论坛公布,请在下面地址下载!谢谢支持&nbsp;

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1900591&bbs_id=9999

出0入0汤圆

发表于 2009-7-10 21:15:04 | 显示全部楼层

很强大~~
我有个问题想问下~
就是M16只1K Sram,是不是用512ByteS做Mp3数据缓存??每次读一个扇区,当Sta013要完数据后,再接着读下一扇区??
那读一扇区时间应该不少,Sta013可以流畅播放啊?

出0入0汤圆

发表于 2009-7-11 10:32:48 | 显示全部楼层
当初看似很完美,如今不及VS1003B的性价比高呀!
用SOC实现MP3的播放,才是性价比最高的.

出0入0汤圆

发表于 2009-11-11 20:14:08 | 显示全部楼层
楼主 你好
你的这个作品很强悍啊
最近我也在做一个MP3播放器
遇到一个问题
就是使用PCM1770
我看过你上传的程序了
里面设置的很简单 就是模仿SPI时序 对其初始化
模式字为0x0381
可是我搞了很久 不管是用模仿SPI 还是用SPI接口 均不管用

出0入0汤圆

发表于 2009-11-11 20:36:57 | 显示全部楼层
楼主啊
我顶你了啊
我真的需要解决这个问题
已经搞了好多天了啊
很郁闷啊

出0入0汤圆

发表于 2009-11-11 20:38:08 | 显示全部楼层
楼主
顶你了
急需帮助
谢谢了

出0入0汤圆

发表于 2009-11-11 20:38:25 | 显示全部楼层
楼主
顶你了
急需帮助
谢谢了

出0入0汤圆

发表于 2009-11-12 13:42:28 | 显示全部楼层
楼主 什么时候在啊
看见了一定要回复啊
我实在无语了

出0入0汤圆

发表于 2010-8-26 21:47:00 | 显示全部楼层
楼主 请问用普通的51单片机可以代替mega16来作为控制芯片么??

出0入0汤圆

发表于 2010-9-10 22:58:24 | 显示全部楼层
mark~

出0入0汤圆

发表于 2010-11-5 10:40:17 | 显示全部楼层
厉害啊,
顶!

出50入0汤圆

发表于 2011-4-14 16:09:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-2 21:53:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-2 22:26:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-26 21:46:49 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-5-27 13:02:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-3 13:13:04 | 显示全部楼层
STA013 mp3

出0入0汤圆

发表于 2011-7-9 15:23:52 | 显示全部楼层
哈哈哈,老衲学习了,

出0入0汤圆

发表于 2011-11-11 15:32:55 | 显示全部楼层
标注学习阿!

出0入0汤圆

发表于 2011-12-1 03:19:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-3 22:06:14 | 显示全部楼层
谢谢~学习了。。。

出0入17汤圆

发表于 2012-8-13 19:29:30 | 显示全部楼层
pcm1770的驱动代码有吗?求楼主发一个。或者邮箱995207301@qq.com

出0入0汤圆

发表于 2012-8-14 16:24:03 | 显示全部楼层
板子做的不错

出0入0汤圆

发表于 2012-12-21 21:38:05 | 显示全部楼层
endylu1983 发表于 2006-7-13 10:41

你好,我现在在用ATMEGA32A+STA013+SD Card+PCM1770+NOKIA5110制作MP3,我的STA013的原理图以及PCM1770的原理图跟你的是一样的,然后STA013的外部晶振接的是14.318MHz的,现在我遇到的问题是STA013的OCLK输出的信号波形是一种接近正弦波的波形,理论上不是应该是方波吗?会不会是晶振值使用的问题啊?(目前我还没有替换其他值的晶振10M、14.7456M),求帮助?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-4-6 14:39:37 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 03:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表