公布我写的一个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 不错,谢谢楼主的分享 强烈支持楼主的开源精神,建议版主加"酷"! 顶一下。 支持楼主 刚试了一下,怎么光显示大字00:00啊? 得接个32768吧 不接也没关系,不过不计时而已,我说一下操作方法,上电后出现时钟界面,按Play/Pause键后会进入文件列表界面,NEXT 和 PREV按键选择要放的歌曲或要进入的子目录,按Play/pause确定。在放音状态下如果目录中有与歌名相同的LRC文件则会同步显示歌词。在放音中短按Play/pause一下暂停,按住不放会返回上文件列表状态。可参见源程序。 此帖不顶不厚道! 此帖不顶不厚道! 我也发现了,不顶真的是不厚道啊
支持,绝对的顶 明天下载到板上玩玩。谢谢 顶,,,有原理图吗? 原理图能公布吗?硬件现在还是商品呀,不能公布吧。12楼,别想了。 提点时间解码的建议:不需要使用基准时钟源,可以根据码速以及流过的文件大小计算文件时间,这个对CBR格式的MP3文件有效,VBR文件会因为码速不稳定得到的时间无意义。最准确的方式是获取frame的数目,MP3文件一个frame消耗时间固定,我忘记了,好象是26ms,你查证下资料,这个无论对CBR还是VBR都有效。 顶一下 原理图我已经有了,就不用了,谢谢!!!不过您的代码还是比较好的,值得我们初学者学习。 支持楼主 实在太好了,正感无从下手,强顶啊, 将HZK12和UNITOGB.BIN拷到SD卡根目录没有用,总是报无HZK和UNI。建议将void FindSysFile(void)中报错显示改一下座标,否则与时间显示重合没法看了。
PrintString(0,0,"Hzk Not Found!");
PrintString(3,0,"Uni Not Found!"); 好啊,提供了一个学习的机会 谢谢elefan的建议,我是直接读取vs1003的decode time的值来显示文件播放时间的,不知
这样会不会造成时间不稳定 TO:win2kddk: 你说的“将HZK12和UNITOGB.BIN拷到SD卡根目录没有用,总是报无HZK和UNI”,还请麻烦查找一下原因,我的卡上没有问题。
现发现了一个比较严重的bug,可能在FAT32格式的大容量SD卡会出现。问题出现在 SaveHzk12Sector();函数中,当格式化的SD卡每簇的扇区数为2或1时会出现eeprom的内容覆盖,从而导至查表出错。此问题目前正在修改中...
我很希望大家能够帮我一起解决问题。 我也试了,可以正常播放,但有时播放完一首歌后就会死机 大家看看这个DVD解码IC的一份程序对你有没有用点击此处下载armok01141677.rar 支持楼主 我用的是M128,在改完相关设置后重新编译的。插入1G的SD卡就停留在"AVR实验室"那里了。插入128M的MMC卡就报无字库和UNI文件,更无法播放文件,真是奇怪了。看了看程序代码,发现作者运用了大量的类似任务和消息的机制,的确有很大的参考价值,可是要想完全看懂作者的程序意图还是需要一些时日的,况且可读的注释不是太多。 up
支持,谢谢分享. 已找到的问题! 出现函数: unsigned long SD_Read_Dword(unsigned long address,unsigned int offset)返回值我错写成了unsigned int函数体内也只读了两个字节的数据,请win2kddk再试一下看看。
修改后代码
点击此处下载armok01141843.rar 就是感觉注释太少了一点点啊
哈哈 新建了一个工程,用M128芯片,插入拷入HZK及UNI文件1G的金士顿卡,程序死循环在LCD.C中的Get_HzMat过程中的while (Read_Byte_SPI() != 0xfe)处。 我有一块金士顿卡也出现这样的问题(现已确定是假冒),这种卡不支持读小于512字节数据。我在程序中设置了每次读8个字节。本来的目的是想让显示快点。但看是兼容性还是不好。
我现在已修改了所有读取的函数,每次读512字.测试一下以前不能读的卡,工作已正常。
修改后程序:
点击此处下载armok01142097.rar
附一首好听的MP3
点击此处下载armok01142098.rar “附一首好听的MP3 “
歌的确好听!HeHe... (假)金士顿卡已测试成功,顺利通过。但是在卡内没有任何目录,可是显示中却有一个叫"ID3"的目录,进入目录后除非复位就再也无法出来。其他正常显示的文件可以播放。收听《痴狂的心》了,很好听,LRC同步正常。其他功能和BUG正在测试中...... 全角字符显示不正常,如"求佛-誓言"显示为"求佛缍誓言"。刚刚测试出来的,呵呵....继续测试...... 我也心动了,也要good good study,day day up! 这次测试所使用的是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跟踪到再来告诉你。 刚刚又换了一种卡,这次的是PQI 128M MMC卡,FAT16格式,拷有17个WMA文件,死循环的位置在:InitSystem()下的fatInit()的第3句ReadBlock(0)中的SD_Read_Block(temp)下的while (Read_Byte_SPI()!= 0xfe)处,一开始初始化就通不过的确不多见。不过,不应该是卡有多大问题,插在读卡器并在PC上很正常,在数码相机里也很正常。今天下午将测试跟踪播放死机现象,有最新情况我会通知你的。 上传一首好听的歌曲,以资鼓励。点击此处下载armok01142166.rar 当播放一个文件后,长按PAUSE键返回选曲菜单时最下一行的歌曲时间及音量信息没有清除。 win2kddk,辛苦了!
看来程序对MMC卡读写并不支持,“全部显示的文件名均为" MP3"或" ~1 MP3"”,说明了程序根本就没有找到HZK12及unitogb.bin这两个文件,遇到中文显示为空格,且只能显示短的文件名。初始化及读取SD卡部分程序是沿用以前的。由于我没有MMC卡还无法去试,此问题还得请你或其他的网友帮忙解决。
用SD卡时播放中出现的死机现象应该是 vs1003_Reset()中的while((TCNT2-i)<=11)延时造成的,我按照你改成delay_nus(0xff)后就再也没有出现过了.不过我很奇怪为何会这样。
我没有JTAG调试器,每次都是ISP下载程序后去试的,出现的死机现象还真不好找出问题,在此要谢谢你。
随便说一声,上传歌曲很不错的,谢谢! 其实MP3这个小东西就是在玩FAT,操控其他的器件都是辅助和简单的。我要是版主就给xlhhao加上95分,毕竟他给我带来了一些新的思路和想法,我在这里谢谢你啦。呵呵.... TO:xlhhao
我刚跟阿莫买了套MP3开发板,我在宝安这边,有机会过去找你请教请教~~顺便喝点小酒~~~
我QQ:53319260
MSN:CarAvtech@hotmail.com 此帖要顶~!
楼上的 + 楼主
我在天安数码城 , 空了出来喝点小酒 三 ~! TO:caravtech,谈不上指教,大家可以一起交流学习.AVR是自已业余学着玩,禁不住网站上一些网友的作品诱惑.感觉AVR使用起来很爽,资源也够丰富的。
楼上的,说不定我在你楼下呢 我是新来的,那开发板网站是不是有的买啊? 下到板上试了,不错kingmax1G/fat32;;播的歌在上面,,不错
http://cache.amobbs.com/bbs_upload782111/files_6/armok01142338.jpg 的确 主要是文件系统的问题~ TO:xlhhao
可以加我QQ:53319260或 MSN:CarAvtech@hotmail.com 吗?
U盘的你玩得怎么样了呢?? To: caravtech
不好意思,QQ基本不用(没时间啊) MSN没有,只有Email: xlhhao@163.com ,由于上班较忙,只能业余时间玩玩。
U盘还没想着要用呢,觉得耗电太需要5V供电,如果你对这个有兴趣,很高兴与你一起讨论,学习。 TO : xlhhao
您也在 天安数码城 ? 创新二期,东座4楼。是不是你楼下啊,呵呵! 呵呵,说不定路上都碰过面啊 ~~! :) TO : win2kddk
你推荐的那首好好 听 哦~! 我用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 ISR(SIG_OVERFLOW0)//Real Time Count every 1s interrupt
{
TimeFlag|=bT1S;
}
//每32.768MS中断一次
ISR(SIG_OVERFLOW2)
{
TimeFlag|=(bT32MS|bTkey);
Rtime++;
}
提示是这里有问题,没有弄过不懂.大虾怎么弄啊
` 你多少钱买的阿!?!?!? TO: hellokilly
应该是你的WinAvr的版本不同,我是在WinAvr 2005-11-5 版本编译的.
你也可以试着进行以下修改:
1、将 ISR 换成 SIGNAL
2、在文件中增加 #include "signal.h"
TO:johu
我买的要比现在的报价便宜,花了178大元。 zm怎么我没有看到你说的版本啊
隔的比较近的只有:
WinAVR-20050214-install.exe
WinAVR-20060125-install.exe
加了以后它说
signal.h: No such file or directory
-----此内容被hellokilly于2007-01-26,08:49:54编辑过 y原来是#include <avr/signal.h> 明白了 哈哈 ding顶 请问楼主:
eeprom_read_block(&foffset,eep,4); //取首簇号
这个函数在哪里定义的 ? 库函数, eeprom.h 有定义 太强了,有无人将它改为ICC的,小弟弟感激不尽! 关于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位数的声明吗? 这些定义的实际是一个常数,具体是哪个变量的是要结合程序的操作来看的,光从定义是无法看出来。我的程序对应的是WorkFlag这个变量 我也买了一个,硬件刚焊接完,但M64连不上ISP,请教楼上各位。。。 那请问一下在程序里面有很多的 _BV(0) 定义是对应的哪些变量啊?? _BV(0)相当与 (1<<0) 这个我知道啊 但是都是哪些变量第N位呢? 强人啊.不一般 看过 顶一个 看过 顶顶 顶一下,支持! 站长,图中的PCB多少钱一片呀?我要买怎么联系呀? 真是不顶不厚道,
买了一块板用光盘自带的U盘和SD卡测试程序不能放,可是用LZ的程序就可以了,多谢多谢 我的扳子能下程序,但是U盘插上灯不亮,没有显示\没有声音\没有传口,怎么办,请教 使用楼主的程序,成功放音,很不错 本网站所卖的阿永第三版MP3板子,散件与焊好的板子除了焊好的板子带背光灯外,还有什么地方不同啊? 想重新制版,谁有封装库支援一下啊,不胜感激,zfc_zhao@126.com 里面没有工程
自己建了一个,什么都没有改,直接加文件
怎么说很多函数没有定义啊?
不明白 对SD卡的读取能力、兼容性很差,经常死机. dui 对了
里面的fileindex(??) 和 selindex(当前选择的索引) 这两个变量
我始终没有搞清楚fileindex是什么意思? 很好阿。 太厉害了,要好好的向你们学习才是 好東西啊,還真是值得頂一頂,不要沉了. 请教:
请问是把包里面哪个文件烧进去?
是default那个文件夹下面的MP3.HEX么?
还有就是有没有实现这些功能的U盘代码? 好东西!
也想做个玩玩,不知道自己做的mp3音质怎么样? 刚收到套件,有一点建议,PCB的焊盘上有许多过孔,在批量生产是易导致假焊且焊点锡量偏少.只是一点建议哦! 楼上各位 我是卖酒的 一个字:强
两个字:真强 我的版本是:【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++;
} 请问熔丝位的设置是否是如下:
http://cache.amobbs.com/bbs_upload782111/files_7/armok01157597.jpg
-----此内容被xiaotanlan于2007-06-12,22:17:09编辑过 买了阿永第三版MP3板子,把楼主的程序下载进去,可以正常运行; 可是把阿永第三版MP3板子自带的程序下载进去却没有声音,真怪 頂一下。。。不錯 知道原因了,原来是卡的兼容性问题, 想问一下,硬件电路是怎么样,那里可以下载! 代码里LCD.C里有以下代码,请看
qh=(*code++)-0xa1;
wh=(*code)-0xa1;
以上两个是不是计算错了,应该是:
qh=(*code++)-0xa0;
wh=(*code)-0xa0;
望指点! 不错 恩,好东西啊,
值得学习,回头尝试一下,谢谢了!