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再试试。