⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vs1003.c

📁 sd卡+VS1003模块+M16组成的mp3 VS1003模块使用www.icdev.com.cn的
💻 C
字号:
#include "board.h"
#include "vs1003.h"

#define	mp3InRst()		{PORTB &= ~nRst;}
#define	mp3OutRst()		{PORTB |= nRst;}
#define	mp3InCmd()		{PORTB &= ~nCS;}
#define	mp3OutCmd()	{PORTB |= nCS;}
#define	mp3InData()		{PORTA &= ~nDCS;}
#define	mp3OutData()	{PORTA |= nDCS;}

void DelayIni(void)
{
	TCCR0 = 0x00; //stop
	TCNT0 = 0xE1; //set count
}

void delay_ms(unsigned char ms)
{
	TCCR0 = 0x04; //start timer
	while(ms--)
	{
		while((TIFR & (1<<TOV0)) != (1<<TOV0));
		TIFR |= (1<<TOV0);
		TCNT0 = 0xE1;
	}
	TCCR0 = 0x00; //stop
}

void portIni(void)
{
    DDRA |= nDCS;									//	使能芯片片选输出
	DDRB |= 0x10;									//	ss high
	DDRB |= nCS;									//	使能数据接口片选输出
	DDRB |= nRst;									//	使能硬件复位输出
	PORTB |= nDCS;
	PORTB |= nCS;
	PORTB |= nRst;
	SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
	DDRA &= ~DREQ;
}

unsigned char spiByte(unsigned char data)
{
	unsigned char tmp;
	SPDR = data;
	while( !(SPSR & (1 << SPIF)) );	
	tmp = SPDR;
	return tmp;
}

void spiSend(unsigned char data)
{
	SPDR = data;
	while( !(SPSR & (1 << SPIF)) );	
}

void mp3WriteReg(unsigned char add,unsigned char hByte,unsigned char lByte)
{
	mp3OutData();
	mp3InCmd();
	spiByte(VS_WRITE_COMMAND);
	spiByte(add);
	spiByte(hByte);
	spiByte(lByte);
	mp3OutCmd();
}

unsigned int mp3ReadReg(unsigned char add)
{
	unsigned char lByte,hByte;
	mp3OutData();
	mp3InCmd();
	spiByte(VS_READ_COMMAND);
	spiByte(add);
	hByte = spiByte(0xFF);
	lByte = spiByte(0xFF);
	mp3OutCmd();
	return((unsigned int)(hByte << 8) | lByte);
}

void SoftReset(void)
{
	mp3WriteReg(SPI_MODE,0x08,0x04);		//软件复位
	delay_ms(1);
	while((PINA & DREQ) == 0);				//等待软件复位结束
	mp3WriteReg(SPI_CLOCKF,0x98,0x00);		//设置时钟3倍频
	mp3WriteReg(SPI_AUDATA,0xBB,0x81);		//采样率48k,立体声
	mp3WriteReg(SPI_BASS,0x00,0x55);		//设置重音
	mp3WriteReg(SPI_VOL,20,20);				//设置音量
	delay_ms(1);
	mp3InData();
	spiByte(0);
	spiByte(0);
	spiByte(0);
	spiByte(0);
	mp3OutData();
}

void mp3Reset(void)
{
	mp3InRst();
	delay_ms(1);
	spiByte(0xFF);
	mp3OutCmd();
	mp3OutData();
	mp3OutRst();
	delay_ms(100);
	while((PINA & DREQ) == 0);
	delay_ms(100);
	mp3WriteReg(SPI_VOL,20,20);	
	SoftReset();
}

void mp3SineTest(void)
{
	mp3InRst();
	delay_ms(1);
	spiByte(0xFF);
	mp3OutCmd();
	mp3OutData();
	mp3OutRst();
	delay_ms(100);
	mp3WriteReg(SPI_MODE,0x08,0x20);		//进入测试模式
	while((PINA & DREQ) == 0);
	
	mp3InData();
	spiByte(0x53);
	spiByte(0xEF);
	spiByte(0x6E);
	spiByte(0x24);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);

	mp3InData();
	spiByte(0x45);
	spiByte(0x78);
	spiByte(0x69);
	spiByte(0x74);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);

	mp3InData();
	spiByte(0x53);
	spiByte(0xEF);
	spiByte(0x6E);
	spiByte(0x44);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);
	
	mp3InData();
	spiByte(0x45);
	spiByte(0x78);
	spiByte(0x69);
	spiByte(0x74);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);
}

void mp3Test(unsigned char *data)
{
	unsigned char i;
	
	while((PINA & DREQ) == 0);
	mp3InData();
	for(i = 0; i < 32; i++)
	{
		spiSend(*data++);
	}
	mp3OutData();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -