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.

[参考译文] TCA9543A:I2C 问题

Guru**** 2392185 points
Other Parts Discussed in Thread: TCA9543A, ISO1540

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/859627/tca9543a-i2c-problems

器件型号:TCA9543A
主题中讨论的其他器件: ISO1540

大家好、

我尝试与 TCA9543A I2C 开关通信、但在切换通道时遇到问题。

我的微控制器已启动并正在运行、SCL 线路以100kHz 的频率运行。  我可以在进入 TCA9543A 的 SDA 和 SCL 线路上放置一个示波器、而 SDA 和 SCL 信号将进入、 但是通道0或通道1上的这个芯片上没有数据或时钟出来。

芯片配置为 A0和 A1被拉至接地。  复位引脚被拉高。  下面是我要发送 TCA9543A 的命令的快照、但似乎没有任何东西使其切换。  是否有人确认我并发送正确的命令、或者就我所犯的错误提供建议?

我猜测发送到 TCA9543A 的以下命令是否应该在通道0上获得 SCL 输出?

StartI2C ();//发送启动条件
IdleI2C ();//等待启动条件 WriteI2C
(0x70 & 0xFE)的结束;// TCA9543A 从地址
AckI2C ();//等待 ACK
WriteI2C (0x01);//控制寄存器 B0
AckI2C ();//等待 StopACK
、Hang 条件(Hang) 

期待您的输入。

谢谢、

