📄 vs1003.c
字号:
/****************************************Copyright (c)**************************************************
** 上海新时达电气有限公司
** 研 发 中 心
** 研发一部
**
** http://www.stepelevatar.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: vs1003.C
**创 建 人: 吕海安
**最后修改日期: 2007年05月31日
**描 述: MP3语音芯片的驱动程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕海安
** 版 本: v1.0
** 日 期: 2007.07.03
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "VS1003.h"
/*****************************************************************************************
* 名称:delay_nnus
* 功能:延时一段时间
* 输入:unsigned int n
* 返回:无
*****************************************************************************************/
void delay_nnus(INT16U n)
{
INT16U b;
for (b = 0; b<n; b++) ;
}
/*****************************************************************************************
* 名称:delay_nnus
* 功能:延时一段时间
* 输入:unsigned int n
* 返回:无
*****************************************************************************************/
void delay_nnms(INT16U n)
{
INT16U b;
for (b = 0; b<n; b++)
{
delay_nnus(100);
}
}
/*****************************************************************************************
* 名称:spi_init
* 功能:SPI initialize 设为SPI主机
* 输入:无
* 返回:无
*****************************************************************************************/
void spi_init(void)
{
MP3_DDR = (MP3_DDR & 0xffffffff) | MP3_CMD_CS | MP3_DATA_REST | MP3_DATA_CS | SPI_SCK | SPI_MOIS | SD_CARD_CS;
MP3_DDR = (MP3_DDR & 0xffffffff) & (~MP3_DATA_REQ) & (~SPI_MISO);
PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; //选择 SPI
//S0PCCR = 0x08; // SPI 时钟设置
S0PCCR = 0x08;
S0PCR = (0 << 3) | // CPHA = 0,
(1 << 4) | // CPOL = 1,
(1 << 5) | // MSTR = 1,
(0 << 6) | // LSBF = 0,
(0 << 7); // SPIE = 0,
}
/*****************************************************************************************
* 名称:set_spi
* 功能:为SD卡和VS1003设置SPI,分别是上升沿和下降沿采样
* 输入:mode
* 返回:无
*****************************************************************************************/
void set_spi(INT8U mode)
{
switch(mode)
{
case 0: //for vs1003
S0PCR = (0 << 3) | // CPHA = 0,
(0 << 4) | // CPOL = 0,
(1 << 5) | // MSTR = 1,
(0 << 6) | // LSBF = 0,
(0 << 7); // SPIE = 0,
break;
case 1: //for sd
S0PCR = (0 << 3) | // CPHA = 0,
(1 << 4) | // CPOL = 1,
(1 << 5) | // MSTR = 1,
(0 << 6) | // LSBF = 0,
(0 << 7); // SPIE = 0,
break;
default:
break;
}
}
/*void spi_init(void)
{
MP3_DDR = (MP3_DDR & 0xffffffff) | MP3_CMD_CS | MP3_DATA_REST | MP3_DATA_CS | SPI_SCK | SPI_MOIS | SD_CARD_CS;
MP3_DDR = (MP3_DDR & 0xffffffff) & (~MP3_DATA_REQ) & (~SPI_MISO);
// SI输入,SO,SCK,SS输出
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI
PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
S0PCCR = 0x08; // 设置SPI时钟分频 250K HZ (PCLK 速率 / SPCCR 值)
S0PCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
(1 << 4) | // CPOL = 1, SCK 为低有效
(1 << 5) | // MSTR = 1, SPI 处于主模式
(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << 7); // SPIE = 0, SPI 中断被禁止
}*/
/*****************************************************************************************
* 名称:mp3_port_init
* 功能:MP3硬件解码芯片初始化
* 输入:无
* 返回:无
*****************************************************************************************/
void mp3_port_init(void)
{
spi_init();//SPI口的初始化
MP3_DDR |= MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
MP3_DDR &= ~MP3_DATA_REQ;
MP3_PORT_SET = MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
}
/*void mp3_port_init()
{
spi_init();
MP3_DDR |= MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
MP3_DDR &= ~MP3_DATA_REQ;
MP3_PORT_SET = MP3_DATA_CS | MP3_CMD_CS | MP3_DATA_REST;
// vs1003_HardwareReset();
}*/
/*****************************************************************************************
* 名称:Write_Byte_SPI
* 功能:向SPI写一个字节
* 输入:INT8U byte
* 返回:无
*****************************************************************************************/
void Write_Byte_SPI(INT8U byte)
{
S0PDR = byte; // 发送数据放入SPI数据寄存器
while(0 == (S0PSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕
byte = S0PDR;
}
/*****************************************************************************************
* 名称:Read_Byte_SPI
* 功能:从SPI接口读一个字节
* 输入:无
* 返回:一个字节的数据
*****************************************************************************************/
INT8U Read_Byte_SPI(void)
{
S0PDR = 0xFF;
while(0 == (S0PSR & 0x80)); //等待SPIF置位,即等待收到数据
// wait for SPIF being set, that is, wait for being received data
return(S0PDR); //读取收到的字节 read the byte received
}
/*****************************************************************************************
* 名称:vs1003_cmd_write
* 功能:向VS1003写命令
* 输入:INT8U address,
* INT16U data
* 返回:无
*****************************************************************************************/
void vs1003_cmd_write(INT8U address,INT16U data)
{
//S0PCCR = 0x40;
while(!(MP3_PIN & MP3_DATA_REQ));
MP3_PORT_SET = MP3_DATA_CS; // MP3_DATA_CS=1;
MP3_PORT_CLR = MP3_CMD_CS; // MP3_CMD_CS=0;
Write_Byte_SPI(0x02); // VS1011的写命令
Write_Byte_SPI(address); // 地址
Write_Byte_SPI((INT8U)(data >> 8));
Write_Byte_SPI((INT8U)data);
MP3_PORT_SET = MP3_CMD_CS|MP3_DATA_CS; // MP3_CMD_CS=1;
//S0PCCR = 0x08;
}
/*****************************************************************************************
* 名称:vs1003_data_write
* 功能:向VS1003写数据
* 输入:INT8U data
* 返回:无
*****************************************************************************************/
void vs1003_data_write(INT8U data)
{
MP3_PORT_CLR = MP3_DATA_CS; // MP3_DATA_CS=0
Write_Byte_SPI(data);
MP3_PORT_SET = MP3_DATA_CS; // MP3_DATA_CS=1
}
/*****************************************************************************************
* 名称:vs1003_read
* 功能:从VS1003读数据
* 输入:INT8U address
* 返回:INT16U temp
*****************************************************************************************/
INT16U vs1003_read(INT8U address)
{
INT8U temp1=0;
INT16U temp=0;
//S0PCCR = 0x40;
while(!(MP3_PIN & MP3_DATA_REQ));
MP3_PORT_SET = MP3_DATA_CS; // MP3_DATA_CS=1;
MP3_PORT_CLR = MP3_CMD_CS; // MP3_CMD_CS=0;
Write_Byte_SPI(0x03); // VS1011的读命令
Write_Byte_SPI(address); // 地址
//Write_Byte_SPI(0xff);
//S0PCCR = 0x08;
temp= Read_Byte_SPI();
temp = temp << 8;
//Write_Byte_SPI(0xff);
temp1 = Read_Byte_SPI();
temp = temp | temp1;
MP3_PORT_SET = MP3_CMD_CS; //MP3_CMD_CS=1;
return temp;
}
/*****************************************************************************************
* 名称:ResetDecodeTime
* 功能:复位记录时间
* 输入:无
* 返回:无
*****************************************************************************************/
void ResetDecodeTime(void)
{
//vs1003_cmd_write(0x04,0x0000);
//vs1003_cmd_write(0x04,0x0000);
}
/*****************************************************************************************
* 名称:GetDecodeTime
* 功能:得到记录时间
* 输入:无
* 返回:得到的时间
*****************************************************************************************/
INT16U GetDecodeTime(void)
{
//return vs1003_read(0x04);
}
/*****************************************************************************************
* 名称:vs1003_Reset
* 功能:VS1003复位
* 输入:无
* 返回:无
*****************************************************************************************/
void vs1003_Reset(void)
{
INT8U i = 0xff;
set_spi(0);
MP3_PORT_SET = MP3_CMD_CS;
MP3_PORT_CLR = MP3_DATA_CS; // MP3_DATA_CS=0;
while(1)
{
if((MP3_PIN & MP3_DATA_REQ))
{
vs1003_data_write(0x00);
if(--i == 0) break;
}
}
MP3_PORT_SET = MP3_DATA_CS; // MP3_DATA_CS = 1;
vs1003_cmd_write(0x00,0x0804);
delay_nnms(1000); // 延时100ms
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
set_spi(1);
}
/*****************************************************************************************
* 名称:vs1003_HardwareReset
* 功能:VS1003硬件复位
* 输入:无
* 返回:无
*****************************************************************************************/
void vs1003_HardwareReset(void)
{
INT16U i = 0;
S0PCCR = 0x40;
set_spi(0);
Mp3PutInReset(); // xReset = 0 复位vs1003
delay_nnms(100); // 延时100ms
Write_Byte_SPI(0xff); // 发送一个字节的无效数据,启动SPI传输
MP3_PORT_SET = MP3_DATA_CS; // MP3_DATA_CS=1;
MP3_PORT_SET = MP3_CMD_CS; // MP3_CMD_CS=1;
Mp3ReleaseFromReset();
i = vs1003_read(0x01);
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
vs1003_cmd_write(0x00,0x0800); // NEW MODE
delay_nnms(2000); //延时1ms
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
vs1003_cmd_write(0x02, 0x0055); //设置低音
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
vs1003_cmd_write(0x03, 0X9800); //设置vs1003的时钟,3倍频
delay_nnms(200);
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
//vs1003_cmd_write(0x05, 0xB981); //采样率32k,立体声
//vs1003_cmd_write(0x05, 0xBD81); //采样率 reserved,立体声
//vs1003_cmd_write(0x05, 0xB599); //采样率48k,立体声
vs1003_cmd_write(0x05, 0xB199); //采样率44k,立体声
//vs1003_cmd_write(0x05, 0xB181); //采样率44k,立体声
delay_nnms(200);
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
vs1003_cmd_write(0x0b, 0x3737); //设置音量
while (!(MP3_PIN & MP3_DATA_REQ)); //等待软件复位结束
S0PCCR = 0x08;
set_spi(1);
}
/*****************************************************************************************
* END OF FILE
*****************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -