📄 vs1003.c~
字号:
//-------------------------------------------------------------------------
//FileName : vs1003.c
//Created by : ZhengYanbo
//Version : v1.0
//Last Modified: 2007.5.20
//Fuction : low-level operations of vs1003
//Comments : vs1003 driver
//2007.5.20
//Now the spi speed goes upto 4MHz:)
//--------------------------------------------------------------------------
#include "vs1003.h"
#include "type.h"
//
// VS1003 commands
//
#define VS1003_READ 0x03
#define VS1003_WRITE 0x02
//************************************************************
//初始化AVR与VS1003连接的端口
void vs1003_port_init(void)
//************************************************************
{
//set SO pin as input
VS_SO_IN();
//set SI pin as output
VS_SI_OUT();
//set SCK pin as output
VS_SCK_OUT();
//set XCS pin as output
VS_nXCS_OUT();
//set XRESET pin as output
VS_nXRST_OUT();
//set DREQ pin as input
VS_DREQ_IN();
//set XDCS pin as output
VS_nXDCS_OUT();
}
//************************************************************
// read one word from the VS1001 Control registers
//
word vs1003_SCI_read(byte address)
//************************************************************
{
word temp=0;
VS_nXCS=0; //XCS
//send read command
SPI_TransferBYTE(VS1003_READ);
//send address
SPI_TransferBYTE(address);
//read D15-D8
temp = SPI_TransferBYTE(0xFF);
temp <<= 8;
//read lower byte
temp |= (word)SPI_TransferBYTE(0xFF);
VS_nXCS=1; //XCS
//wait data transmission
delay_us(10);
//return a word
return(temp);
}
//************************************************************
// write one word to the VS1001 Control registers
//
void vs1003_SCI_write(byte address, word data)
//************************************************************
{
VS_nXCS=0; //XCS
//send write command
SPI_TransferBYTE(VS1003_WRITE);
//send address
SPI_TransferBYTE(address);
//send D15-D8
SPI_TransferBYTE(data>>8);
//send D7-D0
SPI_TransferBYTE(data);
VS_nXCS=1; //XCS
//wait data transmission
delay_us(10);
}
//***********************************************************
// send a byte to the VS1001 MPEG stream
//
void vs1003_SDI_write(byte data)
//***********************************************************
{
VS_nXDCS=0; // nXDCS
SPI_TransferBYTE(data);
VS_nXDCS=1; // nXDCS
}
//***********************************************************
// write MPEG stream
void vs1003_SDI_block_write(word len, byte *buffer)
//***********************************************************
{
VS_nXDCS=0; // nXDCS
while((len--) > 0) SPI_TransferBYTE(*buffer++);
VS_nXDCS=1; // nXDCS
}
//***********************************************************
// write MPEG stream
// NOTICE: different pointer type
void vs1003_SDI_block_write_PGM(word len, flash byte *buffer)
//***********************************************************
{
VS_nXDCS=0; // nXDCS
while((len--) > 0) SPI_TransferBYTE(*buffer++);
VS_nXDCS=1; // nXDCS
}
//************************************************************
//an approximate 1.35 ms delay if VS1003 is run at 12.288 MHz.
void vs1003_hard_reset(void)
//************************************************************
{
//hard reset
VS_nXRST_OUT();
VS_nXRST=0;
delay_ms(10);
VS_nXRST=1;
// wait for nDREQ
while(VS_DREQ_PIN);
// wait DREQ
while(!VS_DREQ_PIN);
// low spi speed
vs1003_spi_speed(0);
//dummy write ???
vs1003_SCI_write(SCI_CLOCKF, 0x9800);
//CLKI = XTALI * 3, SCI_ADD = 1.5x
vs1003_SCI_write(SCI_CLOCKF, 0x9800);
delay_ms(10);
// wait DREQ
while(!VS_DREQ_PIN);
//sample rate: 44KHz
vs1003_SCI_write(SCI_AUDATA, 0xAC45);
// 0db, 100Hz
vs1003_SetBass(0, 10, 0, 7);
// set volume
vs1003_SetVolume(0, 0);
// high spi speed
vs1003_spi_speed(1);
}
//************************************************************
//This is done by activating bit 2 in SCI MODE register
//wait at least 1.35ms for DREQ
void vs1003_soft_reset(void)
//************************************************************
{
// low spi speed
vs1003_spi_speed(0);
//set softreset bit and use new mode
vs1003_SCI_write(SCI_MODE, SM_SDINEW | SM_RESET);
// wait for nDREQ
while(VS_DREQ_PIN);
// wait for DREQ
while(!VS_DREQ_PIN);
//CLKI = XTALI * 3, SCI_ADD = 1.5x
vs1003_SCI_write(SCI_CLOCKF, 0x9800);
delay_ms(10);
// wait DREQ
while(!VS_DREQ_PIN);
//sample rate: 44KHz
vs1003_SCI_write(SCI_AUDATA, 0xAC45);
// 0db, 100Hz
vs1003_SetBass(0, 10, 0, 7);
// set volume
vs1003_SetVolume(0, 0);
// high spi speed
vs1003_spi_speed(1);
}
//************************************************************
byte vs1003_get_version(void)
//************************************************************
{
return (vs1003_SCI_read(SCI_STATUS) >> 4) & 0x7;
}
//************************************************************
void vs1003_SetVolume(byte left, byte right)
//************************************************************
{
word vol;
vol = (word)(((word)left)<<8) | (word)right;
vs1003_SCI_write(SCI_VOL, vol);
}
//************************************************************
void vs1003_SetBass(byte bass_amp, byte bass_freq,
byte treb_amp, byte treb_freq)
//************************************************************
{
byte bass, treble;
word temp;
bass = ((bass_amp & 0x0f) << 4) | (bass_freq & 0x0f);
treble = ((treb_amp & 0x0f) << 4) | (treb_freq & 0x0f);
temp = (((word)treble)<<8) | bass;
vs1003_SCI_write(SCI_BASS, temp);
}
//************************************************************
// sine test
void sine_on(word freq)
//************************************************************
{
byte data[8] = {0x53,0xef,0x6e,0xff,0x00,0x00,0x00,0x00};
//do hard reset
VS_nXRST_OUT();
VS_nXRST=0;
delay_ms(10);
VS_nXRST=1;
//wait DREQ
while(!VS_DREQ_PIN);
vs1003_SCI_write(SCI_CLOCKF, 0x9800);
//vs1003_SCI_write(SCI_CLOCKF, 0x9770);
//max volume
vs1003_SetVolume(0, 0);
//set test bit
vs1003_SCI_write(SCI_MODE, SM_SDINEW | SM_TESTS);
//wait DREQ
while(!VS_DREQ_PIN);
data[3] = ((freq * 128) / 44100) & 0x1f;
vs1003_SDI_block_write(8, data);
}
//************************************************************
// sine test off
void sine_off(void)
//************************************************************
{
byte data[8]={0x45,0x78,0x69,0x74,0,0,0,0};
//wait DREQ
while(!VS_DREQ_PIN);
vs1003_SDI_block_write(8, data);
}
//***********************************************************
//feed 2048 zeros to vs1003
void vs1003_feed_zeros(void)
//***********************************************************
{
word i; byte j;
for(i = 0; i < 2048; i += 32)
{
while(!VS_DREQ_PIN);
//send 32 zeros
VS_nXDCS=0; // nXDCS
for(j=0; j<32; j++)
{
SPI_TransferBYTE(0x00);
}
VS_nXDCS=1; // nXDCS
}
}
/*
//***********************************************************
//play test mp3 data
void vs1003PlayBeep(void)
//***********************************************************
{
word i;
for(i = 0; i < 4800; i += 32)
{
while(!VS_DREQ_PIN);
vs1003_SDI_block_write_PGM(32, &vsBeepMP3[0] + i);
}
//send 2048 zeros
vs1003_feed_zeros();
} */
//***********************************************************
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2MHz or 8MHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
// speed : 0->low peed(2MHz) 1->high speed(4MHz)
// last access: 2007.5.20
void vs1003_spi_speed(byte speed)
//***********************************************************
{
speed &= 0x01;
if(speed==1)
{SPCR=0x50; SPSR=0x00;}
else
{SPCR=0x51; SPSR=0x01;}
}
//------------------ end of vs1003.c -----------------------//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -