📄 vs1003.c
字号:
//#include "LPC2294.h"
//#include <macros.h>
#include "vs1003.h"
//#include "Target.h"
#include "sdconfig.h"
#include "config.h"
#include "LPC2210Uart.h"
#include "common.h"
//#include "sd.h"
#include "MP3Test.h"
void vs1003_cmd_write(uint8 address,uint32 data);
void VS1003_Write(uint8 Address, int Count, unsigned int *pData);
void VS1003_Stream(uint8 *Data,uint8 Qte);
/*
******************************************************************************************************************
** VS1003 TEST PROGRAMMER
** MODIFIED BY JOSEPH
** 2006.09.28
**
*******************************************************************************************************************
*/
/*******************************************************************************************************************
** 函数名称: void ResetVS1003SPI() Name: void SD_Power()
** 功能描述: 对卡先下电,再上电 Function: turn off the card's power, and turn on
** 输 入: 无 Input: NULL
** 输 出: 无 Output: NULL
********************************************************************************************************************/
void ResetVS1003SPI(void)
{
// set the communication signal to low
SPI_SCK_GPIO();
SPI_SCK_OUT();
SPI_SCK_CLR(); /* SCK 引脚置低 set SCK to zero */
SPI_MISO_GPIO();
SPI_MISO_OUT();
SPI_MISO_CLR(); /* MISO 引脚置低 set MISO to zero */
SPI_MOSI_GPIO();
SPI_MOSI_OUT();
SPI_MOSI_CLR(); /* MOSI 引脚置低 set MOSI to zero */
// Set the control signal to high
MP3_XCS_GPIO();
MP3_XCS_OUT();
MP3_XCS_LOW();
MP3_XCS_HIGH(); /* CS 引脚置低 set CS to zero */
MP3_DATA_CS_GPIO();
MP3_DATA_CS_OUT();
MP3_DATA_CS_LOW();
MP3_DATA_CS_HIGH();
MP3_DATA_REQ_GPIO();
MP3_DATA_REQ_IN();
MP3_DATA_REST_GPIO();
MP3_DATA_REST_OUT();
MP3_DATA_REST_LOW();
ms_wait(200);
// SPI_CS_CLR();
MP3_DATA_REST_HIGH();
}
// SPI initialize
// clock rate: 500000hz
//
void LPC2210SPI_Init(void)
{
LPC2210SPI_CLK(128); /* 设置SPI频率小于等于400kHZ set frequency of SPI below 400kHZ */
//SPI_Clk400k();
S0PCR = (0x00 << 4) + (0x01 << 5); /* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
S0PSR = 0;
} /* configure SPI interface */
//
// PCLK/SPCCR = Clk,PCLK = 400k X 128
//
/*
void LPC2210SPI_CLK(uint8 Spccr_data)
{
S0PCCR = Spccr_data; // Spccr_data max to 8
}
*/
/*******************************************************************************************************************
** 函数名称: void MP3_DATA_REQ_Chk() Name: void SD_ChkCardWP()
** 功能描述: 检测卡写保护 Function: check weather card is write protect
** 输 入: 无 Input: NULL
** 输 出: 1: 卡已写保护 0: 卡未写保护 Output: 1: insert write protect 0: not write protect
********************************************************************************************************************/
uint8 MP3_DATA_REQ_Chk(void)
{
if (MP3_DATA_REQ_STATUS() != 0)
return 1; /* 卡写保护 */
else
return 0; /* 卡未写保护 */
}
void MP3_XCS_Select(void)
{
SD_CS_HIGH();
MP3_DATA_CS_HIGH();
MP3_XCS_LOW();
}
void MP3_XCS_Deselect(void)
{
SD_CS_HIGH();
MP3_DATA_CS_HIGH();
MP3_XCS_HIGH();
}
void MP3_XDCS_Select(void)
{
SD_CS_HIGH();
MP3_XCS_HIGH();
MP3_DATA_CS_LOW();
}
void MP3_XDCS_Deselect(void)
{
SD_CS_HIGH();
MP3_XCS_HIGH();
MP3_DATA_CS_HIGH();
}
//
// Set the port connecting to CS,DCS,REST as output signal,and set to 1
// Set the port connecting to REQ as input signal
//
void MP3_Port_Init(void)
{
ResetVS1003SPI();
SPI_INIT();
LPC2210SPI_Init();
}
/*********************************************************************************************************
** Function name: VS1003_Init
**
** Descriptions: initial the mainly register of vs1003
**
** input parameters: none
** Returned value: none
**
** Used global variables: none
** Calling modules: None
**
** Created by: JOSEPH
** Created Date: 2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VS1003_Init(void)
{
uint8 bufc[4];
ms_wait(0);
vs1003_cmd_write(SPI_MODE,0x0824); //SDI NEW MODE
ms_wait(500);
while(!MP3_DATA_REQ_Chk());
vs1003_cmd_write(SPI_MODE,0x0824);
ms_wait(500);
while(!MP3_DATA_REQ_Chk());
vs1003_cmd_write(SPI_BASS,0x0055); //BASS
ms_wait(2);
while(!MP3_DATA_REQ_Chk());
vs1003_cmd_write(SPI_CLOCKF,0X9c03); //CLOCK : XTALI×3.0
//100 11 100 0000 0011
ms_wait(2);
while(!MP3_DATA_REQ_Chk());
vs1003_cmd_write(SPI_VOL,0X2020); //VOLUME
ms_wait(2);
while(!MP3_DATA_REQ_Chk());
vs1003_cmd_write(SPI_AUDATA, 0xbb81);
ms_wait(2);
//SendZerosToVS10xx(4);
bufc[0] = 0x00;
bufc[1] = 0x00;
bufc[2] = 0x00;
bufc[3] = 0x00;
while(!MP3_DATA_REQ_Chk()); // wait for DREQ
VS1003_Stream(&bufc[0],4);
}
/*********************************************************************************************************
** Function name: VS1003Init
**
** Descriptions: continue to write data from address
**
** input parameters: HardReset
** Returned value: *pdata
**
** Used global variables: VS_WRITE_COMMAND
** Calling modules: None
**
** Created by: JOSEPH
** Created Date: 2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VS1003Init(uint8 HardReset)
{
unsigned int buf[2];
uint8 bufc[4];
if (HardReset == TRUE)
{
MP3_Port_Init();
ms_wait(5);
MP3_DATA_REST_LOW(); // Reset is 0
ms_wait(5);
MP3_DATA_REST_HIGH(); // Reset is 1
ms_wait(5);
}
while(!MP3_DATA_REQ_STATUS()); // wait for DREQ
buf[0] = 0x0804;
VS1003_Write(SPI_MODE,1,buf);
ms_wait(2);
while(!MP3_DATA_REQ_STATUS()); // wait for DREQ
buf[0] = 0xac45;
VS1003_Write(SPI_AUDATA,1,buf); // 44kHz
while(!MP3_DATA_REQ_STATUS()); // wait for DREQ
VS1003_SetVolume(0,0);
bufc[0] = 0x00;
bufc[1] = 0x00;
bufc[2] = 0x00;
bufc[3] = 0x00;
while(!MP3_DATA_REQ_STATUS()); // wait for DREQ
VS1003_Stream(&bufc[0],4);
}
/*******************************************************************************************************************
** 函数名称: void Write_Byte_SPI() Name: void SPI_SendByte()
** 功能描述: 通过SPI接口发送一个字节 Function: send a byte by SPI interface
** 输 入: uint8 byte: 发送的字节 Input: uint8 byte: the byte that will be send
** 输 出: 无 Output: NULL
********************************************************************************************************************/
void Write_Byte_SPI(uint8 byte)
{
uint8 temp_0;
S0PDR = byte; /* 发送数据放入SPI数据寄存器 */
while(!(S0PSR & 0x80));; /* 等待SPIF置位,即等待数据发送完毕 */
/* wait for SPIF being set, that is, wait for finishing of data being send */
temp_0 = S0PDR;
}
void vs1003_cmd_write(uint8 address,uint32 data)
{
// Mp3DeselectData();
MP3_XCS_Select(); // ()MP3_PORT&=~MP3_CMD_CS;
Write_Byte_SPI(VS_WRITE_COMMAND); // VS1003的写命令
//delay_nus(20);
Write_Byte_SPI(address); // 地址
Write_Byte_SPI(data>>8);
Write_Byte_SPI(data);
//delay_nus(200);
MP3_XCS_Deselect(); // ()MP3_PORT|=MP3_CMD_CS;
}
void vs1003_data_write(uint8 data)
{
MP3_XDCS_Select(); // ()MP3_PORT&=~MP3_DATA_CS;
Write_Byte_SPI(data);
MP3_XDCS_Deselect(); // MP3_PORT|=MP3_DATA_CS;
// MP3_XCS_HIGH();
}
void Mp3WriteRegister(uint8 addressbyte, uint8 highbyte, uint8 lowbyte)
{
Mp3SelectControl();
SPIPutCharWithoutWaiting(VS_WRITE_COMMAND);
SPIPutChar((addressbyte));
SPIPutChar((highbyte));
SPIPutChar((lowbyte));
SPIWait();
Mp3DeselectControl();
}
/*********************************************************************************************************
** Function name: VS1003_Write
**
** Descriptions: continue to write data from address
**
** input parameters: address,count,*pdata
** Returned value: *pdata
**
** Used global variables: VS_WRITE_COMMAND
** Calling modules: None
**
** Created by: JOSEPH
** Created Date: 2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void VS1003_Write(uint8 Address, int Count, unsigned int *pData)
{
MP3_XCS_Select(); // XCS Low
Write_Byte_SPI(VS_WRITE_COMMAND);
Write_Byte_SPI(Address);
while(Count--)
{
Write_Byte_SPI((uint8) ((*pData) >> 8));
Write_Byte_SPI((uint8) *pData);
}
MP3_XCS_Deselect(); // XCS High
ms_wait(5);
}
/*******************************************************************************************************************
** 函数名称: uint8 Read_Byte_SPI() Name: uint8 SPI_RecByte()
** 功能描述: 从SPI接口接收一个字节 Function: receive a byte from SPI interface
** 输 入: 无 Input: NULL
** 输 出: 收到的字节 Output: the byte that be received
********************************************************************************************************************/
uint8 Read_Byte_SPI(void)
{
S0PDR = 0xFF;
while(!(S0PSR & 0x80)); /* 等待SPIF置位,即等待收到数据 */
/* wait for SPIF being set, that is, wait for being received data */
return(S0PDR); /* 读取收到的字节 read the byte received */
}
uint8 vs1003_read(uint8 address)
{
uint8 temp1=0;
uint32 temp_1=0;
// Mp3DeselectData();
MP3_XCS_Select(); // MP3_PORT&=~MP3_CMD_CS;
Write_Byte_SPI(VS_READ_COMMAND); // VS1003的读命令
//delay_nus(20);
Write_Byte_SPI(address); // 地址
temp_1=Read_Byte_SPI();
temp_1=temp_1<<8;
temp1=Read_Byte_SPI();
temp_1=temp_1|temp1;
MP3_XCS_Deselect(); // MP3_PORT|=MP3_CMD_CS;
return temp_1;
}
/*********************************************************************************************************
** Function name: Mp3ReadRegister
**
** Descriptions: READ DATA FROM THE REGISTER OF VS1003
**
** input parameters: THE ADDRESS OF REGISTER FROM VS1003
** Returned value: resultvalue
**
** Used global variables: VS_READ_COMMAND,SPI_RESULT_BYTE
** Calling modules: None
**
** Created by: JOSEPH
** Created Date: 2006/10/19
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
unsigned int Mp3ReadRegister (uint8 addressbyte)
{
unsigned int resultvalue = 0;
MP3_XCS_Select();
SPIPutCharWithoutWaiting(VS_READ_COMMAND);
SPIPutChar((addressbyte));
SPIPutChar(0xff);
SPIWait();
resultvalue = (SPI_RESULT_BYTE) << 8;
SPIPutCharWithoutWaiting(0xff);
SPIWait();
resultvalue |= (SPI_RESULT_BYTE);
MP3_XCS_Deselect();
return resultvalue;
}
/*********************************************************************************************************
** Function name: VS1003_Read
**
** Descriptions: continue to read data from address
**
** input parameters: address,count,*pdata
** Returned value: *pdata
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -