📄 vs1003.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 + -