?? vs1003.c
字號:
#include"config.h"
/******************************************************************
- 功能描述:向VS1003的功能寄存器中寫入數據(一個字,即兩個字節)
- 隸屬模塊:VS1003B模塊
- 函數屬性:外部,用戶可調用
- 參數說明:addr是功能寄存器的地址
hdat是要寫入的高字節
ldat是要寫入的低字節
- 返回說明:無返回
******************************************************************/
void VS_Write_Reg(unsigned char addr,unsigned char hdat,unsigned char ldat)
{
//SET_VS_DREQ; //51單片機IO作輸入時先置為1
while( (VS_PIN&(1<<VS_DREQ)) == 0); //VS1003的DREQ為高電平時才接收數據
CLR_VS_XCS; //打開片選,SCI有效,這樣才能對功能寄存器進行讀寫
SPI_RW(0x02); //寫入操作碼0x02 00000010 (功能寄存器寫操作)
SPI_RW(addr); //寫入寄存器地址
SPI_RW(hdat); //寫入高字節
SPI_RW(ldat); //寫入低字節
SET_VS_XCS; //關閉片選,SCI無效
}
/******************************************************************
- 功能描述:從VS1003的功能寄存器中讀取數據(一個字)
- 隸屬模塊:VS1003B模塊
- 函數屬性:外部,用戶可調用
- 參數說明:addr是功能寄存器的地址
- 返回說明:返回從VS1003的功能寄存器中讀到的值
******************************************************************/
unsigned int VS_Read_Reg(unsigned char addr)
{
unsigned int temp=0;
//SET_VS_DREQ;
while( (VS_PIN&(1<<VS_DREQ)) == 0); //VS1003的DREQ為高電平時才接收數據
CLR_VS_XCS; //打開片選,SCI有效
SPI_RW(0x03); //讀出操作碼0x03 00000011(功能寄存器讀操作)
SPI_RW(addr); //寫入寄存器地址
temp=SPI_RW(0xff); //讀高字節
temp<<=8;
temp|=SPI_RW(0xff); //讀取低字節,與高字節拼成一個字
SET_VS_XCS; //關閉片選,SCI無效
return temp; //返回讀到的值
}
/******************************************************************
- 功能描述:VS1003軟復位及初始化(設置時鐘頻率及音量)
- 隸屬模塊:VS1003B模塊
- 函數屬性:外部,用戶可調用
- 參數說明:無
- 返回說明:無
******************************************************************/
void VS_Reset()
{
CLR_VS_XRESET;
_delay_ms(1000);
SET_VS_XRESET; //硬件復位,XRESET低電平有效
_delay_ms(1000);
VS_Write_Reg(0x00,0x08,0x04);//軟件復位,向0號寄存器寫入0x0804 SM_SDINEW為1 SM_RESET為1
VS_Write_Reg(0x03,0x98,0x00);//時鐘設置,向3號寄存器寫入0x9800 SC_MULT 為4 SC_ADD 為3 SC_FREQ為0
VS_Write_Reg(0x0b,0x00,0x00);//音量設置,左右聲道均最大音量
CLR_VS_XDCS; //打開數據片選,注意此時XCS(片選)為高電平,SDI有效
SPI_RW(0); //寫入數據,這里寫入4個0,是無關數據,用來啟動數據傳輸
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
SET_VS_XDCS; //關閉數據片選,SDI無效
}
/******************************************************************
- 功能描述:向VS1003寫入一個字節的音頻數據(即用于播放的數據)
注:調用前先將VS_XDCS置為0,打開數據片選
- 隸屬模塊:VS1003B模塊
- 函數屬性:外部,用戶可調用
- 參數說明:dat是要寫入的字節
- 返回說明:無
******************************************************************/
void VS_Send_Dat(unsigned char dat)
{
//SET_VS_DREQ;
while( (VS_PIN&(1<<VS_DREQ)) == 0); //VS1003的DREQ為高才能寫入數據
SPI_RW(dat);//通過SPI向VS1003寫入一個字節的音頻數據
}
/******************************************************************
- 功能描述:向VS1003寫入2048個0,用于清空VS1003的數據緩沖區
注:在播放完一個完整的音頻(如一首完整的MP3)后,調用
此函數,清空VS1003數據緩沖區,為下面的音頻數據(如下
一首MP3)作準備。
- 隸屬模塊:VS1003B模塊
- 函數屬性:外部,用戶可調用
- 參數說明:無
- 返回說明:無
******************************************************************/
void VS_Flush_Buffer()
{
unsigned int i;
SET_VS_XDCS; //打開數據片選,即開啟SDI傳輸
for(i=0;i<2048;i++)
{
VS_Send_Dat(0);
}
SET_VS_XDCS; //關閉數據片選
}
/******************************************************************
- 功能描述:正弦測試,這是測試VS1003芯片是否正常的有效手段!!
- 隸屬模塊:VS1003B模塊
- 函數屬性:外部,用戶可調用
- 參數說明:x決定了正弦測試中產生的正弦波的頻率,直接影響聽到的
聲音的頻率
- 返回說明:無
******************************************************************/
void VS_sin_test(unsigned char x)
{
VS_Write_Reg(0x00,0x08,0x20);//啟動測試,向0號寄存器寫入0x0820 SM_SDINEW為1 SM_TEST為1
//SET_VS_DREQ;
while( (VS_PIN&(1<<VS_DREQ)) == 0); //等待DREQ變為高電平
CLR_VS_XDCS; //打開數據片選 SDI有效
SPI_RW(0x53);//寫入以下8個字節,進入正弦測試
SPI_RW(0xef);
SPI_RW(0x6e);
SPI_RW(x); //參數x用來調整正弦測試中正弦波的頻率 FsIdx (b7~b5):采樣率表索引 S (b4~b0):正弦波的躍速 頻率F=Fs X S / 128
SPI_RW(0); //比如x=126 (0b 011 11110) FsIdx=011=3 Fs=22050Hz S=11110=30 F=22050Hz X 30 /128 =5168 Hz
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
_delay_ms(60000); //這里延時一段時間,為了聽到“正弦音”
SPI_RW(0x45);//寫入以下8個字節,退出正弦測試
SPI_RW(0x78);
SPI_RW(0x69);
SPI_RW(0x74);
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
SPI_RW(0);
SET_VS_XDCS; //關閉數據片選 ,SDI無效
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -