关于具有I2C总线的TEA6320的使用

现在先了解一下TEA6320,TEA6320是一个I2C总线控制音响应用的立体声放大器,,它的I2C协议和音量控制如下:

它的主要代码:



void delay1ms(unsigned int Delay ) //1ms延时
{
    unsigned int j;
    for(;Delay>0;Delay--)
    for(j=0;j<125;j++);
}

void init()                 ///总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总线检测到总线空闲才开始发送启动信号
{
    SDA=1;
    _nop_();
    SCL=1;
    _nop_();
}

void InitUART(void)
{
    TMOD = 0x20;                     //将Timer1设置为Mode2以产生波特率
    SCON = 0x50;                    //串口工作方式2
    TH1 = 0xfd;                        //波特率9600
    TL1 = TH1;
    PCON = 0x00;                    //将SMOD设置为0
    TR1 = 1;                        //开启定时器1
    EA=1;                           //开启总中断
    ES=1;                           //开启串口中断
}

void SendData(uchar Dat)             //发送数据
{
    ACC = Dat;
    CY=P;
    TB8=~CY;
    SBUF=ACC;
    while(!TI);
    TI = 0;                             //软件复位
}

void I2C_start()
{
    SDA=1;           //起始信号
    _nop_();
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SDA=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();

}
void I2C_stop()
{
    SDA=0;           //停止信号
    _nop_();
    SCL=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SDA=1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
void ack()   //应答信号
{
        SDA=0;
        _nop_();
        SCL=1;
        _nop_();
        SCL=0;
        _nop_();
//    SDA = 1;
//    SCL = 1;
//    _nop_();
//    while(SDA==1);
//    SCL = 0;
}

void I2C_sendByte(unsigned char dat)  //发送数据
{   unsigned char temp;
  unsigned char i;
  SCL=0;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  for(i=0;i<8;i++)                  //要发送的数据长度为8位
{
   temp=dat;
   if(temp<<i&0x80)
     SDA=1;                          //判断发送位
    else SDA=0;
    _nop_();
    SCL=1;                          //置时钟线为高,通知从机开始接受数据位
    _nop_();
    _nop_();
    _nop_();                      //保证时钟高电平周期大于4us                  `
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL=0;                          //拉低SCL,为下次数据传输做好准备
    _nop_();
    _nop_();
}
  SDA=1;                          //释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
     _nop_();
    _nop_();
    _nop_();
    _nop_();
}

main()
{
  InitUART();
  init();
  while(1)
{

    CS=1;
    A10=0;
    A11=0;
    A12=0;
    A13=0;
    A14=0;
    OE=0;         /*.....ENABLE变低,总线开始接受数据.....*/
    ALE=0;
    bb=0;
    ii=P0;
    aa=0xff;
    V24=0;
    if(ii==0x8f)                         //    5个按钮不动作,关的状态
    {
        delay1ms(50);
        if(ii==0x8f)
        {
            bb=0xf9;
            P0=bb;

            aa=0x11;
            delay1ms(200);
            CS=1;
            A10=1;
            A11=0;
            A12=0;
            A13=0;
            A14=0;
            WE=0;
            delay1ms(500);

        }
    }
    if(ii==0x8e)
    {
        delay1ms(50);
        if(ii==0x8e)
        {
            bb=0xf1;
            P0=bb;

            aa=0x11;
            delay1ms(200);
            CS=1;
            A10=1;
            A11=0;
            A12=0;
            A13=0;
            A14=0;
            WE=0;
            delay1ms(500);
            SendData(0xAA);
            I2C_start();
            I2C_sendByte(0x80);    //MAD,第一个字节
            ack();
            I2C_sendByte(0x00);    //SAD,第二个字节
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0x7f);       //声道选择 直接静音关闭,选通IAL和IAR
            ack();
            I2C_stop();
            delay1ms(5000);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0xff);       //声道选择 直接静音,选通IAL和IAR
            ack();
            I2C_stop();
            SendData(0x55);

        }
    }
    if(ii==0x8d)                          //4脚按钮动作处于开的状态
    {
        delay1ms(50);
        if(ii==0x8d)
        {
            bb=0xe9;
            P0=bb;

            aa=0x11;
            delay1ms(200);
            CS=1;
            A10=1;
            A11=0;
            A12=0;
            A13=0;
            A14=0;
            WE=0;
            delay1ms(500);
            SendData(0xAA);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0x7e);       //声道选择 直接静音关闭,选通IBL和IBR
            ack();
            I2C_stop();
            delay1ms(5000);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0xfe);       //声道选择 直接静音
            ack();
            I2C_stop();
            SendData(0x55);
        }
    }
        if(ii==0x8B)                            //8脚按钮动作处于开的状态
    {
        delay1ms(50);
        if(ii==0x8B)
        {
            bb=0xd9;
            P0=bb;

            aa=0x11;
            delay1ms(200);
            CS=1;
            A10=1;
            A11=0;
            A12=0;
            A13=0;
            A14=0;
            WE=0;
            delay1ms(500);

            SendData(0xAA);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0x7D);       //声道选择 直接静音关闭,选通ICL和ICR
            ack();
            I2C_stop();
            delay1ms(5000);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0xfD);       //声道选择 直接静音,选通ICL和ICR
            ack();
            I2C_stop();
            SendData(0x55);
        }
    }
    if(ii==0x87)                            //8脚按钮动作处于开的状态
    {
        delay1ms(50);
        if(ii==0x87)
        {
            bb=0xb9;
            P0=bb;

            aa=0x11;
            delay1ms(200);
            CS=1;
            A10=1;
            A11=0;
            A12=0;
            A13=0;
            A14=0;
            WE=0;
            delay1ms(500);

            SendData(0xAA);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0x7D);       //声道选择 直接静音关闭,选通ICL和ICR
            ack();
            I2C_stop();
            delay1ms(5000);
            I2C_start();
            I2C_sendByte(0x80);    //MAD
            ack();
            I2C_sendByte(0x00);    //SAD
            ack();
            I2C_sendByte(0x2C);       //响度 +20dB
            ack();
            I2C_sendByte(0x3f);       //前右 响度0dB
            ack();
            I2C_sendByte(0x3f);       //前左 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后右 响度0dB
            ack();
            I2C_sendByte(0x3F);       //后左 响度0dB
            ack();
             I2C_sendByte(0x10);       //低音 响度+15dB
            ack();
            I2C_sendByte(0x10);       //高音 响度+15dB
            ack();
            I2C_sendByte(0xfD);       //声道选择 直接静音,选通ICL和ICR
            ack();
            I2C_stop();
            SendData(0x55);
        }
    }
     if(ii==0x0f)
    {
        delay1ms(50);
        if(ii==0x0f)
        {
            bb=0x79;
            P0=bb;

            aa=0x11;
            delay1ms(200);
            CS=1;
            A10=1;
            A11=0;
            A12=0;
            A13=0;
            A14=0;
            WE=0;
            delay1ms(500);

        }
    }
    SendData(bb);
    delay1ms(500);
    if(aa==0xff)
    {
        P0=0x89;
        CS=1;
        A10=1;
        A11=0;
        A12=0;
        A13=0;
        A14=0;
        WE=0;
        delay1ms(500);

    }
    SendData(aa);
    delay1ms(500);

}

}
其中I2C的应答代码
void ack()   //应答信号
{
        SDA=0;
        _nop_();
        SCL=1;
        _nop_();
        SCL=0;
        _nop_();
//    SDA = 1;
//    SCL = 1;
//    _nop_();
//    while(SDA==1);
//    SCL = 0;
}

