xlhhao 发表于 2007-1-14 21:10:24

公布我写的一个MP3程序,供有兴趣的朋友参考,并希望得到高手的指教

硬件电路是本站上提供的阿永第三版MP3板子

程序我在原有的基础上做了移植修改并加了一些新的功能. 实际上程序还没有完全写完.第一次用GCC程序有不少的BUG。新增的功能有。

       1:目录文件浏览,选择文件播放

       2.支持歌词同步显示

       3.支持FAT12 & FAT16& FAT32文件系统

使用时,将源程序的DOC目录下的Hzk12及unitogb.bin文件拷至SD卡内。



    源代码在 AVR Studio 4.12 sp4+WinAvr 2005-11-5 环境下编译 优化选择(-os)

点击此处下载armok01141406.rar

给二张图片看看

http://cache.amobbs.com/bbs_upload782111/files_6/armok01141407.JPG

http://cache.amobbs.com/bbs_upload782111/files_6/armok01141408.JPG

AVRstudy 发表于 2007-1-14 21:13:08

不错,谢谢楼主的分享

win2kddk 发表于 2007-1-14 21:25:08

强烈支持楼主的开源精神,建议版主加"酷"!

pasyong 发表于 2007-1-14 21:33:55

顶一下。

y6807 发表于 2007-1-14 21:35:56

支持楼主

win2kddk 发表于 2007-1-14 22:09:34

刚试了一下,怎么光显示大字00:00啊?

win2kddk 发表于 2007-1-14 22:41:40

得接个32768吧

xlhhao 发表于 2007-1-14 23:37:36

不接也没关系,不过不计时而已,我说一下操作方法,上电后出现时钟界面,按Play/Pause键后会进入文件列表界面,NEXT 和 PREV按键选择要放的歌曲或要进入的子目录,按Play/pause确定。在放音状态下如果目录中有与歌名相同的LRC文件则会同步显示歌词。在放音中短按Play/pause一下暂停,按住不放会返回上文件列表状态。可参见源程序。

bozai 发表于 2007-1-15 00:52:29

此帖不顶不厚道!

yangzq 发表于 2007-1-15 00:59:08

此帖不顶不厚道!

migzan 发表于 2007-1-15 01:18:14

我也发现了,不顶真的是不厚道啊



支持,绝对的顶

diannaoza 发表于 2007-1-15 02:32:56

明天下载到板上玩玩。谢谢

_yuming 发表于 2007-1-15 07:47:28

顶,,,有原理图吗?

lgw_1983 发表于 2007-1-15 09:00:00

原理图能公布吗?硬件现在还是商品呀,不能公布吧。12楼,别想了。

elefan 发表于 2007-1-15 10:19:22

提点时间解码的建议:不需要使用基准时钟源,可以根据码速以及流过的文件大小计算文件时间,这个对CBR格式的MP3文件有效,VBR文件会因为码速不稳定得到的时间无意义。最准确的方式是获取frame的数目,MP3文件一个frame消耗时间固定,我忘记了,好象是26ms,你查证下资料,这个无论对CBR还是VBR都有效。

dgxll 发表于 2007-1-15 10:54:43

顶一下

_yuming 发表于 2007-1-15 11:50:03

原理图我已经有了,就不用了,谢谢!!!不过您的代码还是比较好的,值得我们初学者学习。

gdgmlzw 发表于 2007-1-15 13:23:54

支持楼主

glbest 发表于 2007-1-15 15:12:12

实在太好了,正感无从下手,强顶啊,

win2kddk 发表于 2007-1-15 17:15:47

将HZK12和UNITOGB.BIN拷到SD卡根目录没有用,总是报无HZK和UNI。建议将void FindSysFile(void)中报错显示改一下座标,否则与时间显示重合没法看了。



PrintString(0,0,"Hzk Not Found!");

PrintString(3,0,"Uni Not Found!");

jamesbei 发表于 2007-1-15 18:54:13

好啊,提供了一个学习的机会

