?? vs1003mian.c
字號(hào):
//文件名:vs1003.c
//功能:vs1003 的底層驅(qū)動(dòng)程序,主控芯片為L(zhǎng)PC2103;
// 其他的微處理器(帶SPI接口的)只需稍加修改即可適用;
// 對(duì)于不帶硬SPI接口的微處理器可以用IO進(jìn)行SPI的時(shí)序模擬
// 更多代碼敬請(qǐng)?jiān)L問www.icdev.com.cn
#include "vs1003.h"
#include "timer.h"
extern long volatile timeval; //用于延時(shí)的全局變量
/**********************************************************/
/* 函數(shù)名稱 : MSPI_Init */
/* 函數(shù)功能 : 初始化SPI接口,設(shè)置為主機(jī)。 */
/* 參數(shù) : 無(wú) */
/* 返回值 : 無(wú) */
/*--------------------------------------------------------*/
void MSPI_Init(void)
{
PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; //選擇 SPI
S0SPCCR = 0x08; // SPI 時(shí)鐘設(shè)置
S0SPCR = (0 << 3) | // CPHA = 0,
(0 << 4) | // CPOL = 0,
(1 << 5) | // MSTR = 1,
(0 << 6) | // LSBF = 0,
(0 << 7); // SPIE = 0,
}
/**********************************************************/
/* 函數(shù)名稱 : InitPortVS1003 */
/* 函數(shù)功能 : MCU與vs1003接口的初始化 */
/* 參數(shù) : 無(wú) */
/* 返回值 : 無(wú) */
/*--------------------------------------------------------*/
void InitPortVS1003(void)
{
MSPI_Init();//SPI口的初始化
IODIR &= 0xfffeffff; //其他接口線的設(shè)置,其中dreq 為輸入口
IODIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均為輸出口
IOSET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默認(rèn)輸出高電平
}
/**********************************************************/
/* 函數(shù)名稱 : SPIPutChar */
/* 函數(shù)功能 : 通過SPI發(fā)送一個(gè)字節(jié)的數(shù)據(jù) */
/* 參數(shù) : 待發(fā)送的字節(jié)數(shù)據(jù) */
/* 返回值 : 無(wú) */
/*--------------------------------------------------------*/
void SPIPutChar(unsigned char c)
{
S0SPDR = c;
while((S0SPSR & 0x80) == 0); //等待SPI將數(shù)據(jù)發(fā)送完畢
}
/**********************************************************/
/* 函數(shù)名稱 : Mp3SoftReset */
/* 函數(shù)功能 : vs1003軟件復(fù)位 */
/* 參數(shù) : 無(wú) */
/* 返回值 : 無(wú) */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //軟件復(fù)位
wait(1); //延時(shí)1ms
while (IOPIN & MP3_DREQ == 0); //等待軟件復(fù)位結(jié)束
Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//設(shè)置vs1003的時(shí)鐘,3倍頻
Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采樣率48k,立體聲
Mp3WriteRegister(SPI_BASS, 0x00, 0x55);//設(shè)置重音
Mp3SetVolume(20,20);//設(shè)置音量
wait(1); //延時(shí)1ms
//向vs1003發(fā)送4個(gè)字節(jié)無(wú)效數(shù)據(jù),用以啟動(dòng)SPI發(fā)送
Mp3SelectData();
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
Mp3DeselectData();
}
/**********************************************************/
/* 函數(shù)名稱 : Mp3Reset */
/* 函數(shù)功能 : vs1003硬件復(fù)位 */
/* 參數(shù) : 無(wú) */
/* 返回值 : 無(wú) */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{
Mp3PutInReset();//xReset = 0 復(fù)位vs1003
wait(100);//延時(shí)100ms
// SPIPutCharWithoutWaiting(0xff);//發(fā)送一個(gè)字節(jié)的無(wú)效數(shù)據(jù),啟動(dòng)SPI傳輸
Mp3DeselectControl(); //xCS = 1
Mp3DeselectData(); //xDCS = 1
Mp3ReleaseFromReset(); //xRESET = 1
wait(100); //延時(shí)100ms
while (IOPIN & MP3_DREQ == 0);//等待DREQ為高
wait(100); //延時(shí)100ms
Mp3SetVolume(10,10);
Mp3SoftReset();//vs1003軟復(fù)位
}
/***********************************************************/
/* 函數(shù)名稱 : VsSineTest */
/* 函數(shù)功能 : vs1003正弦測(cè)試,將該函數(shù)放在while循環(huán)中, */
/* 如果能持續(xù)聽到一高一低的聲音,證明測(cè)試通過 */
/* 參數(shù) : 無(wú) */
/* 返回值 : 無(wú) */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
Mp3PutInReset(); //xReset = 0 復(fù)位vs1003
wait(100); //延時(shí)100ms
SPIPutChar(0xff);//發(fā)送一個(gè)字節(jié)的無(wú)效數(shù)據(jù),啟動(dòng)SPI傳輸
Mp3DeselectControl();
Mp3DeselectData();
Mp3ReleaseFromReset();
wait(100);
Mp3WriteRegister(SPI_MODE,0x08,0x20);//進(jìn)入vs1003的測(cè)試模式
while (IOPIN & MP3_DREQ == 0); //等待DREQ為高
Mp3SelectData(); //xDCS = 1,選擇vs1003的數(shù)據(jù)接口
//向vs1003發(fā)送正弦測(cè)試命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
//其中n = 0x24, 設(shè)定vs1003所產(chǎn)生的正弦波的頻率值,具體計(jì)算方法見vs1003的datasheet
SPIPutChar(0x53);
SPIPutChar(0xef);
SPIPutChar(0x6e);
SPIPutChar(0x24);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();//程序執(zhí)行到這里后應(yīng)該能從耳機(jī)聽到一個(gè)單一頻率的聲音
//退出正弦測(cè)試
Mp3SelectData();
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();
//再次進(jìn)入正弦測(cè)試并設(shè)置n值為0x44,即將正弦波的頻率設(shè)置為另外的值
Mp3SelectData();
SPIPutChar(0x53);
SPIPutChar(0xef);
SPIPutChar(0x6e);
SPIPutChar(0x44);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();
//退出正弦測(cè)試
Mp3SelectData();
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
wait(500);
Mp3DeselectData();
}
/*************************************************************/
/* 函數(shù)名稱 : Mp3WriteRegister */
/* 函數(shù)功能 : 寫vs1003寄存器 */
/* 參數(shù) : 寄存器地址,待寫數(shù)據(jù)的高8位,待寫數(shù)據(jù)的低8位 */
/* 返回值 : 無(wú) */
/*-----------------------------------------------------------*/
void Mp3WriteRegister(unsigned char addressbyte, unsigned char highbyte, unsigned char lowbyte)
{
Mp3DeselectData();
Mp3SelectControl();//XCS = 0
SPIPutChar(VS_WRITE_COMMAND); //發(fā)送寫寄存器命令
SPIPutChar(addressbyte); //發(fā)送寄存器的地址
SPIPutChar(highbyte); //發(fā)送待寫數(shù)據(jù)的高8位
SPIPutChar(lowbyte); //發(fā)送待寫數(shù)據(jù)的低8位
Mp3DeselectControl();
}
/*************************************************************/
/* 函數(shù)名稱 : Mp3ReadRegister */
/* 函數(shù)功能 : 寫vs1003寄存器 */
/* 參數(shù) : 寄存器地址 */
/* 返回值 : vs1003的16位寄存器的值 */
/*-----------------------------------------------------------*/
unsigned int Mp3ReadRegister(unsigned char addressbyte)
{
unsigned int resultvalue = 0;
Mp3DeselectData();
Mp3SelectControl();//XCS = 0
SPIPutChar(VS_READ_COMMAND); //發(fā)送讀寄存器命令
SPIPutChar((addressbyte)); //發(fā)送寄存器的地址
SPIPutChar(0xff); //發(fā)送讀時(shí)鐘
resultvalue = (SPI_RESULT_BYTE) << 8;//讀取高8位數(shù)據(jù)
SPIPutChar(0xff); //發(fā)送讀時(shí)鐘
resultvalue |= (SPI_RESULT_BYTE); //讀取低8位數(shù)據(jù)
Mp3DeselectControl();
return resultvalue; //返回16位寄存器的值
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -