打印

基于STC12C5A60S2的MP3实验(znfat,SD卡和VS1003)

[复制链接]
11118|56
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
首先晒一下作品先~~~~~:lol



    MP3名字故意起很长的中文名的哈!!!!一样可以!!!日语韩语也都可以!!





  可以看到,znfat占用资源很小,适合于内存资源不丰富的CPU!!


主控芯片:STC12C5A60S2
使用模块:SD卡模块、VS1003模块
主要技术:SD卡上挂载znfat文件系统,MP3音频解码
参考资料:znfat.com/bbs(抱歉哈,不让发URL,自己在前面加www吧亲)

刚开始做这个的时候 先测试了VS1003模块,先经过正弦测试,然后单片机中放入音频文件(当然,很小,只是几秒钟的播放时间),测试成功!!
但是这远远不够,毕竟单片机内存太小,不能存放太多的数据,从而想到了如果能将音频数据放入SD卡,然后再从SD卡直接读取数据到MP3解码芯片,
那就有了MP3的邹形了!

于是,开始调试SD卡,买了SD卡模块后,有配套的测试程序,经过相应的引脚配置后,可以使用,但是只能读取某一块中的内容,对文件来说定位
不容易啊。。。。。故想到了移植个文件系统,这样就方便多了 !!不过用什么文件系统好呢。。感觉都好深奥。。后来经朋友强力推荐,使用振南
的znfat,有兴趣的朋友可以到这里(znfat.com/bbs,前面加www就可以进去)去下载znfat源码,里面已经帮我们移植好了SD卡+znfat文件系统,使用非常方便!!

下载下来后,首先测试了是否能读取SD卡的文件数据,答案是肯定的,很完美,速度也很快!!!
这下信心大增了。。
然后立即将调试好的VS1003模块加进去,本来想着就立即可以使用的。。谁知道还是出现了问题,这是必然的哈,一个成功的作品是经过不断调试的哈

问题一   :单独使用都可以,但是配合起来就不行,无论怎么弄,始终播不了,怎么播都没用。。调试了很久,各种调。。无果
解决方法:请教了高手,原来是由于单片机内存太小,编译的时候没注意看,导致内存溢出! 后面果断去掉一些代码!!发现可以了。。一阵窃喜!!

接下来我就在想文件名如果太长了,怎么办? 包括中文字符的话又会是怎么样呢?
想也没用,付诸实践呗~~~~~

于是又出现第二个问题了~~~~汗:L

问题二   : 将文件名字改成很长的一大串英文,然后让SD卡去读取,发现返回错误代码ERR_LFN_BUF_OUT15,这是怎么回事呢?
解决方法:这要感谢znfat的强大了哈,里面有一个config。h的头文件,可以进行配置,于是乎我就果断的去改了一下大小,发现又可以了。。狂喜!!

继续调试,中文名的也搞定了,而且无论多长都没问题,相当稳定!!

本程序特点:可以将从SD卡读取的数据,直接发送到MP3解码芯片去,节省了大量的存储空间,实现这一功能的是znfat的数据重定向功能,很好很强大!
但是也有其缺点,就是效率比较低,因为每读取一个字节就会调用一次处理函数,如果文件是100000个字节的话,那么函数将会被掉用100000次!!
读者可以自行改进,提供一个思路,由于VS1003在DREQ引脚为高电平时候才能写入数据,而且一次性能写入32个字节,所以可以在单片机内存中开辟一个缓存区,
然后每次从SD卡读取32个字节的数据,再送到VS1003去解码,这样效率会相对高一点!!

以下是部分代码:
        znFAT_Device_Init(); //存储设备初始化
        UART_Send_Str("SD卡初始化完毕\r\n");

        MP3_Init();
        
        znFAT_Select_Device(0,&Init_Args); //选择设备  
        
        res=znFAT_Init(); //文件系统初始化,成功返回0,不成功返回1
        if(!res) //文件系统初始化成功
        {
                UART_Send_Str("Suc. to init FS\r\n");
               
                UART_Put_Inf("BPB_Sector_No:",Init_Args.BPB_Sector_No);   
                UART_Put_Inf("Total_SizeKB:",Init_Args.Total_SizeKB);
                UART_Put_Inf("BytesPerSector:",Init_Args.BytesPerSector);
                UART_Put_Inf("FATsectors:",Init_Args.FATsectors);  
                UART_Put_Inf("SectorsPerClust:",Init_Args.SectorsPerClust);
                UART_Put_Inf("FirstFATSector:",Init_Args.FirstFATSector);
                UART_Put_Inf("FirstDirSector:",Init_Args.FirstDirSector);
                UART_Put_Inf("FSsec:",Init_Args.FSINFO_Sec);
                UART_Put_Inf("Next_Free_Cluster:",Init_Args.Next_Free_Cluster);
                UART_Put_Inf("FreenCluster:",Init_Args.Free_nCluster);
        }
        else //文件系统初始化失败
        {
        UART_Put_Inf("Fail to init FS, Err Code:",res);
        }         
        
        while(!(err=znFAT_Open_File(&fileinfo,"/*.mp3",i,1)))                //打开文件,成功返回0,不成功返回1
        {
                UART_Send_Str("Suc. to open file.\r\n");
                UART_Send_Str("================================\n");
                UART_Send_Str("File_Name(Short 8.3):");
                UART_Send_Str(fileinfo.File_Name);UART_Send_Enter();
                UART_Put_Inf("File_Size:",fileinfo.File_Size);
                 
                UART_Send_Str("File_CDate:");
                UART_Put_Num(fileinfo.File_CDate.year); UART_Send_Str("年");
                UART_Put_Num(fileinfo.File_CDate.month);UART_Send_Str("月");
                UART_Put_Num(fileinfo.File_CDate.day);  UART_Send_Str("日");
                UART_Put_Num(fileinfo.File_CTime.hour); UART_Send_Str("时");
                UART_Put_Num(fileinfo.File_CTime.min);  UART_Send_Str("分");
                UART_Put_Num(fileinfo.File_CTime.sec);  UART_Send_Str("秒\r\n");

                       UART_Send_Str("Now Listening to the music...");
               
                len=znFAT_ReadDataX(&fileinfo,0,fileinfo.File_Size); //读取MP3文件所有数据,通过重定向直接送给VS1003
               
                UART_Put_Inf("\r\nHave read data (Bytes):",len); //输出实际读到的数据量         

                i=((++i)%2);               
                znFAT_Close_File(&fileinfo); //关闭文件
        
        //        flush_buffer();
        
        //        znFAT_Flush_FS(); //刷新文件系统
        }

