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.

[参考译文] ADS112C04:无地址响应

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1293381/ads112c04-no-address-response

器件型号:ADS112C04
主题中讨论的其他器件:INA228、INA233、 ADS122C04

下午好

我对此芯片的 I2C 寻址遇到困难、我在同一总线上有 INA233 x 2和 INA228、都运行得很好、但我还有三个 ADS112co4芯片、由 A0 A1配置为地址0x43、0x44和0x45

INA 芯片0x40、0x41和0x4F

根据数据表、ADS 芯片仅返回 NAK 信号、无其他响应、上拉电阻为1K、上拉电阻为3V3、标准速度为100K。 所有 PCBA 已安装、无原型设置

因此、与映像中的三个地址和 NAK 第4个地址一样、ACK 是可以的、并接受更多的配置字节。 为什么呢?  

非常令人困惑

此致

安迪

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

    Andy、您好!

    由于与器件的通信不正确、您收到了 NAK。  通信必须在启动/停止帧内进行。  显示的前三个通信是0x0A、0x08和0x06。  在这里,它不清楚你的意图是什么。  0x08是 START/SYNC 命令、0x06是 RESET 命令、但未对器件进行寻址。  例如、让我们使用 START/SYNC 命令、在与地址0x43处的器件通信时需要执行以下操作。

    • 发出 I2C 启动命令
    • 发送到器件0x43器件写入(0x86)
    • 发送 START/SYNC 命令(0x08)
    • 发出 I2C 停止

    有关其他命令、请参阅第8.5.3节中的数据表信息。

    此致、

    鲍勃 B

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

    尝试了您的建议

     但分析器显示0x86加 Nak。 不再出现更多数据

    相同代码不同芯片和地址工作正常

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

    Andy、您好!

    对于您在逻辑分析仪快照中看到的内容以及实际的细节、我想我需要进一步的解释。  在您的原始描述中、我有以下内容:

    广告芯片只是返回一个 nak 信号,没有其他响应
    [quote userid="584294" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1293381/ads112c04-no-address-response 这样就像在图中带有 NAK 第4个地址的三个地址可以带 ACK

    但在逻辑分析仪快照中、我看到的所有内容是传输的前三个字节完全没有地址、第4个字节是 INA 的地址。  在逻辑分析仪快照中、您可以看到前三个字节中的每个字节都有一个开始条件(绿点)和一个停止条件(橙色点)的边界。

    在您的上一篇文章中、您没有为我提供任何逻辑分析仪截图来确定可能发生的情况。  至于通信、如果从 ADS122C04读取、则微控制器发送 ACK/NACK。  因此、我真的需要查看实际的完整数据传输、以了解正在发生什么情况。

    在您的第一篇文章中、您注意到"广告"芯片(我假设所有这些芯片)的响应方式相同。  在上一篇文章中、您提到您更换了一个芯片、现在它运行正常。  我很高兴听到您终于可以进行交流、但肯定还有一些其他问题与您在原帖子中发送的逻辑分析仪快照相关。

    在我看来、如果您没有更改代码、但更换一个器件使其能够正常工作、那么当 NACK 条件停止与其他两个 ADC 器件的通信时、您如何处理 NACK 条件会出现问题。  ADC 焊接不正确或引脚之间可能存在焊接桥。  更换设备可实现正确连接。

    最后我没有得到一个完整的情况。

    此致、

    鲍勃 B

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

    你好,宝贝,对不起延误,过去两周非常生病,但现在回到工作。

    仍获得 NAK、  

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

      所以我可以看到启动条件(我认为)、然后是地址(将 IC 硬接线为0x45)、但不管我做什么、我得到的都是 NAK

    我有三个分别地址的硬接线芯片、0x43 0x44 0x45、我得到的都是 NAK、但对总线上的六个芯片进行 i2c 扫描后发现只有三个地址的0x40 0x41和0x4F、全部报告正常。 请问您有什么想法?

    此致

    安迪

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

    serial.print ("温度传感器1 U2-T1 =");
    Wire.beginTransmission(0);//发送到器件(0x45)启动条件
    Wire.write (0x90);//从器件地址
    // Wire.write (6);//重置
    // Wire.write (8);//开始
    // Wire.write (16);// RDATA
    // Wire.write (0x45);//读取模式
    //电线.requestFrom(69,2真);
    // Data0 = Wire.Read ();
    // data1 = Wire.read ();
    // Wire.write (2);// powerdown
    Wire.endTransmission (0);//停止发送
    serial.print (Data0);
    serial.print(");
    serial.print (data1);
    serial.print (" C \n");

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

    Andy、您好!

    很高兴听到你感觉更好。  我想您可能对 I2C 的工作原理缺乏一定的了解、因为它与您正在使用的代码相关。  请注意、在传输的第一个字节中、您应该显示该器件的地址以及它是读取还是写入。  第二个和剩余的字节将是数据。

    在最后一个逻辑分析仪快照中、您显示写入的是0x00、后跟0x90。  因此您实际上是在发送通用广播地址、后跟0x90、这不是有效的通用广播命令。  因此、最终您无法正确地在代码中解释和使用函数调用。  

    Arduino 参考

    因此、您需要确保使用正确的命令并正确寻址设备。  因此、如果您要写入器件、则可以使用所显示的命令、但要具有正确的值。  该地址进入 begnTransmission ()的函数调用的内部。 请勿使用0、而是您实际写入的器件地址、然后您应接收到 ACK。

    此致、

    鲍勃 B

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

    Bob、如果我无法在星期五之前解决此问题、那么该部件将从项目中移除、现在时间已不可用。

    现在的代码、

    serial.print ("温度传感器1 U2-T1 =");
    Wire.beginTransmission(0x90);//发送到器件(0x45)启动条件
    Wire.write (0x90);//从器件地址
    Wire.write (6);// reset
    Wire.write (8);//开始
    Wire.write (16);// RDATA
    Wire.write (0x90);//读取模式
    Wire.requestFrom (144、2、true);
    Data0 = Wire.Read ();
    Data1 = Wire.Read ();
    Wire.write (2);// powerdown
    Wire.endTransmission (0x90);//停止发送
    serial.print (Data0);
    serial.print(");
    serial.print (data1);
    serial.print (" C \n");

    serial.print ("温度传感器2 U2-T2 =");
    Wire.beginTransmission(0x88);//发送到器件(0x44)
    Wire.write (0x88);//从器件地址
    Wire.write (6);// reset
    Wire.write (8);//开始
    Wire.write (16);// RDATA
    Wire.write (0x88);//读取模式
    Wire.write (2);// powerdown
    Wire.requestFrom(136,2, true);
    Data0 = Wire.Read ();
    Data1 = Wire.Read ();
    Wire.write (2);// powerdown
    Wire.endTransmission (0);//停止发送
    serial.print (Data0);
    serial.print(");
    serial.print (data1);
    serial.print (" C \n");

    serial.print ("温度传感器3 U2-T3 =");
    Wire.beginTransmission(0x86);//发送到器件(0x43)
    Wire.write (0x86);//从器件地址
    Wire.write (6);// reset
    Wire.write (8);//开始
    Wire.write (16);// RDATA
    Wire.write (0x86);//读取模式
    Wire.requestFrom(134,2,true);
    Data0 = Wire.Read ();
    Data1 = Wire.Read ();
    Wire.write (2);// powerdown
    Wire.endTransmission (0);//停止发送
    serial.print (Data0);
    serial.print(");
    serial.print (data1);
    serial.print (" C \n");
    serial.print(");
    serial.println ();

    还有上述代码的截屏响应、当我执行 I2C 扫描时、在 INA 芯片在40、41和4F 运行时仍然无法返回地址响应、TI 芯片不提供任何信息。

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

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

    Andy、您好!

    遗憾的是、您需要我来教您 I2C 协议以及如何与 Arduino 配合使用。  您遇到的问题与 ADS112C04无关、而是与如何使用 Arduino 进行通信有关。  您只需要使用逻辑分析仪快照来确定传输操作错误。  所有通信都必须具有开始条件和停止条件。

    在起始条件之后传输的字节是您尝试通信的器件地址、以及用于指示 您是向器件写入内容还是从器件读取内容的最低有效位。  除非使用重复的启动条件、否则不能在单个事务中将读取和写入混合在一起。  显然、从代码和分析器快照来看、您正在尝试在同一通信事务中混合读取和写入。

    逻辑分析仪快照与代码不匹配、因此缺少一些东西。  让我们来看看您最近发送的图表。  在这里、我们可以在图的第一部分看到以下内容:

    1. START 条件
    2. 写入0x41 (ACK)-通信从器件0x41开始、LSB 为低电平、指示写入
    3. 写入0x41 (ACK)-不确定这里的目的是什么、但它变为对寄存器0的寄存器写入
    4. 写入0x12 (ACK)-这是会写入寄存器0的数据
    5. 写入0x03 (ACK)-此命令将器件置于断电模式
    6. 写入0x88 (NACK)-这是无效命令、这就是您看到 NACK 的原因
    7. STOP 条件

    因此传输的写入值必须是有效命令。  此外、如果需要一些时间来完成第一个命令(例如 RESET)、将命令发回至背对背命令是不好的做法。

    前面的图没有意义。  不能简单地读取或写入值。  您必须首先对尝试与之通信的设备进行寻址、然后发出命令。

    在我之前的回复中,我发送了一个链接到 Arduino 的导线命令。  下面是写入器件的操作:

    以下函数格式化用于写入与之通信的器件地址的传输:

    不要在这里发送 Read()请求,只有 write()和 end 与 endTransmission ()一起发送,后者也可以发出 STOP 条件。

    若要从器件读取数据、您需要遵循数据表中的通信序列、方法是使用上述序列和命令读取转换数据、即0x10 (实际上最低有效半字节可以是任何值)、然后是停止条件或重复启动。  您可以使用函数 requestFrom()从设备读取。

    您可以将 read()函数与 requestFrom()函数结合使用。

    因此、最终您需要了解 Arduino 函数才能与 ADC 正确通信。  无论使用 ADS112C04或某种其他器件、都是如此。

    我强烈建议先只读取寄存器数据、然后继续写入寄存器数据并读回、再使用命令启动/同步转换等。  不要背靠背创建一系列命令、而是一次执行一个步骤、直到它按预期运行。

    由于该器件在上电时会自动复位、因此无需发出 RESET 命令。

    此致、

    鲍勃 B

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

    Bob、地址的0x40 0x41和0x4F 用于 INA233 x2和 INA228芯片、读取时响应正确、因此我认为那里存在混淆。 作为一名经验丰富的电子设计工程师、我不是要求您教我 i2c、而是要求您解释芯片为什么根本没有响应、它们位于地址0x43 0x44和0x45。 使用编译器示例中提供的 Arduino i2c 扫描仪代码本身、扫描不涉及到我的代码、扫描会为 INA 芯片返回三个地址、而不为 TI 芯片返回任何地址。 上拉电阻符合数据表中关于在100K 标准速度下电阻为1K 时的参数。 会得到完全相同的结果。

    我已经为传感器、RTC 等芯片写了很多次代码、40年来从来没有用过轮询时不响应的芯片、所以我得出结论认为方向和电路是正确的。 那么我可能会有坏的芯片管。  

    尝试了多次代码迭代、结果相同、INA 芯片响应、TI 芯片没有响应。

    电气上所有连接都很好地响了,甚至设置一个芯片也没有响应。  

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

    Andy、您好!

    我要说的是、您提供的每个逻辑分析仪快照在 I2C 协议方面都是错误的。  您从未向我展示过正确寻址 ADS112C04器件的位置。  让我们返回到扫描仪。  看起来您正在使用 Saleae 逻辑分析仪。  您能否为扫描仪结果记录、导出和附加绘图文件?  我想将工作器件的图表与非工作器件的图表进行比较。

    我显然是专注于代码本身,扫描仪的结果应该有助于澄清我。   如果 ADS112C04器件确实根本没有响应、则查看原理图会有所帮助。  要使器件通信、RESET 引脚必须上拉为高电平、并且 AVDD 和 DVDD 都必须处于标称工作电压。

    此致、

    鲍勃 B