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.

AD5311R用I2C读写无ACK

Other Parts Discussed in Thread: MSP430F2618

调试了很久了,感觉要影响项目进度了,小女子先谢过大家了,实在快被这个给整疯了~~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;