万马奔腾 发表于 2013-5-13 23:19:39

[email protected] 发表于 2013-5-13 22:17 static/image/common/back.gif
uno需要微调那个97行的delayMicroseconds(35);
因为每个arduino速度有点不一致,所以要更改数字以达到两 ...

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

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

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

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

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

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

}

void play(char* playplay){ //这里有事什么意思啊char* playplay
int val,i;
mp3=SD.open(playplay);
delay(10);
for(i=0;i<548;i++){
    mp3.close();//是否有这个内部函数啊
}

[email protected] 发表于 2013-5-14 08:19:24

万马奔腾 发表于 2013-5-13 23:19 static/image/common/back.gif
首先谢谢你无私的指点,由于是新手非计算机专业,研究程序时有以下几个问题没有看懂,在麻烦指点指点。。 ...

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();
}

[email protected] 发表于 2013-5-15 09:41:27

万马奔腾 发表于 2013-5-14 20:03 static/image/common/back.gif
能否讲解下这个函数
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一样的接线吗?看资料没有找到的

[email protected] 发表于 2013-5-17 21:11:22

万马奔腾 发表于 2013-5-16 22:13 static/image/common/back.gif
用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.每个均设为最大值,可以吗?还是有什么依据

xc145632 发表于 2013-11-26 14:31:15

本帖最后由 xc145632 于 2013-11-26 14:39 编辑

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

edmondhuang 发表于 2013-12-23 16:15:55

vs1003可以驱动小喇叭么?

Mr灬自在 发表于 2016-5-14 10:23:53

为什么只有莎莎的声音,我用的是uno
页: 1 2 3 [4]
查看完整版本: VS1003+SD卡播放MP3文件