發一個好久前網上找的主程序,版主可參考
/*****************************************************
SCH是網上找的,也可參照手冊的:
我用的是PT2314E低電壓(4~10V) 我仔細看了一下操作方法跟PT2314一樣,也有喝多其他兼容的IC
PT2314/CSC2314四聲道輸入音質處理器IC應用電路原理圖及使用指導說明
功能概述和特性
PT2314四組立體聲輸入,兩聲道輸出。輸入帶響度的數字控制立體聲音質處理
器,IIC控制,6V-10V,兼容PT2314/CSC2313/TC7314/CD3314,采用SOP-28/DIP-
28封裝。它適用于車載收音機和高保_真音質系統。本產品提供可選擇的輸入增益和外部
響度功能,并且由微處理器串行I2C總線介面控制。主要功能如下:
① 使用CMOS技術
② 輸入多路復用:
4個立體聲輸入
對不同的音源具有最佳適應的可選擇的輸入增益
③ 帶響度功能,高音,低音控制
④ 音量控制(每級1.25dB)
⑤ 高音和低音控制
⑥ 二個喇叭衰減器:
二個獨立的揚聲器均衡和音量控制裝置
獨立的靜音功能
⑦ 通過串性I2C總線可實現所有功能的程序化。
代碼:
START condition:
SCLK: -----------|______
SDIO:-----|_____________
1 | 2 | 3
STOP condition:
SCLK: ____|--------------
SDIO:____________|-------
1 | 2 | 3
DATA:
SCLK:_______________|---|________|----|_______
SDIO:___________|------------|____________|----
|<==========>|
RESET:
SENB:__|---------------------------------------------
SDIO:_________________________________________|------
RST: ___________|------------------------------------
SCLK:__|---------------------------------------------
| 1 | 2 | 3
START condition:
SCLK: -----------|______
SDIO:-----|_____________
1 | 2 | 3
falling edge of SDIO while SCLK is
high) does not occur within 300 ns before the rising edge of RST.
**************************************/
void start()
{
P0CONL = 0xB8; // 輸出 // Configure SDIO as push-pull
set_sdio;
set_sclk;
__NOP();__NOP();// tSU:STA
clr_sdio;
__NOP();__NOP();// tHD:STA
clr_sclk;
}
void iic_stop()
{
P0CONL = 0xB8; // 輸出 // Configure SDIO as push-pull
clr_sclk;
__NOP();__NOP();// tf:IN + tLOW
clr_sdio;
__NOP();__NOP();
set_sclk;
__NOP();__NOP(); // tf:IN + tSU:STO
set_sdio;
}
//////////////////I2C不應答//////////
void noack()
{
P0CONL = 0xB8;// 輸出// Configure SDIO as push-pull
set_sdio ;
__NOP();__NOP(); // tf:IN + tLOW
set_sclk;;
__NOP();__NOP();// tf:IN + tHIGH
}
////////////*發送應答位*/////////////////////
void mack( )
{
P0CONL = 0xB8;// 輸出// Configure SDIO as open-drain
clr_sdio;
__NOP();__NOP(); // tf:IN + tLOW
set_sclk;;
__NOP();__NOP();// tf:IN + tHIGH
}
//////////I2C等待器件應答///////////////
void ack()
{
unchar i=200;
P0CONL = 0x88; // 輸入
clr_sclk ;
__NOP();__NOP();// tf:IN + tLOW
set_sclk ;
__NOP();__NOP();// tf:IN + tHIGH
while (--i) //等待ASK
{
__NOP();__NOP();
//set_sdio ; //釋放總線
if (!test_sdio) break; //跳出
//clr_sclk ; //??????????????????????????????
}
clr_sclk ;
__NOP();__NOP();// tf:IN
}
/////////I2C讀一個字節//////////////
unsigned char rd(void)
{
unchar out=0;
unchar i; //有8位數據
P0CONL = 0x88; // 輸入
for(i=0;i<8;i++)
{
set_sclk;
__NOP();__NOP();
if(test_sdio)set_bit(out,bit0);
else clr_bit(out,bit0);
if(i<7) out<<=1;//下一位
clr_sclk ;
__NOP();__NOP();// tf:IN
__NOP();__NOP(); // tLOW
}
return out;
}
///////I2C寫一個字節/////////////
void wd(unsigned char dd) //
{
unchar i=8;
P0CONL = 0xB8;// 輸出
while(i--)
{
if(dd&0x80)set_sdio ;
else clr_sdio;
__NOP();__NOP(); // tLOW
set_sclk;
__NOP();__NOP(); // tf:IN + tHIGH;
clr_sclk ;
__NOP();__NOP();// tf:IN
dd<<=1; __NOP();
}
ack();
}
#include "i2c.h"
#define PT2314_ADD 0x88 //PT2314的地址碼
#define A_NORMAL 0X01
#define A_BASS 0X02
#define A_TREBLE 0X03
#define A_SPL 0X04
#define A_SPR 0X05
#define A_CH 0X06
#define PT2314_UP 0X01
#define PT2314_DOWN 0X00
unchar PT2314_INIT_DATA[] =
{
0x41, // switch 選擇第二通道
0x10, // volume -10DB
0xC0, // speaker-l 0DB
0xE0, // speaker-r 0DB
0x60, // bass -14DB
0x70 // treble -14DB
}; //0x41為選擇第二通道
__code const unchar TONE_TAB[] =
{
0x00, //-14dB
0x01, //-12dB
0x02, //-10dB
0x03, //-08dB
0x04, //-06dB
0x05, //-04dB
0x06, //-02dB
0x07, //+00dB
0x0E, //+02dB
0x0D, //+04dB
0x0C, //+06dB
0x0B, //+08dB
0x0A, //+10dB
0x09, //+12dB
0x08 //+14dB
} ;
unchar bass=0 ;
unchar treble=0 ;
unchar mode_set=0 ;
/***************************************************************************
************************* PT2314 寫入一個字節*****************************
***************************************************************************/
void PT2314SetReg(unchar dat) //register value //寫入一個字節
{
start();
wd(PT2314_ADD);
wd(dat);
iic_stop();
}
/****************************************************************************
************************PT2314 寫入多個字節***************************
****************************************************************************/
void PT2314SetNRegs(unchar *pRegVal,unchar n)//*pRegVal=pointer to register value,n=data length
{ //寫入多個字節
unchar i;
start();
wd(PT2314_ADD);
for(i = 0; i < n; i++)
{
wd(pRegVal);
}
iic_stop();
}
/****************************************************************************
************************通道轉換選擇(0~3)**************************
****************************************************************************/
void SwitchAudioOuputChannel(unchar ch_UpDown)
{
if((ch_UpDown==1)&&(PT2314_INIT_DATA [0]<0x43)) //ch up
{
PT2314_INIT_DATA [0]++;
}
else if((ch_UpDown==0)&&(PT2314_INIT_DATA [0]>0x40)) //ch down
{
PT2314_INIT_DATA [0]--;
}
else
{
return;
}
// dis_fre=PT2314_INIT_DATA [0];
PT2314_INIT_DATA [1] = 0x18; //音量輸出 -30dB
PT2314SetNRegs(PT2314_INIT_DATA, 6);
}
/**************************************************************
function name : RdVolChange 聲音控制
parameter: if UpDown is true,turn up vol,else turn down
function: adjust the vol
**************************************************************/
void RdVolChange(unsigned char Vol_UpDown)
{
if((Vol_UpDown== 1)&&(PT2314_INIT_DATA [1]>0x00)) //vol up
{
PT2314_INIT_DATA [1]--;
}
else if((Vol_UpDown==0)&&(PT2314_INIT_DATA [1]<0x3F)) //vol down
{
PT2314_INIT_DATA [1]++;
}
else
{
return;
}
// dis_fre=PT2314_INIT_DATA [1];
PT2314SetReg(PT2314_INIT_DATA[1]);
}
/**************************************************************
function name : bassChange 低音控制
parameter: if UpDown is true,turn up vol,else turn down
function: adjust the vol
**************************************************************/
void bassChange(unsigned char bass_UpDown)
{ //ToneBass
if((bass_UpDown==1)&&(bass<0x0e))
{
bass++;
}
else if((bass_UpDown==0)&&(bass!=0))
{
bass--;
}
else
{
return;
}
//dis_fre=TONE_TAB[bass];
PT2314_INIT_DATA[4]=(TONE_TAB[bass]|0x60);
PT2314SetReg(PT2314_INIT_DATA[4]);
}
/**************************************************************
function name : trebleChange 高音控制
parameter: if UpDown is true,turn up vol,else turn down
function: adjust the vol
**************************************************************/
void trebleChange(unsigned char treble_UpDown)
{ //Tonetreble
if((treble_UpDown==1)&&(treble<0x0e))
{
treble++;
}
else if((treble_UpDown==0)&&(treble!=0))
{
treble--;
}
else
{
return;
}
//dis_fre=TONE_TAB[treble];
PT2314_INIT_DATA[5]=(TONE_TAB[treble]|0x70);
PT2314SetReg(PT2314_INIT_DATA[5]);
}
/**************************************************************
function name : speak_lChange 左聲道衰減控制
parameter:
function:
**************************************************************/
void speak_lChange(unsigned char speak_lUpDown)
{ //Tonetreble
if((speak_lUpDown== 1)&&(PT2314_INIT_DATA [2]>0xC0)) //vol up
{
PT2314_INIT_DATA [2]--;
}
else if((speak_lUpDown==0)&&(PT2314_INIT_DATA [2]<0xDF)) //vol down
{
PT2314_INIT_DATA [2]++;
}
else
{
return;
}
// dis_fre=PT2314_INIT_DATA [2];
PT2314SetReg(PT2314_INIT_DATA [2]);
}
/**************************************************************
function name : speak_rChange 右聲道衰減控制
parameter:
function:
**************************************************************/
void speak_rChange(unsigned char speak_rUpDown)
{ //Tonetreble
if((speak_rUpDown== 1)&&(PT2314_INIT_DATA [3]>0xE0)) //vol up
{
PT2314_INIT_DATA [3]--;
}
else if((speak_rUpDown==0)&&(PT2314_INIT_DATA [3]<0xFF)) //vol down
{
PT2314_INIT_DATA [3]++;
}
else
{
return;
}
// dis_fre= PT2314_INIT_DATA [3];
PT2314SetReg(PT2314_INIT_DATA [3]);
}
/**************************************************************
function name : PT2314Mute
parameter: if MuteOpen is ture,then mute PT2314,else turn to mormal
function: open ro close PT2314's mute function
**************************************************************/
void PT2314Mute(unchar MuteOpen)
{
if(MuteOpen)
{
PT2314SetReg(0xFF); //mute speaker R
PT2314SetReg(0xdF); //mute speaker L
}
else
{
PT2314SetReg(0xe0); //open speaker R
PT2314SetReg(0xc0); //open speaker L
}
}
//
/**************************************************************
function name : Audio_functions_UP
parameter:
function: 增加音量 音調
**************************************************************/
void Audio_functions_UP(unchar sel_mark)
{
switch( sel_mark )
{
case 0:
sel_mark=A_NORMAL;
case A_NORMAL:
RdVolChange(PT2314_UP);
break;
case A_BASS:
bassChange(PT2314_UP);
break;
case A_TREBLE:
trebleChange(PT2314_UP);
break;
case A_SPL:
speak_lChange(PT2314_UP);
break;
case A_SPR:
speak_rChange(PT2314_UP);
break;
case A_CH:
SwitchAudioOuputChannel(PT2314_UP);
break;
default:
break;
}
}
/**************************************************************
function name : Audio_functions_DOWN
parameter: 減小音量 音調
function:
**************************************************************/
void Audio_functions_DOWN(unchar sel_mark)
{
switch( sel_mark )
{
case 0:
sel_mark=A_NORMAL;
case A_NORMAL:
RdVolChange(PT2314_DOWN);
break;
case A_BASS:
bassChange(PT2314_DOWN);
break;
case A_TREBLE:
trebleChange(PT2314_DOWN);
break;
case A_SPL:
speak_lChange(PT2314_DOWN);
break;
case A_SPR:
speak_rChange(PT2314_DOWN);
break;
case A_CH:
SwitchAudioOuputChannel(PT2314_DOWN);
break;
default:
break;
}
}
|