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