xlhhao 发表于 2007-1-15 19:34:22

谢谢elefan的建议,我是直接读取vs1003的decode time的值来显示文件播放时间的,不知

这样会不会造成时间不稳定

xlhhao 发表于 2007-1-15 19:53:52

TO:win2kddk: 你说的“将HZK12和UNITOGB.BIN拷到SD卡根目录没有用,总是报无HZK和UNI”,还请麻烦查找一下原因,我的卡上没有问题。



现发现了一个比较严重的bug,可能在FAT32格式的大容量SD卡会出现。问题出现在 SaveHzk12Sector();函数中,当格式化的SD卡每簇的扇区数为2或1时会出现eeprom的内容覆盖,从而导至查表出错。此问题目前正在修改中...

我很希望大家能够帮我一起解决问题。

y6807 发表于 2007-1-15 22:00:00

我也试了,可以正常播放,但有时播放完一首歌后就会死机

YQSH 发表于 2007-1-15 22:32:59

大家看看这个DVD解码IC的一份程序对你有没有用点击此处下载armok01141677.rar

wzhscj 发表于 2007-1-15 22:33:28

支持楼主

win2kddk 发表于 2007-1-16 13:39:23

我用的是M128,在改完相关设置后重新编译的。插入1G的SD卡就停留在"AVR实验室"那里了。插入128M的MMC卡就报无字库和UNI文件,更无法播放文件,真是奇怪了。看了看程序代码,发现作者运用了大量的类似任务和消息的机制,的确有很大的参考价值,可是要想完全看懂作者的程序意图还是需要一些时日的,况且可读的注释不是太多。

boy123 发表于 2007-1-16 17:12:08

up

支持,谢谢分享.

xlhhao 发表于 2007-1-16 22:24:03

已找到的问题! 出现函数: unsigned long SD_Read_Dword(unsigned long address,unsigned int offset)返回值我错写成了unsigned int函数体内也只读了两个字节的数据,请win2kddk再试一下看看。

修改后代码

点击此处下载armok01141843.rar

hellokilly 发表于 2007-1-18 08:51:55

就是感觉注释太少了一点点啊

哈哈

win2kddk 发表于 2007-1-18 14:55:35

新建了一个工程,用M128芯片,插入拷入HZK及UNI文件1G的金士顿卡,程序死循环在LCD.C中的Get_HzMat过程中的while (Read_Byte_SPI() != 0xfe)处。

xlhhao 发表于 2007-1-18 21:56:14

我有一块金士顿卡也出现这样的问题(现已确定是假冒),这种卡不支持读小于512字节数据。我在程序中设置了每次读8个字节。本来的目的是想让显示快点。但看是兼容性还是不好。



我现在已修改了所有读取的函数,每次读512字.测试一下以前不能读的卡,工作已正常。



修改后程序:

点击此处下载armok01142097.rar





附一首好听的MP3

点击此处下载armok01142098.rar

diannaoza 发表于 2007-1-18 22:25:10

“附一首好听的MP3 “

歌的确好听!HeHe...

win2kddk 发表于 2007-1-18 23:02:01

(假)金士顿卡已测试成功,顺利通过。但是在卡内没有任何目录,可是显示中却有一个叫"ID3"的目录,进入目录后除非复位就再也无法出来。其他正常显示的文件可以播放。收听《痴狂的心》了,很好听,LRC同步正常。其他功能和BUG正在测试中......

win2kddk 发表于 2007-1-18 23:06:41

全角字符显示不正常,如"求佛-誓言"显示为"求佛缍誓言"。刚刚测试出来的,呵呵....继续测试......

TonyCai 发表于 2007-1-19 01:29:47

我也心动了,也要good good study,day day up!

win2kddk 发表于 2007-1-19 11:39:49