下面屏蔽的那几段代码会影响到I2C的接收,发送

怎么对TEA6320的理解呢,详看TEA6320的协议,MAD(从地址)是第一个字节,SAD(子地址)是第二个字节,第三个字节就是I2C真正要传输的数据,协议上说超过1个字节,数据将被发送,自动增加显著子地址,即TEA6320在写入数据超过1个字节的时候,子地址能自动递增,所以,子地址只需取列表第一个音量/响度的控制寄存器0x00,余下的子地址功能寄存器,系统会自动增加,而第三个字节就需要一一写上全部控制的数据。

这是本人自己查找资料结合自己的思考理解,有需要的同行看了,有发现什么不对的地方,请指出来,谢谢。

原文地址:https://www.cnblogs.com/weir1214/p/9692104.html

时间: 2024-10-31 09:31:54

关于具有I2C总线的TEA6320的使用的相关文章

I2C总线介绍及AT24C02驱动编写 笔记

中断处理程序 { 清除中断 硬件自动清除 软件清除 } CPU芯片手册相关章节 -------- I2C CPU外接设备的方式 1)GPIO简洁的方式(按键,LED) 通过设置GPIO管脚的状态来完成通信(控制) gpccon gpcpud gpcdat 2)类似于内存的接口 (DDRAM norflash nand dm9000) 从硬件上看CPU和芯片 数据线 地址先  BANK 3)协议类接口 uart I2C AT24C02    EEPROM 3,如何解决CPU和设备通信的问题 I2C

