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

📄 vs1003.c

📁 S64和VS1003的MP3播放实现的源代码/
💻 C
字号:
#include "AT91SAM7S64.h"
#include "lib_AT91SAM7S64.h"

#include "SAMspi.h"

#include "vs1003.h"

#define SIN_TEST    0

// all peripherals use same NPCS
// use PIO to select peripheral
#define SPI_CSR_VS1003   1
#define VS1003_NPCS      PCS_1

#define  VS1003_CS       (1 << 11)
#define  VS1003_DS       (1 << 22)
#define  VS1003_RST      (1 << 20)
#define  VS1003_DREQ     (1 << 21)

#define  VS1003_CS_HIGH()  (*AT91C_PIOA_SODR |= VS1003_CS)
#define  VS1003_CS_LOW()   (*AT91C_PIOA_CODR |= VS1003_CS)

#define  VS1003_DS_HIGH()  (*AT91C_PIOA_SODR |= VS1003_DS)
#define  VS1003_DS_LOW()   (*AT91C_PIOA_CODR |= VS1003_DS)

#define  VS1003_RST_HIGH()  (*AT91C_PIOA_SODR |= VS1003_RST)
#define  VS1003_RST_LOW()   (*AT91C_PIOA_CODR |= VS1003_RST)

#if SIN_TEST > 0
unsigned char SIN_CMD[8] = {0x53,0xef,0x6e,0x44,0,0,0,0};    
#endif

//------------------------------------------------------------------------
static void vs1003_delay(signed int len)
{
    while(len > 0) len--;
}
//------------------------------------------------------------------------
static void  VS1003_PIO_Init(void) 
{
	AT91PS_PIO pPIOA     = AT91C_BASE_PIOA;

    // enbale Pins as IO 
    pPIOA->PIO_PER = VS1003_CS | VS1003_DS | VS1003_RST | VS1003_DREQ;

    // CS, DS, RST output
    pPIOA->PIO_OER = VS1003_CS | VS1003_DS | VS1003_RST;

    // SREQ input
    pPIOA->PIO_ODR  = VS1003_DREQ;
    // filter
    pPIOA->PIO_IFER = VS1003_DREQ;    

    // enable input, enbale PIOA clock
    AT91F_PIOA_CfgPMC();
}   

//------------------------------------------------------------------------
unsigned char VS1003_RDY(void)
{
   if(*AT91C_PIOA_PDSR & VS1003_DREQ)
      return 1; /* ready */
   else
      return 0; /* busy */
}

/**************************************************************************/

//-------------------------------------------------------------------------
void VS1003_SCI_Write(unsigned char u8RegNumber, unsigned short u16Data)
{
    VS1003_DS_HIGH();
    VS1003_CS_LOW();
    
    SAMspiSend(VS1003_NPCS, VS_WRITE_COMMAND);         //write opcode
    SAMspiSend(VS1003_NPCS, u8RegNumber);              //reg id
    SAMspiSend(VS1003_NPCS, (u16Data & 0xff00) >> 8);  //high byte
    SAMspiSend(VS1003_NPCS, u16Data & 0x00ff);         //low  byte
    
    VS1003_CS_HIGH();
}

//-------------------------------------------------------------------------
unsigned short VS1003_SCI_Read(unsigned char u8RegNumber)
{
    unsigned short temp = 0;
    
    VS1003_DS_HIGH();
    VS1003_CS_LOW();
    
    SAMspiSend(VS1003_NPCS, VS_READ_COMMAND);           //read opcode
    SAMspiSend(VS1003_NPCS, u8RegNumber);               //reg id
    
    temp = SAMspiSend(VS1003_NPCS, 0xFF);               //high byte
    temp = (temp << 8) + SAMspiSend(VS1003_NPCS, 0xFF); //low  byte
    
    VS1003_CS_HIGH();
    
    return (temp);
}


//-------------------------------------------------------------------------
unsigned short VS1003_SDI_Write(unsigned char* pData, unsigned short u16DataNumber)
{
    unsigned short i = 0;
    
    VS1003_DS_LOW();
    
    for(i = 0; i < u16DataNumber; i++)
    {
       SAMspiSend(VS1003_NPCS, *pData ++);
    }  
    
    VS1003_DS_HIGH();

    return 0;
}

//-------------------------------------------------------------------------
void VS1003_Init(void)
{
    unsigned short res = 0;

    VS1003_PIO_Init();
    
    /* SPI interface must be inited */
    /* NOTE: SPI should be initialized */
    /* when init, the SPI clk speed shoud be low */
    /* no more than (1/6 * CLKI) */
    //SAMspiInit();
    SAMspiSetSCBR(VS1003_NPCS, 0xFE);

    VS1003_CS_HIGH();
    VS1003_DS_HIGH();

    VS1003_RST_LOW();     /* reset chip */
    vs1003_delay(0x7FF0);
    vs1003_delay(0x7FF0);
    VS1003_RST_HIGH();    /* normal */
    vs1003_delay(0x7FF0);

    while(!VS1003_RDY());
    VS1003_SCI_Write(SPI_MODE, 0x0804);   /* software reset */ 
    vs1003_delay(2000);   
    while(!VS1003_RDY());
    VS1003_SCI_Write(SPI_CLOCKF, 0x9800); /* 12.288MHz * (3 + 1.5) */ 
    vs1003_delay(0x7FF0);
    while(!VS1003_RDY());
    VS1003_SCI_Write(SPI_AUDATA, 0xBB81); /* 48KHz, stereo */
    while(!VS1003_RDY());
    VS1003_SCI_Write(SPI_BASS, 0x0000); /* shut down VSBE */
    while(!VS1003_RDY());
    VS1003_SCI_Write(SPI_VOL, 0x3030);

    res = VS1003_SCI_Read(SPI_STATUS);
    res = res;
  
    if (0x30 != (res & 0x70))
    {
         /* no VS1003 detected */
         while(1);
    }

    res = VS1003_SCI_Read(SPI_AUDATA);
    res = res;

#if SIN_TEST > 1
    while(!VS1003_RDY());
    VS1003_SCI_Write(SPI_MODE, 0x0820); /* enter test mode */
    while(!VS1003_RDY());
    VS1003_SDI_Write(SIN_CMD, 8);
#endif

    /* init done, the SPI clk speed can be changed up for fast operation */
    SAMspiSetSCBR(VS1003_NPCS, 6); /* MCK / 6 */
}

//-------------------------------------------------------------------------
unsigned char VS1003_LD_Plugin(unsigned char *plugin)
{
    unsigned char res = 1;

    return res;
}

⌨️ 快捷键说明

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