This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于TLV320AIC3x的I2C接口没有回应

Other Parts Discussed in Thread: TLV320AIC32

你好,TI的工程师!

我现在使用ARM单片机的裸机程序驱动TLV320AIC3x,硬件电路连接如下图:

硬件电路已测试供电、复位均正常(有硬件的RC复位,也用了ARM单片机的一个GPIO口复位,上电拉低1ms后拉高,这个复位信号过后测试过运行过程中是一直高正常的)。用示波器测试 SCL SDA有单片机发过来的时序信号,并且已经验证了我的单片机程序可以正常的驱动另外一个I2C接口的从设备芯片(我在我的目标板上飞线到另外的板子上的IIC接口芯片试过,当然从器件地址相应需要修改)。现在的问题是,我在程序里试着用IIC读320寄存器里面的数据,发现读出来的结果是FF,跟没有连接320一样的效果(上拉电阻的效果),改变所读的寄存器的地址,现象是一样的。PS:我是用GPIO口模拟IIC时序的。

下面是我的程序片段:

#define     TLV320AIC32_IIC_WR_ADDR        0x30    //TLV320AIC320 IIC写地址

//读函数

void Tlv320aic3x_WriteByte(uint8 DevWrAddr,uint8 MemAddr,uint8 Dat,uint8 Channel)
{
IIC_Start(Channel);
IIC_WriteByte(DevWrAddr,Channel);
IIC_Ack(Channel);
IIC_WriteByte(MemAddr,Channel);
IIC_Ack(Channel);
IIC_WriteByte(Dat,Channel);
IIC_Ack(Channel);
IIC_Stop(Channel);
}

//写函数

uint8 Tlv320aic3x_ReadByte(uint8 DevWrAddr,uint8 MemAddr,uint8 Channel)
{
uint8 temp=0;
IIC_Start(Channel);
IIC_WriteByte(DevWrAddr,Channel);
IIC_Ack(Channel);
IIC_WriteByte(MemAddr,Channel);
IIC_Ack(Channel);
IIC_Start(Channel);
IIC_WriteByte(DevWrAddr|0x01,Channel);
IIC_Ack(Channel);
temp=IIC_ReadByte(Channel); //×?oóò????TDèACK
IIC_Stop(Channel);
return temp;
}

请问是可能的原因是什么呢?是硬件哪里没有设计对,还是软件有什么注意的?谢谢!!!

  • 我感觉还是器件没有准备好的条件, 先看看 i2c 通信中从机发出了 ack 信号了吗?

    如果没有, 你再检查检查焊接问题吧

  • 你好,已确认320是没有回复ACK的,见以下波形,另外我程序中有开看门狗功能,当我将等待从机返回ACK时的超时程序改成一直等待从机返回时,看门狗不停复位,这样说明从机确实没有返回ACK。器件重新拖焊了IIC的两个管脚,用万用表也测试了通断,是没问题的。难道是器件坏了吗?

  • Hi,

    你程序里写数据加点延时看看,从波形上看第3个和第5个时钟的上升沿刚好为数据的上升沿和下降沿了,估计数据接收错误了而没有应答。

  • 我程序里写完数据是有延时的 ,可能是示波器的每格时间设置的比较大,导致图像上看起来时钟和数据几乎重叠。

    现在问题已经找到了问题原因,我的电路中使用了两片TLV320AIC3x,用了4个IO口分别模拟两路I2C信号,而它们的复位脚我是用CPU的一个IO口来同时复位它们的,现在怀疑好像这样复位有问题,下周准备用热风枪将其中一片吹下来再看看能不能正常复位。因为上电后,如果它们都没有正常起来,我用电源的GND去短路一下RESET管脚,则IIC就正常工作了,读出来的数据是对的。而如果程序上电,我用IO口拉低一段时间然后拉高的方法去复位芯片就不能正常工作;另外,我以前有个旧板子,上面只有一片TLV320AIC3X,我用飞线的方式将我新板子的I2C引过去,i2C可以正常通信。难道不能这样应用吗?我记得我以前用了两片外扩的AD,就是使用CPU的一个IO口同时连上去复位它们,没有这种现象。请问,这样的使用方法对吗?

  • Hi,

    可能是你的CPU I/O驱动能力不够,不过一般应用还是建议采用单独的I/O口去驱动RESET引脚的。

  • 已经试过了,不是驱动能力不够的原因。现在已将其中一片320拿掉,用一个IO口去仅复位一片320,问题依旧。IO口的低电平用示波器观察了的,跟0V GND一样,也试过了用STM32的其它IO口飞线去复位320仍然一样;试着不用软件IO去复位,直接用RC(R=10K,C=100NF)硬件复位,硬件复位时已将与其连着的IO口设为高阻态,也不行。如果用GND接个按键去复位芯片,每次可以正确复位读取IIC寄存器。也尝试了改变软件复位的时间,也是不行。 好奇怪的问题。

  • 问题用特殊的方法解决了。软件上电后,对320进行了两次低电平复位,即高->低->高->低->高,---___----___---------------------这样每次复位就正常了。不过还是觉得这个现象奇怪。