I2C总线协议学习笔记 (转载)

1.I2C协议   2条双向串行线,一条数据线SDA,一条时钟线SCL.   SDA传输数据是大端传输,每次传输8bit,即一字节.   支持多主控(multimastering),任何时间点只能有一个主控.   总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.   系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet. 1.1 I2C位传输   数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit: 

I2C总线介绍

1. 简介 I2C, Inter-Integrated Circuit, 是一种串行通信总线,用于连接微控制器及其外围设备它是一种两线式串行总线(串行数据:SDA; 串行时钟频率:SCL), 利用电阻将电位上拉, 典型的电压准位为+3.3V或+5V使用多主从架构, 主机是初始化总线的数据传输并产生允许传输的时钟信号的器件, 任何被寻址的器件都被认为是从机每个器件都有一个唯一的地址识别(共7个bit, 包括主机和从机), 而且都可以作为一个发送器或接收器(由器件的功能决定) 常见的应用如下:- 存

[I2C]I2C总线协议图解

转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递.在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平. 2  I2C总线特征 I2C总线上的每一个设备都可以作为主设备或者从设备

17、I2C总线和CAT24WCxx存储器

1.I2C串行总线概述 I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的总线裁决和高低速器件同步功能的高性能串行总线.I2C总线只有两根双向信号线.一根是数据线SDA,另一根是时钟线SCL. 2.I2C总线通过上拉电阻接正电源.当总线空闲时,两根线均为高电平.连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系. 3.每个接到I2C总线上的器件都有唯一的地址.主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发

(2)I2c总线SDA\SCL以及开始终止条件

I2C只用两条线(SDA和SCL)在连接到总线上的设备之间传送数据.每一个设备都由唯一的地址来识别(不管是微处理器.LCD驱动器.存储器或者键盘接口),并且可以依照设备的功能作为发送器或者接收器使用.LCD驱动器可能只是个接收器,而存储器可以发送和接受数据.除了发送器和接收器,当传送数据时设备还可以作为主机或者从机.主机就是初始化数据传输和产生时钟信号的设备,在那个时刻,任何被寻址的设备都是从机.        I2C总线是一个多主机总线.意味着可以连接多个可以控制总线的设备到总线上.主机通常是

(3)I2C总线的字节格式,时钟同步和仲裁

字节格式 发送到SDA线上的每个字节必须是8位.每次传输的字节数量是不受限制的.每个字节后必须跟着一个ACK应答位.数据从最高有效位(MSB)开始传输.如果从机要执行一些功能后才能接收或者发送新的完整数据,比如说服务一个内部中断,那么它可以将时钟线SCL拉低来强制使主机进入wait状态.当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行. ACK和NACK 每个字节后都有ACK发生.ACK应答位允许接收器通知发送器字节成功接收了下一个字节可以发送了.主机产生所有的时钟脉冲,包括

(5)I2C总线的10bit地址以及通用广播地址

其实,10bit地址我没用过,通用广播地址更没用过.通用广播地址应该是在多个mcu之间用i2c进行通信时使用的.虽说没用到,但还是做了翻译,说不定以后有机会用到: 10bit地址 10bit的寻址扩展可能寻址的数目.有7bit地址和10bit地址的设备可以连接到相同的I2C总线上,而且7bit寻址和10bit寻址都可以用在所有的总线速度模式下.不过,10bit寻址用的不多. 10bit的从机地址由开始条件(S)或重复开始条件(Sr)后的两个字节组成.第一个字节的前7位是1111 0XX,XX是1

(4)I2C总线的7bit从机地址

时钟拉伸(Clock stretching)clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟.从字节级来看,一个设备可能在快速模式下接受数据,但是需要更多的时间来存储接收到的字节或者准备将要传输的另一个字节.从机可以以一种握手的处理方式在接受和应答字节后将SCL线拉低来强制使得主机进入wait状态知道从机准备好下一个字节的传输.从