罗克曼46.

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

    您好!

    您能否判断您是否从交换机获取了 ACK 以响应这些命令?

    如果我们可以查看开关接收到的 SDA 和 SCL 波形、调试可能最简单。  这样、我们就可以准确地了解硬件级别发生的情况。 请提供这些信息吗?

    此致、

    最大

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

    尊敬的 Max:

    请参阅随附的从微控制器进入 TCA9543A 的 I2C 波形的屏幕截图。

    我不知道如何从上述帖子中将伪代码发送到 TCA9543A 中、并且屏幕截图显示了不同的数字。  此外、波形是否应该具有方形超前边沿、而不是四舍五入?  您能找出任何明显的错误。

    期待您的回复。

    此致、

    罗克曼46.

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

    罗克曼、您好!

    看起来微控制器在第9个时钟脉冲上受到攻击(I2C 解码中为红色的"1")。 这意味着 TCA9543A 要么未看到通信、要么存在无效输入。 考虑到范围解码的信息未显示正确的地址、这并不奇怪。 MCU I2C 实现的设置或执行可能会出现此问题。 您是否能够共享您调用的函数实现、以查看我们是否可以了解参数字段中的数字为何未显示在范围快照中?

    理想情况下、该波形应为方形、但在这样的真实系统形状中、我们期望得到的结果是这样的。 由于 I2C 线路由开漏下拉电阻器驱动、因此下降沿比上升沿快得多。 上升沿速度受总线上上拉电阻器的强度和总线电容的影响。 这就是您在波形顶部看到圆角边沿、而下降边沿很清晰的原因。 很难判断这是否是您的案例中缩小范围时的问题。 我假设不是因为示波器能够解码一些信息。 如果您认为这是一个问题、请尝试放大更多内容、并确保在时钟处于高电平时数据线不会转换(启动和停止条件除外)。

    此致、

    Eric

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

    尊敬的 Eric:

    感谢你的帮助。

    我已经取得了良好的进展、当移除串联 TCA9543A 开关时、我可以与微控制器上的电池组进行通信并接收电池电压。  因此、这可以确认微电池代码是正确的。

    借助开关放回系列、我可以在通道 B0和 B1上写入电池、并在示波器上读取此数据、但我无法通过切换到微型器件从电池接收数据。  下面是我的代码、有人能在阅读部分看到我的错误。

    此致、

    罗克曼46.

    //写入电池
    
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C (0xE0); // TCA9543A 从器件地址写入
    IdleI2C();
    WriteI2C (0x01); //控制寄存器 B0
    IdleI2C();
    StopI2C();
    
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C (0x16); //发送电池地址和读取
    IdleI2C()位;
    WriteI2C (0x09); //发送电池命令以检索电压
    IdleI2C();
    StopI2C();
    
    //read from battery
    
    RestartI2C();
    IdleI2C();
    WriteI2C (0xE1); // TCA9543A 从器件地址读取
    IdleI2C();
    WriteI2C (0x01); //控制寄存器 B0
    NotAckI2C();
    StopI2C();
    
    RestorartI2C();
    IdleI2C();
    WriteI2C (0x17);
    IdleI2C();
    LSB_battery_voltage = ReadI2C ();//读取数据的第一个字节
    AckI2C ();
    MSB_BATTERY_VOLTAGE = ReadI2C ();//读取数据的第 n 个字节
    NotAckI2C ();
    StopI2C(); 

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

    您好!

    当我努力使这项工作取得成功时、任何帮助都会被接受、我面临着完成这项工作的巨大压力。

    谢谢、

    罗克曼46.

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

    您好!

    这是 我尝试使用上述代码控制的电路。  另请注意、复位由4.7K 电阻器上拉。   

    期待您的回复。

    罗克曼46.

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

    您好、Rocketman、

    感谢您提供代码和原理图。 我很高兴听到您取得了良好的进展。 我想我可以帮助您从电池从设备读取数据。

    我认为 I2C 开关的运行存在一些困惑。 我注意到、在您的代码中、当您尝试从电池读取时、您首先向 TCA9543A (第25行)发送读取命令。 我假设这是为了验证开关配置、但是、您不保存 TCA9543A 的响应、而是尝试再次写入 B0的控制位(第27行)。 这可能会导致器件中出现错误、因为从器件在尝试通过数据线进行响应的同时、主器件也尝试进行写入。 我怀疑这是您遇到通信问题的地方。  

    TCA9543A 可用作开关、仅在由主器件直接控制时才会改变状态。 在您在"写入电池"中发布的代码的第一部分、您可以正确配置开关以启用通道 B0 (第3行至第10行)。 由于地址字段与器件地址不匹配、因此主器件和电池之间的以下事务不受交换机监控。 由于该器件已配置为启用通道 B0、因此您无需重新配置开关即可立即从电池中读取数据。 这意味着无需从第23行到第29行的代码即可通过器件进行通信。 我还认为,如果本节与第一种配置(第3行至第10行)相同,通信也会成功。  

    请告诉我这是否合理以及这是否解决了问题。  

    此致、

    Eric

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

    尊敬的 Eric:

    感谢您的回复。  如果我在移除开关和光电元件的情况下使用以下代码、并且只在微电池和一个电池之间进行通信、我就成功了、但是当我重新添加上述电路时、我无法从电池中读取。  我已经尝试过您的技巧、但仍然没有电池返回的数据。  我想我在翻译或其他方面迷路了。

    谢谢、

    //写入电池
    
    IdleI2C();
    StartI2C();
    IdleI2C();
    WriteI2C (0x16); //发送电池地址和读取
    IdleI2C()位;
    WriteI2C (0x09); //发送电池命令以检索电压
    IdleI2C();
    StopI2C();
    
    //read from battery
    
    RestartI2C();
    IdleI2C();
    WriteI2C (0x17);
    IdleI2C();
    LSB_battery_voltage = ReadI2C ();//读取数据的第一个字节
    AckI2C ();
    MSB_BATTERY_VOLTAGE = ReadI2C ();//读取数据的第 n 个字节
    NotAckI2C ();
    StopI2C(); 

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

    您好、Rocketman、

    请尝试以下代码。 TCA9543A 的配置最初是正确的。 这就是您可以写入电池的原因。 当您尝试在读取电池之前重新配置器件时、我相信会出现问题。 离开重新配置部分、查看是否可以从电池成功读取。

    1
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18
    19.
    20.
    21.
    22.
    23
    24
    25
    26
    27.
    28.
    29.
    30
    31.
    32
    33.
    34
    35.
    36.
    37.
    38.
    39.
    // Configure TCA9543A
    IdleI2C();                      
    StartI2C();                     
    IdleI2C();                      
    WriteI2C(0xE0);                  // TCA9543A Slave address write
    IdleI2C();                      
    WriteI2C(0x01);                  // Enable channel B0
    IdleI2C();
    StopI2C();
    //写入电池
    IdleI2C();                      
    StartI2C();
    IdleI2C();                      
    WriteI2C(0x16);                  // Send battery address and read bit
    IdleI2C();                      
    WriteI2C(0x09);                  // Send battery command to retrieve voltage
    IdleI2C();                      
    StopI2C();                      
    //Read from battery
    RestartI2C();                   
    IdleI2C();
    WriteI2C(0x17);                 
    IdleI2C();                      
    lsb_battery_voltage = ReadI2C(); // Read first byte of data
    AckI2C();                      
    msb_battery_voltage = ReadI2C(); // Read nth byte of data
    NotAckI2C();                    
    StopI2C();
    //继续其它电池通信....

    此致、

    Eric

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

    早上 Eric、

    我已经尝试过您的新代码、但这仍然不起作用。  为了向您提供有关电池管理芯片的更多详细信息、我使用的是 TI 3060。  我将以70kHz 的频率发送此芯片 I2C 命令。

    我刚才再次确认、在移除了光电元件和 TCA9543a 开关的情况下、它工作正常。

    如果您有任何其他想法、请告诉我。

    谢谢、

    罗克曼46.

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

    您好、Rocketman、

    您使用的电池管理芯片的完整器件型号是多少? 由于缓冲器的低电平输入电压要求(0.5V)、IC 可能无法通过 ISO1540进行通信。 布线也可能会在此处引入一些错误、因为该器件的1侧没有2侧的下拉强度。

    您能否在添加 TCA9543A 之前和之后共享通信的示波器截图? 我很好奇、在初始化交换机之后、通信是否确实在进行。 您能否在交换机连接后测试其两侧?

    您是否能够看到从示波器解码的预期值? 仅使用开关的设置将是调试此操作的好方法、因为现在发送/接收的是良好的数据。  

    此致、

    Eric

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

    您好、Rocketman、

    您是否能够在 I2C 通信方面取得进展? 如果您能够找到解决方案、我想知道您是如何处理的。

    此致、

    Eric

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

    尊敬的 Eric:

    感谢你的帮助。

    我现在已使开关工作。  在100kHz 时、电路、开关、光电元件和电池将无法通信、但当我降至80kHz 时、一切都正常。  

    再次感谢您的帮助。

    罗克曼46.

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

    您好、Rocketman、

    听得非常好! 我很好奇、缓冲器增加的传播延迟是否超过了系统级阈值。 我很高兴您能找到解决方案! 感谢您与我们分享。

    此致、

    Eric