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

