热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PT2313中文资料及其程序电路图与

下面是PT2313的应用电路图与引脚图:

下面是PT2313的应用电路图与引脚图:


pt2313是一款比较便宜音效处理芯片,用来替换 npc110p 芯片,这里我给大家介绍他的中文资料.
pt2313芯片的功能比npc110p 芯片差好多,所以驱动也很简单。
关于pt2316的pdf资料下载:http://www.51hei.com/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.51hei.com/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 PT2313_Addr       0x88          // 芯片地址

#define Stereo1           0x00          // 音源通道选择
#define Stereo2           0x01
#define Stereo3           0x02
#define Stereo4           0x03

#define VolCtrlCmd        0x00          // 控制命令
#define ATTRLCtrlCmd      0xc0
#define ATTRRCtrlCmd      0xe0
#define ATTFLCtrlCmd      0x80
#define ATTFRCtrlCmd      0xa0
#define SwitchCtrlCmd     0x40
#define BassCtrlCmd       0x60
#define TreblwCtrlCmd     0x70

#define GAIN0             0x18          //0dB
#define GAIN1             0x10          //0.75dB
#define GAIN2             0x08          //7.5dB
#define GAIN3             0x00          //12.25dB

#define LOUDON            0x00
#define LOUDOFF           0x04

#define Volume_Default    10            // 默认值
#define Treble_Default    7
#define Bass_Default      7

#define Vol_Max_Val       20

#define USER              0x00          // 音效
#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;

TagAudVal AUDVAR;                       // 全局变量 用于保存设置值

unsigned char I2C_Buffer[17];

typedef enum
{
    I2C_ERROR,
    I2C_SUCCESS
} I2C_RETURN;

unsigned char ToneTbl[15]=                      // 高低音设置值
{
    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正常 */
};

unsigned char MasterVolTbl[]=     /*step:1.25db 音量值 */
{
/*  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

};

unsigned char BalanceFaderTbl[13][2]=
{
    //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},
};

unsigned char ATT_TBL[13]=
{
    0x00,
    0x03,
    0x06,
    0x09,
    0x0c,
    0x0f,
    0x1f,
    0x1f,
    0x1f,
    0x1f,
    0x1f,
    0x1f,
    0x1f,
};
/*************************** PT2313 数据结构 ***************************/
------------------------------------------------------------------------
pt2313.c
------------------------------------------------------------------------
/*************************** PT2313 控制 ***************************/

static unsigned char I2C_Write_Byte(unsigned char data)                 
{
    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__); 

    return 0;
}

void I2C_Write(unsigned char device_addr,unsigned char *buf,unsigned char num)
{
    unsigned char i;
   
    for(i=0; i    {
        DEBUGOUT("I2C_Write_Byte = 0X%X", *buf);
        I2C_Write_Byte(*buf++);
    }
}

/* 音频通道切换 */
void AudioSwitch(unsigned char channel)
{
    unsigned char temp = 0;

    channel > 3 ? channel = 3 : channel;
   
    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;

    if(AUDVAR.EQ == USER)                       // 设置指定值
    {
        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.EQ == USER)
    {
/*
        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];

    //front vol
    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);

    //rear vol
    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;

    ISVal(Val, MasterVolTbl);
    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.EQ = USER;
    AUDVAR.BassVal = Bass_Default;            // 默认低音值
    BassControl();                            // 设置低音

    AUDVAR.TrebleVal = Treble_Default;        // 默认高音值
    TrebleControl();                          // 设置高音

    AUDVAR.MasterVolVal = Volume_Default;     // 默认音量
    MasterVolControl(AUDVAR.MasterVolVal);    // 设置默认音量

    AUDVAR.FadeVal= 6;                        // 增益
    AUDVAR.BalVal = 6;                        // 均衡
    BalanceFaderControl();                    // 设置左右平衡
}


/*************************** PT2313 控制 ***************************/
 
2014-11-12
注意:如果要实现单独设置高音或低音功能时,代码都要同时设置pt2313的高低音配置 
 


关闭窗口

推荐阅读
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • KVC:Key-valuecodingisamechanismforindirectlyaccessinganobject’sattributesandrelations ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 作用域链迷惑性代码vara100;functiontest(){console.log(a);}functiontestFun(){vara200;test();}不假思索的想到出 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
author-avatar
女人放聪明点碧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有