这次测试所使用的是SAMSUNG 128MB MMC+PLUS卡,柯达相机随机品(行货,该卡应该是正品),刚刚格式化为FAT32格式,存储有35首MP3文件,没有其他目录。本次出现的问题是:程序执行到MAIN过程的第5步,即StopPlay()时死循环,进入StopPlay()发现在vs1003_Reset()中的while((TCNT2-i)<=11)延时处死循环,TCNT2值也在变化,就是出不去。将该语句改为delay_nus(0xff)可以跳过。但是出现了"gaea.hit.ed"和"/MediaClass"两个空目录,且全部显示的文件名均为"         MP3"或"   ~1 MP3",HZK和UNI是拷完MP3文件后拷入的。文件显示却只有12个。

进入"gaea.hit.ed"目录无任何反应,但不死机。进入"/MediaClass"目录时死机,JTAG跟踪后发现死在了MAIN的MenuOpter()的FileView()的第2句TotalFile=SerarchFile(CurDir,fileindex)里的SerarchFile()中的第2句ReadBlock(fp.Sector)里的SD_Read_Block(temp)下的while (Read_Byte_SPI()!= 0xfe)处。JTAG复位程序并重新开始,程序就循环在SD_Init()的

   do

   { //retry 100 times to send CMD1 command

   temp=SD_Write_Command(1,0);

   retry++;

   if(retry==100)

   {

   ;

   }

   }

中出不来啦,需要下电复位MMC卡。另,在1G的Kingston SD卡上播放个别MP3文件完(WMA也出现过一次,只是在播放前)确有死机现象,因为是个别随机的,所以等我用JTAG跟踪到再来告诉你。

win2kddk 发表于 2007-1-19 15:26:39

刚刚又换了一种卡,这次的是PQI 128M MMC卡,FAT16格式,拷有17个WMA文件,死循环的位置在:InitSystem()下的fatInit()的第3句ReadBlock(0)中的SD_Read_Block(temp)下的while (Read_Byte_SPI()!= 0xfe)处,一开始初始化就通不过的确不多见。不过,不应该是卡有多大问题,插在读卡器并在PC上很正常,在数码相机里也很正常。今天下午将测试跟踪播放死机现象,有最新情况我会通知你的。

win2kddk 发表于 2007-1-19 16:52:02

上传一首好听的歌曲,以资鼓励。点击此处下载armok01142166.rar

win2kddk 发表于 2007-1-19 17:08:44

当播放一个文件后,长按PAUSE键返回选曲菜单时最下一行的歌曲时间及音量信息没有清除。

xlhhao 发表于 2007-1-19 22:12:40

win2kddk,辛苦了!



   看来程序对MMC卡读写并不支持,“全部显示的文件名均为"         MP3"或"   ~1 MP3"”,说明了程序根本就没有找到HZK12及unitogb.bin这两个文件,遇到中文显示为空格,且只能显示短的文件名。初始化及读取SD卡部分程序是沿用以前的。由于我没有MMC卡还无法去试,此问题还得请你或其他的网友帮忙解决。



   用SD卡时播放中出现的死机现象应该是 vs1003_Reset()中的while((TCNT2-i)<=11)延时造成的,我按照你改成delay_nus(0xff)后就再也没有出现过了.不过我很奇怪为何会这样。



我没有JTAG调试器,每次都是ISP下载程序后去试的,出现的死机现象还真不好找出问题,在此要谢谢你。



随便说一声,上传歌曲很不错的,谢谢!

win2kddk 发表于 2007-1-19 22:30:13

其实MP3这个小东西就是在玩FAT,操控其他的器件都是辅助和简单的。我要是版主就给xlhhao加上95分,毕竟他给我带来了一些新的思路和想法,我在这里谢谢你啦。呵呵....

caravtech 发表于 2007-1-20 14:55:21

TO:xlhhao

   我刚跟阿莫买了套MP3开发板,我在宝安这边,有机会过去找你请教请教~~顺便喝点小酒~~~

我QQ:53319260

MSN:CarAvtech@hotmail.com

jackiezeng 发表于 2007-1-20 19:49:03

此帖要顶~!



楼上的 + 楼主



我在天安数码城 , 空了出来喝点小酒 三 ~!

xlhhao 发表于 2007-1-20 21:05:58

TO:caravtech,谈不上指教,大家可以一起交流学习.AVR是自已业余学着玩,禁不住网站上一些网友的作品诱惑.感觉AVR使用起来很爽,资源也够丰富的。





楼上的,说不定我在你楼下呢

jammy_zou 发表于 2007-1-20 22:07:49

我是新来的,那开发板网站是不是有的买啊?

diannaoza 发表于 2007-1-21 21:07:38

下到板上试了,不错kingmax1G/fat32;;播的歌在上面,,不错

http://cache.amobbs.com/bbs_upload782111/files_6/armok01142338.jpg

hellokilly 发表于 2007-1-22 12:43:12

的确 主要是文件系统的问题~

caravtech 发表于 2007-1-23 20:51:41

TO:xlhhao

   可以加我QQ:53319260或 MSN:CarAvtech@hotmail.com 吗?



U盘的你玩得怎么样了呢??

xlhhao 发表于 2007-1-23 22:07:27

To: caravtech

不好意思,QQ基本不用(没时间啊) MSN没有,只有Email: xlhhao@163.com ,由于上班较忙,只能业余时间玩玩。

U盘还没想着要用呢,觉得耗电太需要5V供电,如果你对这个有兴趣,很高兴与你一起讨论,学习。

jackiezeng 发表于 2007-1-23 22:38:47

TO : xlhhao



   您也在 天安数码城 ?

xlhhao 发表于 2007-1-23 23:12:02

创新二期,东座4楼。是不是你楼下啊,呵呵!

jackiezeng 发表于 2007-1-24 16:53:59

呵呵,说不定路上都碰过面啊 ~~! :)

jackiezeng 发表于 2007-1-24 21:25:49

TO : win2kddk



   你推荐的那首好好 听 哦~!

hellokilly 发表于 2007-1-25 13:27:32

我用winavr怎么出现这样的错误啊



Compiling: C:/mp3/Mp3.c

avr-gcc -c -mmcu=atmega64 -I. -gstabs -DF_CPU=8000000UL-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=C:/mp3/Mp3.lst-std=gnu99 -MD -MP -MF .dep/Mp3.o.d C:/mp3/Mp3.c -o C:/mp3/Mp3.o

C:/mp3/Mp3.c:22: warning: return type defaults to `int'

C:/mp3/Mp3.c:22: warning: function declaration isn't a prototype

C:/mp3/Mp3.c: In function `ISR':

C:/mp3/Mp3.c:22: warning: type of "__vector_16" defaults to "int"

C:/mp3/Mp3.c: At top level:

C:/mp3/Mp3.c:27: warning: return type defaults to `int'

C:/mp3/Mp3.c:27: warning: function declaration isn't a prototype

C:/mp3/Mp3.c:27: error: redefinition of 'ISR'

C:/mp3/Mp3.c:22: error: previous definition of 'ISR' was here

C:/mp3/Mp3.c: In function `ISR':

C:/mp3/Mp3.c:27: warning: type of "__vector_10" defaults to "int"

C:/mp3/Mp3.c: At top level:

C:/mp3/Mp3.c:85: warning: function declaration isn't a prototype

make.exe: *** Error 1

hellokilly 发表于 2007-1-25 13:36:13

ISR(SIG_OVERFLOW0)//Real Time Count every 1s interrupt

{

        TimeFlag|=bT1S;

}



//每32.768MS中断一次

ISR(SIG_OVERFLOW2)

{

        TimeFlag|=(bT32MS|bTkey);

        Rtime++;

}

提示是这里有问题,没有弄过不懂.大虾怎么弄啊

`

johu 发表于 2007-1-25 15:44:30

你多少钱买的阿!?!?!?

xlhhao 发表于 2007-1-25 21:09:47

TO: hellokilly

应该是你的WinAvr的版本不同,我是在WinAvr 2005-11-5 版本编译的.



你也可以试着进行以下修改:



   1、将 ISR 换成 SIGNAL

   2、在文件中增加 #include "signal.h"



TO:johu

我买的要比现在的报价便宜,花了178大元。

hellokilly 发表于 2007-1-26 08:46:45

zm怎么我没有看到你说的版本啊

隔的比较近的只有:

WinAVR-20050214-install.exe

WinAVR-20060125-install.exe

加了以后它说

signal.h: No such file or directory
-----此内容被hellokilly于2007-01-26,08:49:54编辑过

hellokilly 发表于 2007-1-26 09:37:15

y原来是#include <avr/signal.h> 明白了 哈哈

oleon 发表于 2007-1-26 10:03:24

ding顶

jackiezeng 发表于 2007-1-26 17:40:46

请问楼主:



    eeprom_read_block(&foffset,eep,4); //取首簇号



这个函数在哪里定义的 ?

xlhhao 发表于 2007-1-26 21:31:56

库函数, eeprom.h 有定义

ben2k 发表于 2007-2-2 10:07:16

太强了,有无人将它改为ICC的,小弟弟感激不尽!

hellokilly 发表于 2007-2-3 11:39:20

关于avr(winavr)里面的一个定义不懂,请教~





就是这个定义

#define   bReadOvr_BV(0)   //读文件完成

#define   bPlayOvr_BV(1)   //放音完成

#define   bPause    _BV(2)   //暂停

#define   bStop   _BV(3)   //停止放音

#define   bDatRdy   _BV(4)   //数据准备   

#define   bHzk12    _BV(5)   //1:存在hzk

#define   bLrc      _BV(6)   //1:存在歌词文件

#define   bUnicode_BV(7)   //存在代码转换表



按道理它意思应该是:一个8位数的每一个bit代表一个功能,但是这个是那一个8位数呢?和它离的最近的8位数的声明吗?

xlhhao 发表于 2007-2-3 12:00:05

这些定义的实际是一个常数,具体是哪个变量的是要结合程序的操作来看的,光从定义是无法看出来。我的程序对应的是WorkFlag这个变量

TonyCai 发表于 2007-2-9 00:46:39

我也买了一个,硬件刚焊接完,但M64连不上ISP,请教楼上各位。。。

hellokilly 发表于 2007-2-9 09:34:31

那请问一下在程序里面有很多的 _BV(0) 定义是对应的哪些变量啊??

jackiezeng 发表于 2007-2-9 11:11:21

_BV(0)相当与 (1<<0)

hellokilly 发表于 2007-2-10 08:46:43

这个我知道啊 但是都是哪些变量第N位呢?

hanlin 发表于 2007-2-10 14:39:50

强人啊.不一般

weiwgml 发表于 2007-2-28 15:41:52

看过 顶一个

sdydding 发表于 2007-3-1 09:11:51

看过 顶顶

martin7wind 发表于 2007-3-1 15:14:15

顶一下,支持!

yuanzhenping 发表于 2007-3-2 19:52:24

站长,图中的PCB多少钱一片呀?我要买怎么联系呀?

yclfoxconn 发表于 2007-3-3 22:12:59

真是不顶不厚道,

买了一块板用光盘自带的U盘和SD卡测试程序不能放,可是用LZ的程序就可以了,多谢多谢

chenshaoxi 发表于 2007-3-10 23:42:49

我的扳子能下程序,但是U盘插上灯不亮,没有显示\没有声音\没有传口,怎么办,请教

chenshaoxi 发表于 2007-3-16 11:41:47

使用楼主的程序,成功放音,很不错

steven 发表于 2007-3-16 11:54:14

本网站所卖的阿永第三版MP3板子,散件与焊好的板子除了焊好的板子带背光灯外,还有什么地方不同啊?

zfc_zhao 发表于 2007-3-16 18:39:05

想重新制版,谁有封装库支援一下啊,不胜感激,zfc_zhao@126.com

hellokilly 发表于 2007-3-17 22:18:43

里面没有工程

自己建了一个,什么都没有改,直接加文件



怎么说很多函数没有定义啊?

不明白

battery 发表于 2007-3-27 15:02:03

对SD卡的读取能力、兼容性很差,经常死机.

hellokilly 发表于 2007-4-5 11:39:37

dui 对了



里面的fileindex(??) 和 selindex(当前选择的索引) 这两个变量



我始终没有搞清楚fileindex是什么意思?

joson 发表于 2007-4-5 13:18:57

很好阿。

chanfay 发表于 2007-4-5 16:16:45

太厉害了,要好好的向你们学习才是

eddia2000 发表于 2007-4-6 17:16:05

好東西啊,還真是值得頂一頂,不要沉了.

tjlong 发表于 2007-5-15 11:59:15

请教:

请问是把包里面哪个文件烧进去?

是default那个文件夹下面的MP3.HEX么?

还有就是有没有实现这些功能的U盘代码?

bairg521 发表于 2007-5-15 16:37:55

好东西!

也想做个玩玩,不知道自己做的mp3音质怎么样?

kebaojun305 发表于 2007-5-16 10:36:48

刚收到套件,有一点建议,PCB的焊盘上有许多过孔,在批量生产是易导致假焊且焊点锡量偏少.只是一点建议哦!

ljxh401 发表于 2007-5-16 17:19:45

楼上各位 我是卖酒的

my_avr 发表于 2007-5-16 19:01:32

一个字:强

两个字:真强

TonyCai 发表于 2007-5-16 21:22:21

我的版本是:【4.12.452Service Pack 1】+ WinAVR-20050214,有如下的3个错误和2个警告,该如何处理,请教。。。



../Mp3.c:22: warning: return type defaults to `int'

../Mp3.c:27: warning: return type defaults to `int'

../Mp3.c:27: error: redefinition of 'ISR'

../Mp3.c:22: error: previous definition of 'ISR' was here

make: *** Error 1

Build failed with 3 errors and 2 warnings...



其中的第22行和第27行的具体是这样的代码:



ISR(SIG_OVERFLOW0)//Real Time Count every 1s interrupt------第21行

{                                                       ------第22行

        TimeFlag|=bT1S;

}

//每32.768MS中断一次

ISR(SIG_OVERFLOW2)                                    ------第26行

{                                                       ------第27行

        TimeFlag|=(bT32MS|bTkey);

        Rtime++;

}

xiaotanlan 发表于 2007-6-12 22:15:11

请问熔丝位的设置是否是如下:

http://cache.amobbs.com/bbs_upload782111/files_7/armok01157597.jpg


-----此内容被xiaotanlan于2007-06-12,22:17:09编辑过

lbheibai 发表于 2007-6-18 16:07:54

买了阿永第三版MP3板子,把楼主的程序下载进去,可以正常运行; 可是把阿永第三版MP3板子自带的程序下载进去却没有声音,真怪

jianlming 发表于 2007-6-18 18:54:52

頂一下。。。不錯

lbheibai 发表于 2007-6-20 09:21:48

知道原因了,原来是卡的兼容性问题,

zqljg 发表于 2007-7-1 17:15:05

想问一下,硬件电路是怎么样,那里可以下载!

zqljg 发表于 2007-7-5 21:28:22

代码里LCD.C里有以下代码,请看

qh=(*code++)-0xa1;

wh=(*code)-0xa1;

以上两个是不是计算错了,应该是:

qh=(*code++)-0xa0;

wh=(*code)-0xa0;

望指点!

blueskyhjc 发表于 2007-7-12 13:33:23

不错

zl0801 发表于 2007-7-20 17:23:30

恩,好东西啊,

值得学习,回头尝试一下,谢谢了!
页: [1] 2 3
查看完整版本: 公布我写的一个MP3程序,供有兴趣的朋友参考,并希望得到高手的指教