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.

[参考译文] PCF8574:PCF8574 MSP430FR2422的 I2C NACK 问题

Guru**** 2382480 points
Other Parts Discussed in Thread: PCF8574, MSP430FR2422
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1451521/pcf8574-pcf8574-i2c-nack-issue-with-msp430fr2422

器件型号:PCF8574
主题中讨论的其他器件: MSP430FR2422

工具与软件:

**主题:** MSP430FR2422的 PCF8574 I2C NACK 问题

**问题说明:**
我使用位拆裂 I2C 实现将 PCF8574与 MSP430FR2422连接。 `具有正确的启动/停止条件和数据转换(在示波器上进行验证)、PCF8574在地址字节之后始终以 NACK 进行响应(` 0x40 μ s 用于写入)。


1.** PCF8574地址:** A0、A1、A2接地(地址:`0x40`)。


**代码:**
```μ A

void init_I2C (void)

CONF_SCL_OP;
CONF_SDA_OP;
}

空 I2C_EVM Start_Bit (空)

SET_SDA;I2C_DELAY ();
SET_SCL;I2C_DELAY ();
RST_SDA;I2C_DELAY ();
RST_SCL;
}

空 I2C_EVM Stop_Bit (空)

RST_SCL;I2C_DELAY ();
RST_SDA;I2C_DELAY ();
SET_SCL;I2C_DELAY ();
SET_SDA;
}

unsigned char I2C_Void Get_Ack (void)

unsigned char ack;
RST_SDA;
RST_SCL;
SET_SDA;
CONF_SDA_IP;I2C_DELAY ();
SET_SCL;I2C_DELAY ();
//I2C_DELAY ();
if (! GET_SDA_LVL)
ACK = 1;
设计
ACK = 0;
RST_SCL;
CONF_SDA_OP;
return (ack);
}

空 DataSendToI2C (无符号字符 RDATA)

unsigned char i;

CallNop ();//asm (" NOP ");
for (i=0;i<8;i++)

if (RDATA & 0x80)
SET_SDA;
设计
RST_SDA;

I2C_DELAY();
SET_SCL;I2C_DELAY ();
RST_SCL;I2C_DELAY ();

RDATA = RDATA<<1;
}
I2C_DELAY();

I= I2C_I2C() Get_Ack;

I2C_DELAY();
CallNop ();//asm (" NOP ");
}

unsigned char DataRecvFromI2C (void)

unsigned int i、recd;
RECT = 0;
SET_SDA;
P1REN|=BIT5;
CONF_SDA_IP;
I2C_DELAY();
for (i=0;i<8;i++)

recd = recd<<1;
SET_SCL;
I2C_DELAY();
中频(GET_SDA_LVL)
recd = recd|0x01;
RST_SCL;
I2C_DELAY();
}
P1REN&=~BIT5;
CONF_SDA_OP;
return (recd);
}

void I2C_delay (void)

unsigned char Del=100;//50
while (Del--);
}

void CallNop (void)

asm ("NOP:");
}

void I4.72 Dev_Delay (空)

unsigned char Del=100;//50
while (Del--);
}

空 ReadWriteDelay (空)

unsigned int Del = 4000;
while (Del--);
}

void PCF8574_Write (unsigned char DeviceAdd、unsigned int 数据)

I2C_I2C() Start_Bit;
I4.72 Dev_Delay ();
DataSendToI2C (DeviceAdd);
I4.72 Dev_Delay ();
CNT=0;
DataSendToI2C (data);
I4.72 Dev_Delay ();
I2C_I2C() Stop_Bit;
CallNop();
ReadWriteDelay ();
}
void main (void)


init_i2C();
while (1){
PCF8574_Write (0x40、0x00);
DELAY_3ms (1);
}

}

``μ A

**问题:**
为什么 PCF8574在地址字节后始终以 NACK 进行响应、如何解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sanskar:

    您是否有此数据流的示波器捕获?  

    此致、

    Tyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tyler:

    附加的是 i2c 的示波器波形。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些波形违反了 μ I²C 的时序要求(请参阅第5.6节)。

    上升沿看起来很快。 实际上是使用开漏信号吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sanskar:

    请参阅 Clemens 最新文章。 我在这里同意他的看法。  

    他指的部分来自 I2C 标准。 请参阅 I2C 标准第45页(共62页)的时序图。  

    I2C 总线规范和用户手册

    此致、

    Tyler

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Clemens 和 Tyler:

    感谢您的帮助! 在调整延迟以满足 I²C 时序要求后、PCF8574现在可以完美工作。 您的指导非常宝贵!

    此致、
    Sanskar Nautiyal