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.

[参考译文] TCA9548A:写入控制寄存器时最后一个字节锁定?

Guru**** 2465890 points
Other Parts Discussed in Thread: TCA9548A

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/637517/tca9548a-last-byte-latched-when-writing-to-control-register

部件号:TCA9548A

您好-

 我正在使用 通用i2c主接口向TCA9548A设备写入数据,在该接口中,我按以下顺序传输数据:<SlaveAddr=0x70><MemAddr=0x70><DataByte=0x02>。 我知道我不需要向此特定部件发送单独的MemAddr,但我将保持此字段不变,以便此模块对于需要单独i2c内存地址的其他应用程序更通用。 下面的JPG中显示了实际总线周期。 运行SCL @ 400kHz。

  与DataByte相反,TCA9548A似乎将MemAddr字节锁定为数据。 此行为与数据表冲突,数据表在第17页的第8.5 4节(控制寄存器)下说明传输的最后一个字节作为数据锁定。 所有字节都由从属方确认,因此看起来不是数据完整性问题。 我是否做错了其他事情?

蓝色:  SDA

绿色: SCL (在示波器上缓冲@ 3.3V)

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

    Bryan,

    查看图片后,您似乎正在发送以下内容:

    11.1万0 0{0x70h}这意味着您正在发送设备地址并写入

    确认

    0111 0000{0x70h}数据您写入控制寄存器以选择通道...在本例中为通道4,5和6。

    确认

    0000 0010{0x02h}数据您写入控制寄存器以选择通道...在本例中为通道2。

    确认

    根据数据表,8.5 4部分的最后一句和8.5 .3.1 倒数第二句,一旦主控制器释放SDA/SCL线,它应只激活通道2。

    您是否说您看到的打开的信道仅为信道4,5和6?

    是否可以向TCA9548A发送读取命令? {0x71h}并发布o范围图片?

    您是否还能提供示意图?

    谢谢!

    -Bobby

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

    你好,Bobby -

     感谢您在这方面的时间和帮助...

     正如您建议的那样,我的问题似乎与我从设备读取的方式有关...

     关于我上面的初始帖子,它看起来写在控制寄存器中的真正值是0x02 ... 我通过对MUX另一侧执行写入操作来验证这一点,并看到流量通过(且仅通过) 1号信道。

     我发送以下序列以从TCA9548A读取控制寄存器(我知道设备只有一个寄存器,因此无需在读取前设置地址,而是尝试保持各种设备的通用接口)。

      <start>   <SlaveAddr=0x70;write>   <MemAddr=0x70>   <restart>   <SlaveAddr=0x70;read>   <ReadData=0x70>   <stop>

     我还发送了足够多的数据传输,以查看TCA9548A返回的<MemAddr>值作为读取数据。  设备正在确认我的传输,但几乎就像初始传输(设置后续读取的地址)导致写入控制寄存器。

     我在下面发布了几个示波器图(很抱歉,屏幕捕获很基本...示波器只有2.5 软盘作为存储方法)。

     我做错了什么?

    谢谢!

     Bryan

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

     ...抱歉-在示意图上-下面是设备相关页面的快照。 它是COTS HDMI板。

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

    您好,Bryan,

    我相信我明白了为什么你不读控制寄存器和看到最后一个字节写入的问题。

    您之前进行的所有交易都是写交易,而不是读交易。 这说明了当您发送0x02时,当您通过从所有信道发送数据进行检查时,只有Ch1工作正常。 但您无法正确读取控制寄存器。

    "我发送以下序列以从 TCA9548A读取控制寄存器 (我知道设备只有一个寄存器,因此无需在读取前设置地址,但尝试保持各种设备的通用接口)。"

      <start>   <SlaveAddr=0x70;write>   <MemAddr=0x70>   <restart>   <SlaveAddr=0x70read>   <ReadData=0x70>   <stop>

    这看起来像是编码错误。 您向要从中读取的设备发送了错误的地址。 因为您正在发送可能的地址和允许的数据字节,所以您正在接收ACK。

    编辑:您应发送以读取的从属地址不是0x70h,而是0x71h

    从上图看,LSB需要为1才能读取控制寄存器。

    最后,您的原理图看起来很好。 波形显示上拉电阻器良好。 但是,您的粉色和蓝色波形之间有轻微的耦合(似乎不存在任何信号完整性问题)

    需要注意的一点是Ch0看起来没有上拉电阻器,我假设它们在那里,但不在图片中(但更接近其他设备)。 如果不是,您将需要它们以便通过I2C进行通信。

    谢谢!

    -Bobby

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

    谢谢...

    我很清楚-当我说地址是0x70时,我只是指命令的前7位。 我正在将读事务的RD/WR位设置为'1',我认为这在范围图中可见(您同意,还是我会少说?)

    再次感谢,
    Bryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Brian,
    这里我似乎误解了您的读/写命名约定。

    在此处关注您的o示波器镜头:
    11.1万0 0 <0x70h>写入地址0x70h
    确认

    0111 0000 <0x70h)数据发送到控制寄存器.......应打开通道7,6和5。 其它频道应关闭。
    确认

    您随后即刻释放SDA和SCL,然后通过拉动SDA/SCL重新启动通信。
    (这将在线路释放后打开通道)

    11.1万0 1 <0x70h>从地址0x70h读取
    确认

    0111 0000 <0x70h>从寄存器读取的数据为0x70h ......这是我们所期望的,因为您以前已将此值写入寄存器。
    nack -master告诉设备停止发送数据和通信结束

    这是我从O形范围镜头中看到的。 尽管SCL脉冲有点小,我可能犯了错误。

    这是我希望设备执行的操作,因此我正在尝试了解问题。 假设您希望保留通用结构编码结构,但希望将设备上的控制寄存器作为内存地址而不是数据,我这样做是否正确? (从第一个帖子开始?) 或者您是否正在尝试确认您从设备获得了正确的读数?

    对不起,Bryan,我正在尝试完全了解当前的问题是什么,因此我可以在这方面为您提供全力支持。 从第一篇文章开始,我的理解是,您认为设备应保留频道打开时发送的最后一个字节,并认为设备保留倒数第二个字节(内存地址)。 从第二个帖子中,您可以确认设备只能打开第二个通道(Ch1)(您的数据字节)。 您希望从该处确认您可以正确读取刚刚写入的设备。 这是否正确?

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

    是的,我现在看到了。 愚蠢的错误...很明显,在重新启动的情况下不能使用设备进行读取,因为我在初始写入时设置了控制注册。

    感谢您为我澄清这一点... 非常感谢您的时间!

    此致,
    Bryan