AD5311R用I2C读写无ACK
调试了很久了,感觉要影响项目进度了,小女子先谢过大家了,实在快被这个给整疯了~~o(>_<)o ~~
MCU使用MSP430F2618,IO模拟I2C时序,4块芯片,3个都是正常的,其中有一块在写第一个字节(AD地址)后,SDA配置为输入,然后就直接拉高了,没有ACK信号,后面都是这样的,写失败,示波器抓图如下,画9的为第9个bit,本来应该在CLK下降沿才拉高的,可是现在是SDA一配置为输入就自动拉高了:
代码如下:
void I2C_Write(u8 data)
{
u8 i;
I2C_SDA_OUT;
for(i=0; i<8; i++)
{
if (((data<<i)&0x80) == 0)
{
I2C_SDA_LOW;
}
else
{
I2C_SDA_HIGH;
}
I2C_DELAY_2US();
//I2C_DELAY_2US();
I2C_SCL_HIGH;
I2C_DELAY_2US();
I2C_DELAY_2US();
I2C_SCL_LOW;
I2C_DELAY_2US();
}
I2C_DELAY_3US();
I2C_DELAY_3US();
I2C_DELAY_3US();
I2C_DELAY_3US();
I2C_DELAY_3US();
}
u8 JudgeAck(void)
{
u8 ack;
I2C_SDA_IN;
I2C_SCL_HIGH;
I2C_DELAY_2US();
if(P4IN & BIT0)
{
ack = fail;
}
else
{
ack = success;
}
I2C_SCL_LOW;
I2C_DELAY_2US();
I2C_SDA_OUT;
return ack;
}
u8 DACWriteRegister(u8* dataBuf, u8 len)
{
u8 tmp[5] = {1,1,1,1,1};
I2C_Init();
I2C_Start();
I2C_Write(AD5311R_ADDRESS_W);
tmp[4] = JudgeAck();
for(u8 i=0; i<len; i++)
{
I2C_Write(dataBuf[i]);
tmp[i] = JudgeAck();
}
I2C_Stop();
if ((tmp[0] == fail) ||(tmp[1] == fail) ||(tmp[2] == fail) ||(tmp[3] == fail))
return fail;
else
return success;
有没有替代法试一下是不是芯片的问题
ASIC同事说他自己写了个程序在芯片上跑了下,说能正常读写,会有ACK。
所以现在很困惑 不知道为什么430 IO模拟I2C 写DAC时没有把SDA拉低,其他芯片都能正常读写,所以很困惑
先不要配置SDA_IN,SDA脚状态不变,用示波器看第9个CLK有没有ACK
这样的话 第9个CLK ,SDA一直为低电平
这样看不能确定是否是应答信号,能不能把第八个bit改为1,然后看地9个是否有拉低
我尝试了下读,第一个字节为写地址0x99,第二个字节读数据
上面说错了 读的话 第一个字节是0x99(地址+R(1)),后面是数据,这样的话我看不出来拉低了
上面我说错了,我尝试了下读,第一个字节为0x99,看不出来第9个CLK把SDA拉低了啊
用IO模拟I2C,要注意IO内部是否已经上拉了,如果已经上拉,那么I2C外部则不需要上拉电阻了。
现在的情况是5块板子只有这一块出现了问题。现在硬件设计外面接了10K的上拉电阻,如果IO在配置为输入时,不知道默认是上拉还是不上拉,我没有对此进行配置。
现在我在SDA IN时disable了内部上拉,波形和第一个图一样,无法拉下来。