下面是PT2313的應用電路圖與引腳圖:
pt2313是一款比較便宜音效處理芯片,用來替換 npc110p 芯片,這里我給大家介紹他的中文資料.
pt2313芯片的功能比npc110p 芯片差好多,所以驅動也很簡單。
關于pt2316的pdf資料下載:http://www.zg4o1577.cn/f/pt2313.pdf
pt2313 特點:
1、支持3個音源通道輸入切換(可以做音頻混合),四組音頻輸出通道(前、后、左、右)
2、支持調節高、低音音效、音量、前后左右增益與均衡控制
該芯片采用I2C通信協議,直接按照官方給定的格式通過I2C寫入芯片即可。芯片I2C地址: 0x88
命令格式:地址+數值
音量設置命令格式: 00
00 B2 B1 B0 A2 A1 A0
B2\B1\B0:每階 -10dB 衰減
A2\A1\A0: 每階 -1.25dB 衰減
左右聲道衰減命令:110(左)、111(右)
11x B1 B0 A2 A1 A0
B1\B0:每階 -10dB 衰減
A2\A1\A0: 每階 -1.25dB 衰減
B1\B0\A2\A1\A0:全為1 則是是Mute靜音。
具體數值參考 pt2014規格書.pdf
音源通道切換、響度、增益控制:010
010 G1 G0 S2 S1 S0
010:命令標識
G1\G0: 增益值,00:+11.25dB 01:+7.5dB 10:+3.75dB 11:+0dB
S2:0->啟用指定音源通道 1->關閉指定音源通道
S1\S0:源通道選擇,00:通道1 01:通道2 10:通道3 11:通道4(2314才有)(對應芯片 RINx\LINx 引腳)
高低音設置命令:0111(高)、0110(低)
011x C3 C2 C1 C0
C3\C2\C1\C0:每加1 增益+2dB 從 -14dB ~ +14dB 值越大越響
PT2313的單片機程序下載地址:http://www.zg4o1577.cn/f/pt2313code.rar
以下是關于驅動程序的介紹:
1、設置音源通道
// 音源命令 、0dB、啟用、音源通道1
temp = 0x40 | 0x18 | 0x00 | x00;
I2C_Write_Byte(temp);
2、設置高低音
// 高音命令、0dB
temp = 0x60 | 0x07;
I2C_Write_Byte(temp);
// 低音命令、0dB
temp = 0x70 | 0x07;
I2C_Write_Byte(temp);
3、設置音量值
// 音量命令、-17.5dB
temp = 0x00 | 0x0E;
I2C_Write_Byte(temp);
4、設置左右聲道衰減
將各個功能封裝成函數即可,需要時再調用。
// 調試信息 __ISDEBUG__ 宏被定義則打印調試信息,未被定義則為空
#define __ISDEBUG__
#ifdef __ISDEBUG__
#define DEBUGOUT(format,...) printk(" --> Fun: %s, Line: %05d "format" <--\n", __func__, __LINE__,##__VA_ARGS__)
#else
#define DEBUGOUT(format,...) do{}while(0)
#endif
#define GETARRSIZE(arr) ((sizeof(arr)/sizeof(arr[0])))
#define ISVal(variable, _arr) (variable > GETARRSIZE(_arr) - 1 ? variable = GETARRSIZE(_arr) - 1 : variable)
實例代碼:
(考慮公司源碼非公開性,源碼取自網上,不完整,我只是稍作修改,可靠性及穩定性欠考驗,僅用于理解 PT2313芯片的使用。)
------------------------------------------------------------------------
pt2313.h
------------------------------------------------------------------------
/*************************** PT2313 數據結構 ***************************/
#define ON 1
#define OFF 0
#define Stereo2 0x01
#define Stereo3 0x02
#define Stereo4 0x03
#define ATTRLCtrlCmd 0xc0
#define ATTRRCtrlCmd 0xe0
#define ATTFLCtrlCmd 0x80
#define ATTFRCtrlCmd 0xa0
#define SwitchCtrlCmd 0x40
#define BassCtrlCmd 0x60
#define TreblwCtrlCmd 0x70
#define GAIN1 0x10 //0.75dB
#define GAIN2 0x08 //7.5dB
#define GAIN3 0x00 //12.25dB
#define LOUDOFF 0x04
#define Treble_Default 7
#define Bass_Default 7
#define POP 0x01
#define CLAS 0x02
#define ROCK 0x03
#define JAZZ 0x04
#define NORMAL 0x05
#define GETARRSIZE(arr) ((sizeof(arr)/sizeof(arr[0])))
#define ISVal(variable, _arr) (variable > GETARRSIZE(_arr) - 1 ? variable = GETARRSIZE(_arr) - 1 : variable)
typedef struct
{
unsigned char CrtAudioCh;
unsigned char LoudnessSta;
unsigned char MasterVolVal;
unsigned char TempVolVal;
unsigned char TrebleVal;
unsigned char BassVal;
unsigned char FadeVal;
unsigned char BalVal;
unsigned char EQ;
} TagAudVal;
{
I2C_ERROR,
I2C_SUCCESS
} I2C_RETURN;
{
0x00,//-14dB
0x01,//-12dB
0x02,//-10dB
0x03,//-8dB
0x04,//-6dB
0x05,//-4dB
0x06,//-2dB
0x07,//0dB
0x0e,//2//2dB
0x0d,//4//4dB
0x0c,//6dB
0x0b,//8dB
0x0a,//10dB
0x09,//12dB
0x08,//14dB
};
unsigned char SoundEffect[5][2]=
{
/* bass treble effect */
{0x0e,0x0d}, /* 02db 04db pop 流行 */
{0x0e,0x0e}, /* 02db 02db clas 古典 */
{0x0c,0x07}, /* 06db 00db rock 搖滾 */
{0x0a,0x0e}, /* 10db 02db jazz 爵士 */
{0x07,0x07}, /* 00db 00db normal正常 */
};
{
/* 0x3f,//-78.75dB
0x3c,//-75.00dB
0x3a,//-72.50dB
0x38,//-70.00dB
0x36,//-67.50dB
0x34,//-65.00dB
0x32,//-62.50dB
0x30,//-60.00dB
0x2e,//-57.50dB
0x2c,//-55.00dB
0x2a,//-52.50dB
0x28,//-50.00dB
0x26,//-47.50dB
0x24,//-45.00dB
0x22,//-42.50dB
*/
0x3f,//-78.75dB
0x20,//-40.00dB
0x1e,//-37.50dB
0x1c,//-35.00dB
0x1a,//-32.50dB
0x18,//-30.00dB
0x16,//-27.50dB
0x14,//-25.00dB
0x12,//-22.50dB
0x10,//-20.00dB
0x0e,//-17.50dB
0x0c,//-15.00dB
0x0a,//-12.50dB
0x08,//-10.00dB
0x06,//-7.50dB
0x04,//-5.00dB
0x02,//-2.50dB
0x00,//-0.00dB
{
//rear front……fader
//right left ……balance
{0x06,0x00},
{0x05,0x00},
{0x04,0x00},
{0x03,0x00},
{0x02,0x00},
{0x01,0x00},
{0x00,0x00},
{0x00,0x01},
{0x00,0x02},
{0x00,0x03},
{0x00,0x04},
{0x00,0x05},
{0x00,0x06},
};
{
0x00,
0x03,
0x06,
0x09,
0x0c,
0x0f,
0x1f,
0x1f,
0x1f,
0x1f,
0x1f,
0x1f,
0x1f,
};
/*************************** PT2313 數據結構 ***************************/
------------------------------------------------------------------------
pt2313.c
------------------------------------------------------------------------
/*************************** PT2313 控制 ***************************/
{
int ret = 0;
ret = i2c_master_send(g_pt2313_Dev->client, &data, sizeof(data));
if(ret == 0)
printk(" --> Fun: %s, Line: %05d i2c_master_send failure!! <--\n", __func__, __LINE__);
}
{
unsigned char i;
for(i=0; i<num; i++)
{
DEBUGOUT("I2C_Write_Byte = 0X%X", *buf);
I2C_Write_Byte(*buf++);
}
}
void AudioSwitch(unsigned char channel)
{
unsigned char temp = 0;
DEBUGOUT("Audio Channel = %d ", channel);
switch(channel)
{
case 1:
temp = SwitchCtrlCmd | Stereo1;
temp |= GAIN0;
break;
case 2:
temp = SwitchCtrlCmd | Stereo2;
temp |= GAIN0;
break;
case 3:
temp = SwitchCtrlCmd | Stereo3;
temp |= GAIN0;
break;
default:
temp = SwitchCtrlCmd | Stereo1;
temp |= GAIN0;
break;
}
if(AUDVAR.LoudnessSta == OFF)
temp |= LOUDOFF;
else
temp |= LOUDON;
I2C_Buffer[0] = temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
}
void BassControl(void)
{
unsigned char temp;
{
ISVal(AUDVAR.TrebleVal, ToneTbl); // 超限控制
temp = ToneTbl[AUDVAR.BassVal];
}
else
{
AUDVAR.EQ --;
ISVal(AUDVAR.EQ, SoundEffect); // 超限控制
temp = SoundEffect[AUDVAR.EQ][0]; // 設置指定音效
}
I2C_Buffer[0] = BassCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
}
void TrebleControl(void)
{
unsigned char temp;
{
/*
if(AUDVAR.TrebleVal > GETARRSIZE(ToneTbl) - 1)
AUDVAR.TrebleVal = GETARRSIZE(ToneTbl) - 1 ;
*/
ISVal(AUDVAR.TrebleVal, ToneTbl); // 超限控制
temp = ToneTbl[AUDVAR.TrebleVal];
}
else
{
AUDVAR.EQ --;
ISVal(AUDVAR.EQ, SoundEffect); // 超限控制
temp = SoundEffect[AUDVAR.EQ][1];
}
I2C_Buffer[0] = TreblwCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
}
void BalanceFaderControl(void)
{
unsigned char temp;
unsigned char BR;// balance right 平衡右
unsigned char BL;// balance left 平衡左
unsigned char FF;// balance front 平衡前
unsigned char FR;// balance rear 平衡后
ISVal(AUDVAR.BalVal, BalanceFaderTbl); // 超限控制
ISVal(AUDVAR.FadeVal, BalanceFaderTbl); // 超限控制
BR = BalanceFaderTbl[AUDVAR.BalVal][0];
FF = BalanceFaderTbl[AUDVAR.FadeVal][1];
BL = BalanceFaderTbl[AUDVAR.BalVal][1];
FR = BalanceFaderTbl[AUDVAR.FadeVal][0];
temp = ATT_TBL[FF+BR];
I2C_Buffer[0] = ATTFRCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
temp = ATT_TBL[FF+BL];
I2C_Buffer[0] = ATTFLCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
temp = ATT_TBL[FR+BL];
I2C_Buffer[0] = ATTRRCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
temp = ATT_TBL[FR+BR];
I2C_Buffer[0] = ATTRLCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
/* 主音量控制 */
void MasterVolControl(unsigned char Val)
{
unsigned char temp;
temp = MasterVolTbl[Val];
I2C_Buffer[0] = VolCtrlCmd | temp;
I2C_Write(PT2313_Addr,I2C_Buffer,1);
BalanceFaderControl();
}
void AudioMute(char MuteOn)
{
if(MuteOn) // 靜音
{
DEBUGOUT("Mute on...");
I2C_Buffer[0] = ATTRLCtrlCmd | 0x1f;
I2C_Write(PT2313_Addr, I2C_Buffer,1);
I2C_Buffer[0] = ATTRRCtrlCmd | 0x1f;
I2C_Write(PT2313_Addr, I2C_Buffer,1);
I2C_Buffer[0] = ATTFLCtrlCmd | 0x1f;
I2C_Write(PT2313_Addr, I2C_Buffer,1);
I2C_Buffer[0] = ATTFRCtrlCmd | 0x1f;
I2C_Write(PT2313_Addr, I2C_Buffer,1);
}
else
{
DEBUGOUT("Mute off...");
BassControl();
TrebleControl();
BalanceFaderControl();
MasterVolControl(AUDVAR.MasterVolVal);
}
}
/* 音頻初始化 */
void AudioInit(void)
{
AUDVAR.LoudnessSta = ON;
AudioSwitch(1); // 設置音頻輸入通道
AUDVAR.BassVal = Bass_Default; // 默認低音值
BassControl(); // 設置低音
TrebleControl(); // 設置高音
MasterVolControl(AUDVAR.MasterVolVal); // 設置默認音量
AUDVAR.BalVal = 6; // 均衡
BalanceFaderControl(); // 設置左右平衡
}
/*************************** PT2313 控制 ***************************/
2014-11-12
注意:如果要實現單獨設置高音或低音功能時,代碼都要同時設置pt2313的高低音配置