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.

[参考译文] PCA9306:I2C ACK 不变为零

Guru**** 2933120 points

Other Parts Discussed in Thread: PCA9306

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1190817/pca9306-i2c-ack-is-not-coming-to-zero

器件型号:PCA9306

尊敬的团队:

问题1:

下面是捕获的 I2C 波形。您可以看到 ACK 将达到0.8V。我知道、这是因为存在电平转换器。

请查看下面的电路。使用的上拉电阻为10K、低侧电压为2.9V、高侧电压为5V。

问题2:

您可以看到两个确认将出现(黄色圆圈)。

之后、您可以看到没有 ACK、SDA 被拉至低电平、SCL 被拉至高电平。

之后没有时钟出现。我知道这是一种预期行为。我的意思是、只有在 Arduino 正确接收 ACK 时、时钟才会正确来自 Arduino。

问题3:

仔细观察布线(第一幅图像)、可以看到 SDA 在 SCL 为低电平时从低电平转换为高电平。 这似乎是在帧中间发送停止条件的控制器。
这是固件问题

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

    PCA9306是一款无源开关。 所有器件必须能够通过两侧的上拉电阻器灌入总电流。 显然、从器件的驱动强度较低。 这是什么从器件?

    看起来主器件正在发送第三个字节的第一个位、但随后发送了一个停止。 这毫无意义。

    时钟信号的电压似乎错误。 您在哪些点测量了这些波形?

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

    从设备是我们公司的 ASIC

    Arduino 不直接提供 DUT 的时钟。我们使用称为电压调制器的电路。该调制器使用 SPDT 开关设计。开关的一个 I/P 连接到3.8V、另一个 I/P 连接到2.9V。Arduino 提供的时钟用作控制信号 对于此 SPDT 开关。如果 CLK 为高电平、输出将为3.8V、当它为低电平时、输出将为2.9V。

    此2.9V 和3.8V 电压来自功率分析仪(Keysight N6705C)。2.9V 电压还连接到电平转换器的 VREF_LOW。 调制器电路如下所示。

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

    该 ASIC 的驱动强度是多少?

    请在主器件和 DUT 上捕获 SDA 和 SCL、并在第二次 ACK 后放大。

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

    Hari、

    [引用 userid="433553" URL"~/support/interface-group/interface/f/interface-forum/1190817/pca9306-i2c-ack-is-not-coming-to-zero "]

    下面是捕获的 I2C 波形。您可以看到 ACK 将达到0.8V。我知道、这是因为存在电平转换器。

    请查看下面的电路。使用的上拉电阻为10K、低侧电压为2.9V、高侧电压为5V。

    [/报价]

    目标(从器件)器件可能无法灌入电平转换器两侧的10kohm 上拉电阻的总电流(Clemens 在其响应中提到了这一点)。 PCA9306是一款无源器件、在内部实现了用于电平转换的 passFET。 这意味着转换器两侧的上拉电阻器将在某种程度上平行出现。 10k Ω|| 10k Ω= 5k Ω 上拉电阻。 从器件(目标器件)的驱动器必须能够克服5k Ω 上拉电阻而不是10k Ω 上拉电阻的强度。  

    [引用 userid="433553" URL"~/support/interface-group/interface/f/interface-forum/1190817/pca9306-i2c-ack-is-not-coming-to-zero "]

    您可以看到两个确认将出现(黄色圆圈)。

    之后、您可以看到没有 ACK、SDA 被拉至低电平、SCL 被拉至高电平。

    之后没有时钟出现。我知道这是一种预期行为。我的意思是、只有在 Arduino 正确接收 ACK 时、时钟才会正确来自 Arduino。

    [/报价]

    这是特定于 Arduino 而不是 PCA9306的行为。  

    我怀疑这是 Arduino 设备的预期行为。 在这种情况下、Arduino 用作主(控制器)器件、因此它负责在 SCL 上生成 CLK 脉冲。 成功 ACK 后、Arduino 将知道每个成功写入/读取命令在时钟上写入8个周期。 如果收到 NACK、Arduino 就没有理由继续计时。  

    [引用 userid="433553" URL"~/support/interface-group/interface/f/interface-forum/1190817/pca9306-i2c-ack-is-not-coming-to-zero ]仔细查看 trace (第一幅图像)后、似乎 SDA 在 SCL 为低电平时将低电平转换为高电平。 这似乎是在帧中间发送停止条件的控制器。
    这是否是固件问题

    总线主控(Arduino)必须首先释放 SCL 线路、SDA 必须在 SCL 空闲时从低电平转换为高电平、才能保证满足停止条件。 我没有看到 SCL 线在帧的中间被释放。

    我认为在调试的后续步骤中、我们应该收集更多有关 I2C 总线上发生的情况的信息。 请遵循 Clemens 建议、在同一示波器上收集主器件和从器件 SDA/SCL 信号的示波器捕获。 我们需要确保主器件发送的是从器件接收的内容。  

    此致、

    Tyler

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

    谢谢您。我将在本论坛中捕获并更新。