极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

VS1003+SD卡播放MP3文件

[复制链接]
发表于 2013-5-13 23:19:39 | 显示全部楼层
[email protected] 发表于 2013-5-13 22:17
uno需要微调那个97行的delayMicroseconds(35);
因为每个arduino速度有点不一致,所以要更改数字以达到两 ...

首先谢谢你无私的指点,由于是新手非计算机专业,研究程序时有以下几个问题没有看懂,在麻烦指点指点。。。。无限感激!!
  1. //for sd test  
  2. File root;              //这里File是数据类型吗,没有找到相关这是

  3. char* playlist[]={/ /这是指针数组吗,表示什么意思啊,而且后面好像没有用到这个数组啊
  4. };

  5. File mp3;    //这里File是数据类型吗,mp3是文件名吗?

  6. Mp3Reset();  //这里是调用一个子函数吧

  7.   root = SD.open("/");//SD.open("/")是什么意思,看了SD库还是没有看懂
  8.   printDirectory(root, 0);
  9.   Serial.print("Totally ");
  10.   Serial.print(fileNumber);
  11.   Serial.print(" file(s)"); //" file(s)"这表示什么意思啊
  12.   Serial.println();
  13. }

  14. void loop(){
  15.    play("s1.mp3"); //这里好像S1这首歌没有播放,直接从S2开始的啊
  16.   play("s2.mp3");

  17. }

  18. void play(char* playplay){ //这里有事什么意思啊char* playplay
  19.   int val,i;
  20.   mp3=SD.open(playplay);
  21.   delay(10);
  22.   for(i=0;i<548;i++){
  23.     mp3.close();  //是否有这个内部函数啊
  24. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-14 08:19:24 | 显示全部楼层
万马奔腾 发表于 2013-5-13 23:19
首先谢谢你无私的指点,由于是新手非计算机专业,研究程序时有以下几个问题没有看懂,在麻烦指点指点。。 ...

file 本身是来源于c++的概念 就是一种object 一开始 那个root是用来生成文件目录 后来MP3的那个是用来播放文件
char* 这个数组一开始想要自动读取歌曲名称的,但是后来未完成
102行开始有Mp3Reset();的函数定义
SD.open("/");这是打开根目录的意思
Serial.print(" file(s)"); 没什么意义 只是打印到串口给你看一下
s1没有播放 可能是文件有所不支持 这个要看 vs1003的芯片资料
playplay只是我随便起的变量名,不用在意的
mp3.close();是指关闭前面的file

回复 支持 反对

使用道具 举报

发表于 2013-5-14 20:03:26 | 显示全部楼层
能否讲解下这个函数
void play(char* playplay){
  int val,i;
  mp3=SD.open(playplay);
  delay(10);
  for(i=0;i<548;i++){                    //这个循环起什么作用啊 548代表什么,为什么是548
    digitalWrite(sspin,HIGH);          //sspin脚H,是不是片选了SD卡模块
    val =mp3.read();                      // 是不是从打开的MP3文件一个字节一个字节的赋值给变量val
    digitalWrite(xDcs,LOW);           //xDcs为LOW时,是不是片选VS1003
    SPI.transfer(val);                      // 这句是不是将VAL的值送给VS1003
    digitalWrite(xDcs,HIGH);            // 这句是不是将VAL的值送给VS1003
    digitalWrite(sspin,LOW);
  }
  if(DREQ==HIGH){                      //这段函数起什么作用
    while(mp3.available()){
      for(i=0;i<32;i++){                 //32是怎么来的
        digitalWrite(sspin,HIGH);      
        val =mp3.read();
        digitalWrite(xDcs,LOW);
        SPI.transfer(val);
        digitalWrite(xDcs,HIGH);
        digitalWrite(sspin,LOW);
      }
      delayMicroseconds(35);
    }
  }
  mp3.close();
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-15 09:41:27 | 显示全部楼层
万马奔腾 发表于 2013-5-14 20:03
能否讲解下这个函数
void play(char* playplay){
  int val,i;

第一段for函数是进行MP3的初始输入。548是考虑到文件输入速度,文件处理速度,以及存储空间(vs1003内建了512字节的存储空间)的出的经验值。 就是说当装载512字节后, 前面的部分已经被处理了。于是干脆直接输入更多的字节。
第二段if函数是将剩余的MP3输入用的。根据vs1003的芯片文档,当DREQ的引脚呗拉高时,说明至少有32字节的空余空间了。以此为依据开始进行文件的继续输入。在MP3没播完的情况下,持续输入。delayMicroseconds(35);是卡一个正好处理完32字节的timing。这样不会跳出。。
回复 支持 反对

使用道具 举报

发表于 2013-5-16 22:13:26 | 显示全部楼层
用NANO怎么接线呢,与UNO一样的接线吗?看资料没有找到的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-17 21:11:22 | 显示全部楼层
万马奔腾 发表于 2013-5-16 22:13
用NANO怎么接线呢,与UNO一样的接线吗?看资料没有找到的

你主要查询一下 nano的spi是如何连接的就行
其他的线随意接
回复 支持 反对

使用道具 举报

发表于 2013-5-28 18:01:47 | 显示全部楼层
commad(0X0B,volume,volume);//音量最高0x0000音量最低0xFEFE
这句是不是将值为OX3030 赋给 对应的寄存器啊 (int volume=0x30;//set volume here )
回复 支持 反对

使用道具 举报

发表于 2013-6-1 21:00:34 | 显示全部楼层
SPI.setClockDivider(SPI_CLOCK_DIV16);
commad(0X03,0XC0,0X00);//设置VS1003的时钟
设置SPI串行通信时钟和时钟VS1003的时钟有什么联系 如果都设置高有什么影响 比较SPI-CLOCK-DIV128 和VS1003的时钟设置0XFFFF 有什么影响?
主要问题:
1.SPI串行时钟和VS1003时钟有联系吗?之间是什么关系
2.每个均设为最大值,可以吗?还是有什么依据
回复 支持 反对

使用道具 举报

发表于 2013-11-26 14:31:15 | 显示全部楼层
本帖最后由 xc145632 于 2013-11-26 14:39 编辑

為什麼我照上面的用完之後都沒有聲音(我用的是ARDUINO+vs1003+sd卡)

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-12-23 16:15:55 | 显示全部楼层
vs1003可以驱动小喇叭么?
回复 支持 反对

使用道具 举报

发表于 2016-5-14 10:23:53 | 显示全部楼层
为什么只有莎莎的声音,我用的是uno

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-3 14:01 , Processed in 0.042298 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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