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