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

📄 vs1003.c

📁 mega128+VS1003做的mp3的程序 可以用WINAVR编译
💻 C
字号:
#include <iom64v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#include "vs1003.h"
void vs1003_infor(void);

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

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

void mp3portIni(void)
{
    DDRD |= nDCS;									//	使能芯片片选输出
	DDRD |= nCS;									//	使能数据接口片选输出
	DDRD &= ~DREQ;
	
	PORTD |= nDCS;
	PORTD |= nCS;
	PORTD |= DREQ;
	
	DDRB  = 0xff;									//	使能硬件复位输出
	DDRB  &= ~(1<<3);
	PORTB = 0xff;
	
	SPCR = (1 << SPE) | (1 << MSTR) | (0 << SPR1) | (0 << SPR0);
	SPSR |= 1<<SPI2X;	
}

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)
{
 	while((PIND & DREQ) == 0);		
	mp3OutData();
	mp3InCmd();
	spiByte(VS_WRITE_COMMAND);
	spiByte(add);
	spiByte(hByte);
	spiByte(lByte);
	mp3OutCmd();
}

unsigned int mp3ReadReg(unsigned char add)
{
	unsigned char lByte,hByte;
	while((PIND & DREQ) == 0);		
	mp3OutData();
	mp3InCmd();
	spiByte(VS_READ_COMMAND);
	spiByte(add);
	hByte = spiByte(0xFF);
	lByte = spiByte(0xFF);
	mp3OutCmd();
	return((unsigned int)(hByte << 8) | lByte);
}
void SoftReset(void)
{
 	SPSR &= ~(1<<SPI2X);
	mp3WriteReg(SPI_MODE,0x08,0x04);		//软件复位 
	mp3WriteReg(SPI_CLOCKF,0x58,0x00);		//设置时钟3倍频
	mp3WriteReg(SPI_VOL,0X01,0X01);				//设置音量
	delay_ms(100);
	delay_ms(1);
	mp3InData();
	spiByte(0);
	spiByte(0);
	spiByte(0);
	spiByte(0);
	mp3OutData();
	SPSR |= 1<<SPI2X;
}

void mp3Reset(void)
{
 	SPSR &= ~(1<<SPI2X); 
    mp3OutCmd();
	mp3OutData();
	mp3OutRst();
    delay_ms(250);
	
	mp3InRst();
	delay_ms(250);
	mp3OutRst();
	delay_ms(150);
	
	mp3WriteReg(SPI_MODE,   0x08, 0x00);     /* Normal SW reset + other bits */
	delay_ms(150);
	mp3WriteReg(SPI_CLOCKF, 0x58, 0x00); 	 /* 4.0x 12.288MHz */
	delay_ms(150);
	mp3WriteReg(SPI_VOL,	0x01, 0x01); 	 /* Recording monitor volume */
	delay_ms(150);
	mp3WriteReg(SPI_BASS,	0x00, 0x00);	 /* Bass/treble disabled */
	delay_ms(150);	
	while((PIND & DREQ) == 0);
	delay_ms(250);
	//vs1003_infor();
	SPSR |= 1<<SPI2X;
}
void vs1003_infor(void)
{	
	Print_str("VS1003B_STATUS = 0x");
	Print_int(mp3ReadReg(SPI_STATUS));
	Print_str("\r\n");	
	Print_str("VS1003B_MODE = 0x");
	Print_int(mp3ReadReg(SPI_MODE));
	Print_str("\r\n");	
	Print_str("VS1003B_CLOCKF = 0x");
	Print_int(mp3ReadReg(SPI_CLOCKF));
	Print_str("\r\n");	
	Print_str("VS1003B_VOL = 0x");
	Print_int(mp3ReadReg(SPI_VOL));
	Print_str("\r\n");
	Print_str("VS1003B_BASS = 0x");
	Print_int(mp3ReadReg(SPI_BASS));
	Print_str("\r\n");
	Print_str("VS1003B_SIHDA0 = 0x");
	Print_int(mp3ReadReg(0X08));
	Print_str("\r\n");	
	Print_str("VS1003B_SIHDA1= 0x");
	Print_int(mp3ReadReg(0X09));
	Print_str("\r\n");	
}
void mp3SineTest(void)
{
	mp3InRst();
	delay_ms(1);
	spiByte(0xFF);
	mp3OutCmd();
	mp3OutData();
	mp3OutRst();
	delay_ms(100);
	mp3WriteReg(SPI_MODE,0x08,0x20);		//进入测试模式
	while((PIND & 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);
	
	while((PIND & DREQ) == 0);
	mp3InData();
	spiByte(0x45);
	spiByte(0x78);
	spiByte(0x69);
	spiByte(0x74);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);
	
	while((PIND & DREQ) == 0);
	mp3InData();
	spiByte(0x53);
	spiByte(0xEF);
	spiByte(0x6E);
	spiByte(0x44);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);
	
	while((PIND & DREQ) == 0);
	mp3InData();
	spiByte(0x45);
	spiByte(0x78);
	spiByte(0x69);
	spiByte(0x74);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	spiByte(0x00);
	mp3OutData();
	delay_ms(250);
	delay_ms(250);
	
}
/******************************************************************
record
******************************************************************/
void record_init(void)
{ //mp3WriteReg(SPI_MODE,   0x58, 0x04);     /* Normal SW reset + other bits */

  mp3WriteReg(SPI_BASS, 0x00, 0x00); /* Bass/treble disabled */
  delay_ms(250);
  mp3WriteReg(SPI_CLOCKF, 0x58, 0x00); /* 2.0x 12.288MHz */
  delay_ms(250);
  mp3WriteReg(SPI_AICTRL0, 0x00, 12); /* Div -> 12=8kHz 8=12kHz 6=16kHz */
  delay_ms(250);
  mp3WriteReg(SPI_AICTRL1, 0x00, 0x00); /* Auto gain */
  delay_ms(250);
  mp3WriteReg(SPI_MODE, 0x58, 0x04); /* Normal SW reset + other bits */
  delay_ms(250);
 // vs1003_infor();
}

⌨️ 快捷键说明

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