TI中文支持网
TI专业的中文技术问题搜集分享网站

TPA6130A2: 不知哪里原因程序中应答位总是高电平,请求技术高手能给与解答。

Part Number:TPA6130A2

关于TPA6130A2芯片没有反馈问题:

程序:

void IIC_Init(void)

{                

         GPIO_InitTypeDef GPIO_InitStructure;

         RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB, ENABLE );      

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_Init(GPIOB, &GPIO_InitStructure);

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; 

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

         GPIO_Init(GPIOB, &GPIO_InitStructure);

         GPIO_SetBits(GPIOB ,GPIO_Pin_5| GPIO_Pin_6|GPIO_Pin_7);    

}

void IIC_Start(void)

{       

SDA_OUT();     //SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

         IIC_SDA=1;               

IIC_SCL=1;

         delay_us(10);

        IIC_SDA=0;

         delay_us(5);

         IIC_SCL=0;

}

void IIC_Stop(void)

{

         SDA_OUT();     

IIC_SCL=0;

         IIC_SDA=0;

        delay_us(10);

         IIC_SCL=1;  

         IIC_SDA=1;

         delay_us(10);                                                             

}       

u8 IIC_Wait_Ack(void)

{

         u8 ucErrTime=0;

         IIC_SDA=1;delay_us(1);   

         SDA_IN();          IIC_SCL=1;delay_us(1);  

         while(READ_SDA)

         {

                   ucErrTime++;

                   if(ucErrTime>250)

                   {

                            IIC_Stop();

                           return 1;

                   }

         }

         IIC_SCL=0;    

         return 0; 

}

void IIC_Send_Byte(u8 txd)

{                       

u8 t;        

SDA_OUT();  

         delay_us(1);

         for(t=0;t<8;t++)

    {             

        IIC_SCL=0; delay_us(1);

                   if((txd&0x80)>>7)    IIC_SDA=1;

                   else  IIC_SDA=0;

                   txd<<=1; delay_us(1);                 

IIC_SCL=1; delay_us(1);

}       

         IIC_SCL=0;

}

u8 TPA6130_ReadOneByte(u8 ReadAddr)

{                                     

         u8 temp=0;                                                                                                                                            

    IIC_Start(); 

         IIC_Send_Byte(0xC0);              

IIC_Wait_Ack();

         IIC_Send_Byte(ReadAddr);     

IIC_Wait_Ack();                

    IIC_Start();   

    IIC_Send_Byte(0xC1);    

         IIC_Wait_Ack();                                                  

    temp=IIC_Read_Byte(0);                   

    IIC_Stop();

         return temp;

}

u8 TPA6130_ReadOneByte(u8 ReadAddr)

{                                     

         u8 temp=0;                                                                                                                                            

    IIC_Start(); 

         IIC_Send_Byte(0xC0);              

IIC_Wait_Ack();

         IIC_Send_Byte(ReadAddr);     

IIC_Wait_Ack();                

    IIC_Start();   

    IIC_Send_Byte(0xC1);    

         IIC_Wait_Ack();                                                  

    temp=IIC_Read_Byte(0);                   

    IIC_Stop();

         return temp;

}

int main(void)

{  

         u8 temp;

         SystemInit();   

         while(1)

    {   

        IIC_Start(); 

            IIC_Send_Byte(0xC0);           

            IIC_Wait_Ack();   

IIC_Send_Byte(0X04);

            IIC_Wait_Ack();         

       IIC_Start();      

       IIC_Send_Byte(0xC1);   

            IIC_Wait_Ack();                                           

       temp=IIC_Read_Byte(0);              

       IIC_Stop();                   

}

}

实际读寄存器4的版本号,应答位总是高。

蓝色波形为SCL时钟,黄色为SDA波形.

输入音频信号正常,TPA6130A2黄色图示为管脚18CPP,方波均值高电压5V,低电压为2V;蓝色为管脚17CPN.CPVSS(管脚15和管脚16)电压-2.7V

原理图:

不知哪里原因程序中应答位总是高电平,请求技术高手能给与解答。

songlin li:

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}//PB7_SDA:

#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}//PB7_SDA

u8 IIC_Read_Byte(unsigned char ack)