感想:经过这个制作过程,知道了自己能力上的不足,要恶补啊。。。。各位同仁。。。一起加油吧。。。

写到这已经凌晨1点了。。

就这样吧。。。

mp3.rar

535.56 KB

源代码

相关帖子

沙发
coody| | 2013-3-1 14:37 | 只看该作者
支持

使用特权

评论回复
板凳
cz_kangjie| | 2013-3-1 16:28 | 只看该作者
好东西啊

使用特权

评论回复
地板
ballack_linux|  楼主 | 2013-3-1 20:35 | 只看该作者
coody 发表于 2013-3-1 14:37
支持

谢谢支持哈

使用特权

评论回复
5
ballack_linux|  楼主 | 2013-3-1 20:36 | 只看该作者
cz_kangjie 发表于 2013-3-1 16:28
好东西啊

呵呵 没做太多的处理 可以自己加按键和TFT模块

使用特权

评论回复
6
cz_kangjie| | 2013-3-2 11:11 | 只看该作者
ballack_linux 发表于 2013-3-1 20:36
呵呵 没做太多的处理 可以自己加按键和TFT模块

呵呵~~有成品板不?我想买个来玩玩:lol

使用特权

评论回复
7
ballack_linux|  楼主 | 2013-3-2 13:22 | 只看该作者
呵呵 有啊 有一整套的 不过不是我的哈 振南的开发板,也就是znfat的作者, 很强大

使用特权

评论回复
8
王项电子| | 2013-3-3 12:00 | 只看该作者
楼主有没有测试过用STC12C5A60S2的硬件SPI驱动SD卡?我尝试了很多次,都没有搞定、

使用特权

评论回复
9
王项电子| | 2013-3-3 12:01 | 只看该作者
还有,如果在歌曲播放中,拔下耳机插头会导致歌曲停止播放。

使用特权

评论回复
10
znmcu| | 2013-3-3 19:11 | 只看该作者
STC 硬件SPI,驱动SD卡,你可以参考我的 “STC51+SD卡+znFAT+VS1003+麦克风 实现音频录制为WAV文件” 这个实验。这里面用的是硬件SPI。
http://www.znfat.com/bbs/topic.asp?id=158&boardid=44&tb=1
===============================================
你播放过程中拔耳机是因为产生了瞬间的干扰,对VS1003造成了冲击。你可以不使用VS1003的GBUF,而使用GND。

使用特权

评论回复
11
ballack_linux|  楼主 | 2013-3-4 19:29 | 只看该作者
王项电子 发表于 2013-3-3 12:00
楼主有没有测试过用STC12C5A60S2的硬件SPI驱动SD卡?我尝试了很多次,都没有搞定、 ...

呵呵 znfat原作者回答了你的问题哈 你可以去看看

使用特权

评论回复
12
8961| | 2013-3-13 11:09 | 只看该作者
哈哈,确实好东西   顶一个

使用特权

评论回复
13
ballack_linux|  楼主 | 2013-3-13 16:40 | 只看该作者
谢谢哈 之后会更新加TFT彩屏和按键控制的程序

使用特权

评论回复
14
ballack_linux|  楼主 | 2013-3-13 17:27 | 只看该作者
8961 发表于 2013-3-13 11:09
哈哈,确实好东西   顶一个

谢谢哈 之后会更新加TFT彩屏和按键控制的程序

使用特权

评论回复
15
田豆| | 2013-4-11 21:45 | 只看该作者
留个足迹,有空来看。

使用特权

评论回复
16
huangshuai0795| | 2013-4-28 16:16 | 只看该作者
看看VS1003原厂新出的型号VS1005

使用特权

评论回复
17
ballack_linux|  楼主 | 2013-5-23 13:51 | 只看该作者
huangshuai0795 发表于 2013-4-28 16:16
看看VS1003原厂新出的型号VS1005

OK 以后有空买来调试下

使用特权

评论回复
18
coody| | 2013-5-23 16:12 | 只看该作者
王项电子 发表于 2013-3-3 12:00
楼主有没有测试过用STC12C5A60S2的硬件SPI驱动SD卡?我尝试了很多次,都没有搞定、 ...

我用的很正常啊,跑22.1184M,播放320kbps的MP3,流畅,不会卡

使用特权

评论回复
19
sldyanhm| | 2013-5-23 20:27 | 只看该作者
支持一下,呵呵呵~~~~~~~~~~~~~:loveliness:

使用特权

评论回复
20
ballack_linux|  楼主 | 2013-6-6 22:50 | 只看该作者
sldyanhm 发表于 2013-5-23 20:27
支持一下,呵呵呵~~~~~~~~~~~~~

谢谢哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

285

帖子

0

粉丝