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

📄 vs1003.c~

📁 avr MP3 的源程序,包含文件系统,适合初学者
💻 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 + -