【Espruino】NO.16 使用VS1003播放音乐

http://blog.csdn.net/qwert1213131/article/details/37512497

本文属于个人理解,能力有限,纰漏在所难免,还望指正!

【小鱼有点电】

【Espruino中文社区】

想当年mp3正起步的时候,好几百的软妹币买的mp3播放器连个屏幕都没有,简直就是享受啊,现在这东西满大街都是,倒是不稀罕了,但是自己做个mp3玩玩应该还是比较有乐趣的吧。本文引用的VS1003是一个多功能的MP3和WMA解码芯片,它来自芬兰VLSI半导体公司,功能强大但价格便宜,并且简单易用,非常符合DIYer的口味。使用SPI接口协议,附上器数据手册一份点击打开链接,因此我们只需要将Espruino板上具有SPI功能的引脚与VS1003连接上即可.目前只能解码32kbps之内的mp3文件,码率高的会卡额,转换方式可以用千千静听搞定或者百度额。

附上视频地址:点击打开链接

/*vs1003引脚定义*/
var pin_MISO = B4;
var pin_MOSI = B5;
var pin_CLK = B3;
var pin_CS = C12;
var pin_DCS = A8;
var pin_RST = C11;
var pin_DREQ = C10;
/* VS1003B(音频解码芯片) 命令 */
/*写操作  | 命令   |   地址   |   数据  |
          |  02H   |   0xH    |  xxxxH  | */
var VS_WRITE_COMMAND = 0x02;

/*读操作  | 命令   |   地址   |   数据  |
          |  03H   |   0xH    |  xxxxH  | */
var VS_READ_COMMAND =	0x03;

var SPI_MODE				=0x00;  //模式控制
var SPI_STATUS			=0x01;  //VS10XX的状态寄存器
var SPI_BASS				=0x02;  //高低音控制
var SPI_CLOCKF  		=0x03;  //时钟频率倍乘寄存器
var SPI_DECODE_TIME =0x04;  //解码时间长度
var SPI_AUDATA     	=0x05;  //各种音频数据
var SPI_WRAM      	=0x06;  //RAM 写/读
var SPI_WRAMADDR  	=0x07;  //RAM 写/读的起始地址
var SPI_HDAT0     	=0x08;  //流数据标头0
var SPI_HDAT1     	=0x09;  //流数据标头1
var SPI_AIADDR    	=0x0a;  //应用程序的起始地址
var SPI_VOL      		=0x0b;  //音量控制
var SPI_AICTRL0  		=0x0c;  //应用程序控制寄存器0
var SPI_AICTRL1  		=0x0d;  //应用程序控制寄存器1
var SPI_AICTRL2  		=0x0e;  //应用程序控制寄存器2
var SPI_AICTRL3  		=0x0f;  //应用程序控制寄存器3

function delay(x) //delay x ms
{
	var time0 = getTime();
	var time1 = 0;
	while(1)
	{
		time1 = getTime();
		if((time1-time0)*1000>=x)
			break;
	}
}
function VS10XX_Init(){
  SPI1.setup({ sck:pin_CLK, mosi:pin_MOSI, miso: pin_MISO,order: "msb", baud: 1000000 ,mode:0});
	//reset vs1003
	digitalWrite(pin_RST,HIGH);
	delay(100);
	digitalWrite(pin_RST,LOW);
	delay(100);
	digitalWrite(pin_RST,HIGH);

	digitalWrite(pin_CS,HIGH);
	digitalWrite(pin_DCS,HIGH);
	while(!digitalRead(pin_DREQ));

	SPI1.send(0xff,pin_CS);//启动传输

	var VS10XX_ID=VS10XX_ReadReg(SPI_STATUS);//读取状态寄存器
	VS10XX_ID>>=4;//得到VS10XX的芯片信号 

  if(VS10XX_ID==VS1053)
  {
		VS10XX_WriteReg(SPI_MODE,0x0816);//软件复位,新模式
	}
  else
  {
		VS10XX_WriteReg(SPI_MODE,0x0804);//软件复位,新模式
  }
	while(!digitalRead(pin_DREQ));

  VS10XX_WriteReg(SPI_CLOCKF,0x9800);//设置VS10XX的时钟,3.5倍频 ,2xADD
  VS10XX_WriteReg(SPI_AUDATA,0xbb81);// 采样率48k,立体声
  VS10XX_WriteReg(SPI_BASS,0x00f6);// 设置重低音,0x00F6对60HZ以下的音频信号进行15dB的增强,0x7A00对10KHZ以上的信号进行10.5dB的增强
  VS10XX_WriteReg(SPI_VOL,0x4040);// VS10XX 音量

	while(!digitalRead(pin_DREQ));
	SPI1.setup({ sck:pin_CLK, mosi:pin_MOSI, miso: pin_MISO,order: "msb", baud: 16000000 ,mode:0});

}

function VS10XX_WriteReg( addr, data){
        digitalWrite(pin_DCS,HIGH);//关闭数据片选
        digitalWrite(pin_CS,LOW);//打开片选,可对功能寄存器读写 

        SPI1.send(VS_WRITE_COMMAND);//写入操作码0x02
        SPI1.send(addr);//写入寄存器地址
        SPI1.send(data>>8);//写入高字节
        SPI1.send(data&0xff);//写入低字节

        digitalWrite(pin_CS,HIGH);
}

function VS10XX_ReadReg( addr)
{
        var temp = 0;
        digitalWrite(pin_DCS,HIGH);//关闭数据片选
        digitalWrite(pin_CS,LOW);//打开片选,可对功能寄存器读写 

        SPI1.send(VS_READ_COMMAND);//写入操作码0x02
        SPI1.send(addr);//写入寄存器地址
        temp = (SPI1.send(0xa5)<<8);//读取高字节
        temp |= SPI1.send(0xa5);//读取低字节

        digitalWrite(pin_CS,HIGH);
        return temp;
}

/******************************************************************
向VS1003写入2048个0,用于清空VS1003的数据缓冲区注:在播放完一个完整
的音频(如一首完整的MP3)后,调用此函数,清空VS1003数据缓冲区,为下
面的音频数据(如下一首MP3)作准备。
 ******************************************************************/
function VS_Flush_Buffer()
{
        var i = 0;
        var j = 0;
        digitalWrite(pin_DCS,LOW); //打开数据片选
        while(i<2048)
        {
               if ( digitalRead(pin_DREQ) !== 0 )
                {
                        for ( j=0; j<32; j++ )
                        {
                                SPI1.send( 0 );
                                i++;
                        }
                }
        }
        digitalWrite(pin_DCS,HIGH);
}

var file=["0:/1.mp3","0:/2.mp3","0:/3.mp3","0:/32.mp3"];

var button=0;//控制歌曲的结束
//播放名为filename的文件
function play(filename){

  var fd = E.openFile(filename,'r') ;
	var i=0,j=0;
  var data="",xx="";
	digitalWrite(pin_DCS,LOW);
	while(1)
	{
      data=fd.read(512);

      for(j=0;j<16;j++)
      {
          xx=data.slice(j*32,(1+j)*32);
          digitalWrite([LED1,LED2,LED3],xx[0]);
          while(digitalRead(pin_DREQ) !== 1);
          SPI1.send(xx);
          if(xx.length<32)
            return;
	        if(digitalRead(BTN1)==1)
	        {
	          button=0;
	          digitalWrite(pin_DCS,HIGH);
	          VS_Flush_Buffer();
	          fd.close();
	          return;
	        }

      }
	}
	digitalWrite(pin_DCS,HIGH);
	VS_Flush_Buffer();
	fd.close();
}
//播放卡里的音乐
function xxplay()
{
	var cnt=0;
	while(1)
	{
	  for(cnt=0;cnt<4;cnt++)
	  {
	    play(file[cnt]);
	  }
	}
}

VS10XX_Init();

//加入10ms去抖,按下按键BTN2开始播放
var l=0;
function start() {
  l = !l;
  digitalWrite(LED1,l);
  xxplay();
}

setWatch(start,C5,{repeat:true,edge:'rising',debounce:10});
save();

【Espruino】NO.16 使用VS1003播放音乐

时间: 2024-10-12 09:26:32

【Espruino】NO.16 使用VS1003播放音乐的相关文章

播放音乐案例

播放音乐案例 分析: 和上一篇文章的结构是一样的,只不过我们需要在这里里面加上播放音乐的一些操作: 其实也就是调用系统的播放音乐的API而已,写在服务里面就好, //媒体播放器 private MediaPlayer player; 1 public void onCreate() { 2 File file=new File(Environment.getExternalStorageDirectory(),"a.mp3"); 3 player =new MediaPlayer();

使用 AVAudioSession 实现后台播放音乐

1. 前言 AVAudioSession是一个单例,无需实例化即可直接使用.AVAudioSession在各种音频环境中起着非常重要的作用 针对不同的音频应用场景,需要设置不同的音频会话分类 1.1 ?AVAudioSession的类别 AVAudioSessionCategoryAmbient –混音播放,例如雨声.汽车引擎等,可与其他音乐一起播放 AVAudioSessionCategorySoloAmbient –后台播放,其他音乐将被停止 AVAudioSessionCategoryPl

音乐平台项目的几个问题总结(头像裁剪以及跨页面播放音乐)

关于头像裁剪 1.上传图片的裁剪,并没有采用后端裁剪,而采用前端裁剪,基于cropbox进行了修改 编码使用一个隐藏的input框存放 存放到数据库 2.本来想在后端解析base64编码重新生成文件,后来发现并没有必要,如果图片不是很大直接保存字符串到数据库就行了,这样还可以少一些http请求,不过缺点是Ie6不支持date:url的解析 3.图片变成base64编码之后,保存在数据库的字符长度高达16W 个字符,后来想办法改成jpeg+中等保存之后,长度变成3W,可以接受 下面从代码说起 界面

MFC下MCI的使用播放音乐

最近研究了一下MFC下的音乐的播放,主要使用了MCI 1.需要包含的库文件 在链接资源里(link)添加库文件VFW32.lib winmm.lib 2.包含的头文件 1 #include <mmsystem.h> 2 3 #include "stdafx.h" 4 5 #include "vfw.h" 6 7 #include <digitalv.h> 8 9 #pragma comment(lib,"winmm.lib"

pcDuino-V2利用madplay播放音乐

在pcDuino的UBUNTU系统下,打开控制台,利用apt-get来下载madplay软件. sudo apt-get install madplay 播放音乐: madplay xxx.mp3 xxx是mp3的文件名. 但是在播放MP3音乐的时候总是提示: error: frame 0:lost synchornization 虽然有声音输出,但是声音不对.好像是被放慢了一半的速度,而且还有噪音. 我个人觉得是解码的问题.在网上找了好多资料也没有解决.如果有哪位朋友解决了还希望能给我说一下解

利用html5实现类似微信的手机摇一摇功能,并播放音乐,并且解决中文乱码的问题。

转载了@三井学长:http://blog.csdn.net/david1030/article/details/8229008 转载了@Hello Csn楠!:http://www.cnblogs.com/csn0721/ 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. 不多说直接上代码, Javas

第二章 LCD液晶显示屏&amp;声控装置&amp;播放音乐&amp;遥控器

这节我将带大家了解亮宁机器人编程的基础部分. LCD液晶显示屏 LCD液晶显示屏是在实现某种功能和调试中不可缺少的部分,接下来我带大家学习,如何使用LCD液晶显示屏. 首先我们把LCD液晶显示屏插入主板的指定接口,然后接上数据线,打开Arduino输入以下程序. 代码:1-1 lcd液晶显示器 #include <LNDZ.h> lc lcd; //声明一个lcd设备 void init() { lcd.begin(16, 2);//告诉电脑当前显示器是一行16个字符,2行的规格 lcd.bg

在Linux终端命令行下播放音乐的命令(Ubuntu)

现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小软件,然后通过命令行来使用这个软件播放音乐,感觉还是很不错滴. 这个软件的名字叫:SOX,支持很多格式的音频文件,如 WAV,MP3,MPG,OGG,FLAC 等等.满足我们日常使用是足够足够的了. 好了,首先,第一步我们需要把它安装到我们的系统里. 1.打开一个终端(Ctrl+Alt+T),然后输

UI小项目之拳皇动画的实现(抽取加载图片和播放音乐的方法)

实现思路 1.加载图片 2.播放音乐 实现思想 1.封装思想 抽取相同代码生成一个新的方法,通过传递参数调用该方法: 2.内存管理思想 不需要每次调用方法时都重新加载图片,for循环加载图片写在ViewdidLoad中 下列代码没有对运行过程中内存管理进行优化 其中加载图片有两种方法: 通过imageNmae加载有缓存 通过imageWithContentsOfFile加载无缓存 有无缓存的区别: 有缓存,使用时不需要重新加载 无缓存,使用时才加载 #import "ViewController