原创FAT32+移植来的部分驱动代码+拓展驱动代码=51单片机+SD+VS1003录音和MP3功能!!!求
在写这个帖子之前,先给个我之前的帖子的链接:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5095479&bbs_page_no=1&search_mode=4&search_text=Pony279&bbs_id=9999
其实做完那个简单的MP3播放功能之后我就想开发做录音功能了,可惜,我又想学这又想学那的。。。一直没把时间花在这上面,
估计坛子里还没有人用51来搞VS1003录音的吧(貌似搜到有用STM32搞的),我想主要原因是文件系统上的问题了,因为在51上搞文件系统确实比较麻烦,
大侠们都没多少时间花在这上面,也不实际吧。在寒假的时候抽出时间来折腾,把我以前写的文件系统给完善了,实现了文件写的功能,不过也一直没用上,
终于今天搞这个录音用上了,哈哈~
现在的测试代码也比较简单的,先上视频(视频效果不好。。。不会做功放。。。不好意思。。。)
点击此处下载 ourdev_724361OOZZG8.zip(文件大小:5.49M) (原文件名:20120305009.zip)
视频中描述的功能其实是这样的。。。
我先说了一句:Hey ~ man.
然后声音就录下来并写到SD卡上了。
然后就控制VS1003不停的播放刚才录下来的内容(耳机在我摄像的手机旁边,没录到。。。效果不好。。。不要被我富有磁性的声音迷倒了哈./emotion/em122.gif)
测试代码的功能是这样的:
一上电,初始化完成后就进入录音模式,开始录音
然后当我串口发送任意字符时,录音停止,开始不停的回放。(串口发送信息刚才也没录。。。)
然后是代码以及全部资料:
工程代码ourdev_724362BH9BLN.zip(文件大小:117K) (原文件名:STC12-MP3.zip)
VS1003的datasheet以及一个中文资料ourdev_724363LSTFXS.zip(文件大小:1.87M) (原文件名:IC.zip)
VS1003和SD模块的电路图,其实是买的模块,电路图我自己也没仔细看 ourdev_724364VRR07A.zip(文件大小:296K) (原文件名:sch.zip)
至于电路连接,在程序的SD模块和VS1003模块相应的.c文件里写的很清楚了,我帖上来:
VS1003模块:
sbit VS_SO=P1^6; //串行数据输出,单片机从VS1003中读取数据
sbit VS_SI= P1^5; //串行数据输入,由单片机写入到VS1003
sbit VS_SCK=P1^7; //串行时钟,由单片机产生
sbit VS_XCS = P1^0; //片选信号
sbit VS_XRESET = P1^1; //复位信号
sbit VS_XDCS= P1^2; //数据片选
sbit VS_DREQ= P1^3; //数据请求
SD模块:
//管脚定义
sbit SD_CS=P1^4;
//{ 硬件SPI管脚
sbit clk= P1^7;
sbit miso = P1^6;
sbit mosi = P1^5;
//} 硬件SPI管脚 //如果改了这些,SPI_ReadWriteByte也得改了。。。
再来张图好了,硬件上只有最小系统和一个STC自动下载辅助工具是我自己做的,有兴趣的也可以搜我以前的帖子,帮我提高下我的淫气我是不会介意的~
http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_724366XMECHO.jpg
(原文件名:20120305572.jpg)
为了节省时间,所以测试代码写得比较简陋,欢迎拍砖或鉴赏或围观~
呵呵,想换条裤子,不知这个帖子分量够不? 忘了说了,
MCU是STC12C5A60S2,
晶振24M 编译警告可忽略:
本来我是想用来做不透明指针的,C51编译器貌似不好这口,给了我个警告。。。
..\VS1003\VS1003.C(327): warning C230: 'File': uses undefined struct/union tag 'FileInfo'
编译成功需要配置:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5090488&bbs_page_no=1&search_mode=3&search_text=Pony279&bbs_id=9999
(见4楼) 顶 顶 感谢分享 谢谢分享!!!! 不错,标记一下 我本来是想做同步显示歌词(这个在有字库支持的12864上做难度好像不大。。。)+fft的
不过根据我以前的测试,FFT估计不行了,就算晶振提到30M,好像也还是有难度,
同步显示歌词应该可以,如果显示器本来就有字库支持的话,就已经没有什么技术难度了
这个代码以后怎么拓展,现在也还不太想写,我对界面什么的并不太感兴趣,虽然良好的界面是非常重要的。。。 谢谢楼主分享。 沉了,,,自己顶起来{:lol:} 谢谢楼主分享。 楼主 如果可以了能把资料打包一下发一个给我吗最近我也正在做这个344380278@qq.com 求楼主的联系方式 我遇到不懂的地方希望可以得到你的帮助哈哈 谢谢啦楼主如果可以了话 加我Q可以吗
cclylj 发表于 2012-3-25 16:11 static/image/common/back.gif
求楼主的联系方式 我遇到不懂的地方希望可以得到你的帮助哈哈 谢谢啦楼主如果可以了话 加我Q可以吗
有问题直接在这里问就行了,
我有空都会在论坛里逛的,
没空的话,QQ也帮不了你啊,
至于资料,,,上面的不够吗?你还需要哪些? 3q{:biggrin:}{:lol:}{:shy:}{:titter:}{:loveliness:} 谢谢楼主分享啊,最近我也要搞 最近正在搞这些 学习了 楼主你好~ 我遇到点问题想请教一下,我的在调试的时候 串口输出这些信息,:
串口通信测试....
VS1003已初始化....
CH375芯片初始化成功
请插入U盘
U盘初始化失败
当前存储设备:U盘
文件系统已初始化....
VS1003 Sin 测试
我的U盘里面了一首歌,我把压缩到了56kbps ,可是就是不播放;我把我主函数贴给你看我看看,
#include "reg51.h"
#include "ch375.h"
#include "fat.h"
#include "uart.h"
#include "vs1003.h"
struct FAT32_Init_Arg Init_Arg_UDISK; //初始化参数结构体实体
struct FAT32_Init_Arg *pArg;
struct FileInfoStruct FileInfo; //文件信息结构体实体
unsigned char Dev_No=0; //设备号,这是FAT的外部变量,用来标记存储设备的类型
void main()
{
unsigned char item=0;
UART_Init();
UART_Send_Str("串口通信测试....\n");
VS_Reset();
UART_Send_Str("VS1003已初始化....\n");
if(!CH375_Init())
UART_Send_Str("CH375芯片初始化成功\n");
else
UART_Send_Str("CH375芯片初始化失败\n");
UART_Send_Str("请插入U盘\n");
if(!CH375_InitDisk())
UART_Send_Str("U盘初始化成功\n");
else
UART_Send_Str("U盘初始化失败\n");
pArg=&Init_Arg_UDISK;
Dev_No=UDISK;
UART_Send_Str("当前存储设备:U盘\n");
FAT32_Init();
UART_Send_Str("文件系统已初始化....\n");
VS_sin_test(200);
UART_Send_Str("VS1003 Sin 测试\n");
while(!FAT32_Open_File(&FileInfo,"\\*.mp3",item++)) //依次播放U盘根目录下的所有MP3文件,有利于znFAT的文件枚举功能
{
UART_Send_Str("打开文件成功\n");
UART_Send_Str("文件名为:");UART_Send_Str(FileInfo.FileName);
UART_Send_Enter();
UART_Put_Inf("文件大小(字节):",FileInfo.FileSize);
UART_Put_Inf("文件当前偏移量(字节):",FileInfo.FileCurOffset);
UART_Send_Str("开始读取文件到VS1003进行解码播放\n");
VS_XDCS=0; //打开数据片选,此时可以送入音频数据
FAT32_Read_FileX(&FileInfo,0,FileInfo.FileSize,VS_Send_Dat);
VS_XDCS=1;
VS_Flush_Buffer();
UART_Send_Str("音频播放结束\n");
}
UART_Send_Str("所有音频文件播放完毕\n");
while(1);
} tianyu1989 发表于 2012-3-28 22:49 static/image/common/back.gif
楼主你好~ 我遇到点问题想请教一下,我的在调试的时候 串口输出这些信息,:
串口通信测试....
VS1003已初 ...
"U盘初始化失败"
你应该先解决这个问题, Pony279 发表于 2012-3-28 23:02 static/image/common/back.gif
"U盘初始化失败"
你应该先解决这个问题,
哦,不好意思,贴错了,有U盘初始化成功的
串口通信测试....
VS1003已初始化....
CH375芯片初始化成功
请插入U盘
U盘初始化成功
当前存储设备:U盘
文件系统已初始化....
VS1003 Sin 测试
打开文件成功
文件名为:01.MP3
文件大小(字节):449538
文件当前偏移量(字节):0
开始读取文件到VS1003进行解码播放
不过是非常的卡 根本听不起来我的晶振是22.1184 请问 楼主是MP3文件问题 还是其他什么问题
tianyu1989 发表于 2012-3-28 23:24 static/image/common/back.gif
请问 楼主是MP3文件问题 还是其他什么问题
主要应该是驱动程序的问题,
我用的是SD卡,STC12C5A单片机自带硬件SPI,320Kbps都可以
至于CH375的驱动速度,我没玩过,不清楚 mark....... 一直想做一个这样子的mp3,但是囊中羞涩,等有机会在做那个模块,先收藏 mark............. enovo2468 发表于 2012-4-2 17:02 static/image/common/back.gif
mark.............
---------------------------------------------------------------------------------------------------------------------------
哈哈,谢谢你帮我顶帖,不过,喜欢的话收藏即可,不必mark了,看论坛的相关规定~
---------------------------------------------------------------------------------------------------------------------------
关于这个文件系统,过段时间我打算移植到STM32上,用C++继续发展了,
在51上折腾这个太辛苦了,不过也造就了这个文件系统的内存占用小,功能还行,速度也不慢的优点,呵呵,我又开始自夸了。。。 哦,知道了 不错不错,学习下 赞!赞!赞!赞!赞!赞!赞!赞!赞! 不错,只能有空在试试 楼主请问:①晶振必须用24M的嘛?stc12c5a60s2已经是1T的单片机了,还有用24M晶振的必要吗?
②还有用24M晶振这个能流畅播放的最大的码率是多大呢?想想了解一下再决定是不是用这款单片机!谢谢!
③如你所述,用51单片机做这个mp3有什么难度吗?毕竟用stm32也得写SD卡的底层驱动啊!难道还有什么其他难度吗?说一下哈!多谢!
问题有点多,请楼主帮忙解答,万分感谢,敬礼{:3_60:} meirenai 发表于 2012-4-7 19:44 static/image/common/back.gif
楼主请问:①晶振必须用24M的嘛?stc12c5a60s2已经是1T的单片机了,还有用24M晶振的必要吗?
② ...
"①晶振必须用24M的嘛?stc12c5a60s2已经是1T的单片机了,还有用24M晶振的必要吗?"
呵呵,你可以试试12M的,我用惯了24M的,没试过12M的,只是说明一下。
“ ②还有用24M晶振这个能流畅播放的最大的码率是多大呢?想想了解一下再决定是不是用这款单片机!谢谢!”
320kbps没问题。12M估计也可以达到这种程度(有网有用24M,软件SPI驱动VS1003播放320kbps码率的,硬件SPI比软件SPI快,所以我才这么说)。
但是就我这份代码,我为了程序的模块化,而牺牲了点驱动1003的效率,所以可能在12M下无法流畅播放320kbps的,我没试过。
“③如你所述,用51单片机做这个mp3有什么难度吗?毕竟用stm32也得写SD卡的底层驱动啊!难道还有什么其他难度吗?说一下哈!多谢!”
驱动,文件系统都自己写的话,确实有难度。
耗的是时间,不是什么高智商的问题。
Pony279 发表于 2012-4-7 19:51 static/image/common/back.gif
"①晶振必须用24M的嘛?stc12c5a60s2已经是1T的单片机了,还有用24M晶振的必要吗?"
呵呵,你可以试试12 ...
直接移植现成的文件系统可以实现吗?只编写底层驱动剩下的交给现成的文件系统 本帖最后由 Pony279 于 2012-4-7 20:39 编辑
meirenai 发表于 2012-4-7 20:10 static/image/common/back.gif
直接移植现成的文件系统可以实现吗?只编写底层驱动剩下的交给现成的文件系统 ...
可以的,但是你编写的驱动的接口函数要和文件系统要求的驱动函数相吻合,
就拿我的文件系统来说,需要写扇区和读扇区函数。
这个是我的文件系统头文件里的一段代码,
#ifdef FAT_FS_C //这个宏定义用来,防止命名冲突,只供文件系统内部使用
#include "MMC_SD.h"
//失败了都要返回非0值
#define ReadSector(sector_address, buffer) SD_ReadSingleBlock(sector_address, buffer)
#define WriteSector(sector_address, buffer) SD_WriteSingleBlock(sector_address, buffer)
#endif Pony279 发表于 2012-4-7 20:34 static/image/common/back.gif
可以的,但是你编写的驱动的接口函数要和文件系统要求的驱动函数相吻合,
就拿我的文件系统来说,需要写 ...
恩 多谢 目前抓紧画板,加快进度!!!心里有谱就快多了
楼主新作啊,呵呵,顶一个,系统文在51也能实现,强。看来系统移植也不是问题了。 liuhengpeng123 发表于 2012-4-8 09:08 static/image/common/back.gif
楼主新作啊,呵呵,顶一个,系统文在51也能实现,强。看来系统移植也不是问题了。 ...
以前和同学要代码的时候,他没告诉我有现成的代码可以抄
那时又不会上网搜索,就自己硬着头皮干了。。。
Pony279 发表于 2012-4-8 09:46 static/image/common/back.gif
以前和同学要代码的时候,他没告诉我有现成的代码可以抄
那时又不会上网搜索,就自己硬着头皮干了。。。
...
呵呵,我大二时候我也是有你之前一样的想法,先问学长现成的代码抄抄,自己下载就行了,后来发现这样根本就不是自己的东西,不是自己的思想。只是一直模仿着,后来我也纠结了很久,还好,去公司实习给了一个很好的学习环境和实践环境。以前没有学好51就想买2440的板子,后面多上网了才无意中看到了阿莫论坛,看看后才知道stm32才是自己想要的,现在才开始学习M3.呵呵,以后多多交流呀。 本帖最后由 meirenai 于 2012-4-9 17:22 编辑
Pony279 发表于 2012-4-8 09:46 static/image/common/back.gif
以前和同学要代码的时候,他没告诉我有现成的代码可以抄
那时又不会上网搜索,就自己硬着头皮干了。。。
...
楼主怎么解决的电平转换问题啊!stc12c5a60s2是5v的单片机啊!而vs1003是3.3v的,信号线可以直接接到5v上面吗?还是需要转换啊!用这个真麻烦,这款单片机没有3.3V的型号啊! meirenai 发表于 2012-4-9 17:19 static/image/common/back.gif
楼主怎么解决的电平转换问题啊!stc12c5a60s2是5v的单片机啊!而vs1003是3.3v的,信号线可以直接接到5v上 ...
我的是单片机直接连模块的,没出问题,
STC12LE单片机好像是3.3V的,
你也可以把单片机的IO设置为开漏,3.3V上拉。 Pony279 发表于 2012-4-9 18:18 static/image/common/back.gif
我的是单片机直接连模块的,没出问题,
STC12LE单片机好像是3.3V的,
你也可以把单片机的IO设置为开漏,3 ...
奥多谢 赞啊!赞啊!赞啊!赞啊!赞啊!赞啊! 本帖最后由 519382868 于 2012-5-5 20:52 编辑
不错!不错!值得学习学习。楼主你好可以发这个资料我吗?因为论坛这几天都下不了东西,谢谢!519382868@qq.com 楼主 如果可以了能把资料打包一下发一个给我吗最近我也正在學習SD
trucy2010@163.com. 不错,学习了 顶一下!!!! 谢谢楼主{:lol:} tianyu1989 发表于 2012-3-28 23:24 static/image/common/back.gif
请问 楼主是MP3文件问题 还是其他什么问题
我用的是LPC2131的IC,晶振是11.0592的,什么MP3都没有问题。数据从U盘读到单片机,再从单片机送到1003.那现在就有两个问题
1.CH375的时序没有优化好,在读数据的时候用了大量时间,使数据在流动时用了太多时间,播时卡。
2.1003的数据空的脚没有判断好,无法确定是不是要向VS1003写入数据。
不错。。。我也刚用msp430做了一个 楼主能否给个vs1003录音文件?谢谢你,likang0110@163.com {:lol:}{:lol:}{:lol:}{:lol:}{:lol:} 楼主,太给力了 Mark一下。 l楼主,太给力了啊 本帖最后由 bbssilverkey 于 2013-5-1 10:14 编辑
Pony279 发表于 2012-3-5 23:10 static/image/common/back.gif
忘了说了,
MCU是STC12C5A60S2,
晶振24M
前辈,我请教下,为何:fat_fs init failed!
完整信息是:
DATE :Apr 30 2013 TIME :16:59:34
SD init success!
fat_fs init failed!
我配置
MCU- STC12A5C60S2
SD- SCANDISK 2G 格式化成FAT
其他没东西 支持下! 多谢分享! 加了MP3解码芯片的说 这样整个系统就简化许多了 mark……
顶一个… 您好,楼主!把SD卡格式成FAT16或FAT32,写程序怎么知道支持哪种呢? 顶一个 学习 楼主好人啊!正在研究相关东西…… 请问正弦测试有什么效果,大神。我也正写vs1003 强帖。顶一下! 1翻看了你的帖子,怎么说呢,你碰到问题都是自己一步步解决的,而我,有些问题一时解决不了..然后不了了之了,
2感觉你懂的很多啊,小小的51也玩出这么多的花样
3最后,感觉你的代码很规范 很不错,很有层次感,我也想学着弄,有一些建议么 楼主你好。直接把VS1003模块替换为VS1053,晶振11.0592MHz。其他不变。录音时候发现程序停止在
while (recording_on != 0)
{
do {
w = VS_ReadReg(SCI_HDAT1);
} while (w < 256 || w >= 896); /* wait until 512 bytes available */
参考了正点原子STM32的代码,发现VS_ReadReg里面对SPI做了降速处理。
按照其方法进行修改,还是停止在上面的地方。请问调试时是否遇到过该问题。
还请楼主多指点……多谢!!! 顶 谢谢楼主分享 顶楼主{:biggrin:} 谢谢分享。 thanks for shring heimareed 发表于 2013-10-28 00:34
楼主你好。直接把VS1003模块替换为VS1053,晶振11.0592MHz。其他不变。录音时候发现程序停止在
while (reco ...
哥们啊,解决了吗?我也遇到同样问题。求指教! heyangfengyue 发表于 2014-5-19 21:43
哥们啊,解决了吗?我也遇到同样问题。求指教!
后来换平台了,因为要嵌入别的功能,就没用51片子调试了。也记不清最后弄好没有。反正现在STM32F103RB上面跑,功能正常。 多謝分享,讚一個 我之前做的好像只能FATFS 这个不错 可以FAT32 Pony279 发表于 2012-3-5 23:10
忘了说了,
MCU是STC12C5A60S2,
晶振24M
请问你MP3的c文件中 while (w < 256 || w >= 896);这个判断是怎么得出来的,大神,求解。谢谢。 mark!{:lol:} Mark
页:
[1]