{

         unsigned char i,receive=0;

         SDA_IN();//SDA设置为输入

         IIC_SDA=1;       delay_us(1);

  for(i=0;i<8;i++ )

         {

receive<<=1;            

IIC_SCL=0;        delay_us(5);

    IIC_SCL=1;        delay_us(5);

    if(READ_SDA)

                            receive++;             

    }                          

    delay_us(5);   

    if (!ack)

        IIC_NAck();

    else

        IIC_Ack(); 

    IIC_SCL=0;     

    return receive;

}

,

Kailyn Chen:

您好,硬件上面,SD上拉电阻去掉,直接接VDD,并且将I2C的上拉电阻改大一些试试,是否能解决您的问题?

,

songlin li:

SD需要高低电平控制,不易直接VDD。I2C上拉电阻原10K测试不行,更改为1K3电阻后也不行,应答位始终没有反馈总是高电平。

,

Kailyn Chen:

您好,TPA6130A2 的从机地址是多少?因为有时候从机地址不正确也会导致收不到应答信号。

软件部分我不是很懂,也没有找到TPA6130A2的I2C code可以参考,但是可以移植一下其他正常I2C通讯的driver,做一下相应的修改,看是否能收到应答信号。

硬件部分,没什么问题,检查一下焊接是否没问题。

,

songlin li:

我是借用原子程序访问TPA6130A2芯片,IIC总线上只有主(MCU)和从(TPA6130A2)设备,其从设备地址1100000+R/W(0/1),读单字节程序:开始位+0xC0(写)+应答位+(读寄存器内容的)地址+应答位+开始位+0XC1(读)+应答位+(读寄存器里的)数据+不应答+停止位

,

Kailyn Chen:

时序方面,不需要主机发送重新开始位。 可直接为:

开始位+0xC0(写)+应答位+(读寄存器内容的)地址+应答位+(读寄存器里的)数据+应答+停。

另外,VDD使用的5V,I2C我看电路里上拉到3.3V?I2C参考的也是VDD,所以建议改为5V,5V的话,上拉电阻需要在1k~2Kohm之间,所以1K3没有问题。

,

songlin li:

VDD使用5V或3V3,结果都一样,主要是应答位无反应。感谢指导!

,

Kailyn Chen:

您好,抱歉回复晚了,不知您 问题怎么样了?我看了下I2C的波形,I2C clock 频率是多少的?在第一个时序图中,第9个clock,即从机地址之后就没有收到ACK应答位,并且Clock为什么也只有9个时钟?

另外,和主机接的I2C是用GPIO 模拟的I2C吗?如果是的话,GPIO引脚看下内部是否已经上拉,如果内部已经上拉,则SCL,SDA 则无需再上拉。

另外,对于TPA6130来说,上电时序也要注意以下,等电压上电起来稳定之后,再将reset拉高,然后再对I2C进行配置。

,

songlin li:

正确传输顺序:读单字节程序:开始位+0xC0(写、8位)+应答位(第9位)+0x04(8位)+应答位(第9位)+开始位+0XC1(读、8位)+应答位(第9位)+读寄存器里的数据+不应答+停止位。

主机接的I2C是用GPIO 模拟的I2C,GPIO引脚内部是开楼输出。程序运行到TPA6130,程序时才开始复位。

我用仿真单步执行时,应答位总是高电平,全速运行时用示波器观察到应答位总是高电平。

,

Kailyn Chen:

GPIO是开漏输出,内部是否已经集成上拉电阻?如果内部已经集成上拉电阻,外部也上拉,那么总电阻就变小,总电阻变小的话,那么Vcc-I*Rpu变大,导致电压拉不下来了,所以ACK信号总是呈现高电平。

,

songlin li:

内部没有上拉电阻,需要配置外部上拉电阻

,

Kailyn Chen:

您好,程序可以在其他slave上运行没问题,那和程序没问题。排除硬件,上拉没问题,可以再查一下layout,是不是SCL和SDA对应,防止由于疏忽导致SCL和SDA 交换导致的收不到ACK。

如果layout没问题,建议更换一片IC再试试。

赞(0)
未经允许不得转载:TI中文支持网 » TPA6130A2: 不知哪里原因程序中应答位总是高电平,请求技术高手能给与解答。
分享到: 更多 (0)