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**** 2457760 points
Other Parts Discussed in Thread: TCA9548A

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/605015/tca9548a-compatibility-with-multi-register-slave-devices

部件号:TCA9548A

您好,

我正在使用TCA9548A多路复用器与多个AD7746电容-数字转换器以及一个测试性3.2 微控制器连接。 AD7746有19个数据寄存器(0-18),当 我尝试从0 (默认寄存器)以外的任何寄存器读取数据时,遇到了许多问题。

例如,如果我想从 通道7上的设备读取,我 选择通道7并读取19字节(从寄存器0开始,每个寄存器一个字节。 但是,我注意到,这实际上是从连接到通道0的设备中为我提供数据。 下面是我的电路输出示例。 信道7上只有一个设备连接到MUX。 其它信道未连接到任何设备。 所有8个通道都具有4.7K上拉电阻器。 以下输出中冒号后面的数字都是8位数字;打印输出中不包括二进制数字上的前导零。 这些值都不匹配寄存器的默认值或我尝试写入特定寄存器的值(7,9,10,11,13,14)。

----------------
示例输出#1
----------------
来自寄存器0:0的当前数据
来自寄存器1:0的当前数据
来自寄存器2的当前数据:0
来自寄存器3的当前数据:0
来自寄存器4的当前数据:0
寄存器5:0中的当前数据
来自寄存器6:0的当前数据
来自寄存器7:0的当前数据
来自寄存器8:0的当前数据
来自寄存器9:0的当前数据
来自寄存器A的当前数据:0
来自寄存器B的当前数据:0
来自寄存器C的当前数据:0
来自寄存器D的当前数据:0
来自寄存器E的当前数据:0
来自寄存器F的当前数据:0
来自寄存器10的当前数据:0
来自寄存器11的当前数据:0
来自寄存器的当前数据12:0
----------------------------------

但是,如果我使用相同的函数并使用(1<7)而不是0,我将得到以下输出。 唯一的区别是,我写的不是0 (选择数据寄存器0),而是1000万 (二进制),我最初预期根本不起作用, 但稍后怀疑可能会导致多路复用器切换到通道7 (如果它正在写入TCA9548A上的控制寄存器,而不是修改AD7746上的地址指针)。

很明显,当我通过多路复用器从AD7746请求多字节数据时,我只是在TCA9548A控制寄存器中重复19次的字节。 AD7746地址指针在将数据传输到主寄存器后自动增加到下一个寄存器,因此我实际上应该从19个寄存器中的每个寄存器获取数据(当微控制器直接连接到不带多路复用器的AD7746时,这种方法有效)。

----------------------------------
示例输出#2
----------------------------------
来自寄存器0的当前数据:1000万
来自寄存器1的当前数据:1000万
来自寄存器2的当前数据:1000万
登记册3的当前数据:1000万
来自寄存器4的当前数据:1000万
来自寄存器5的当前数据:1000万
来自登记册6的当前数据:1000万
来自登记册7的当前数据:1000万
来自登记册8的当前数据:1000万
来自登记册9的当前数据:1000万
来自登记册A的当前数据:1000万
来自寄存器B的当前数据:1000万
来自寄存器C的当前数据:1000万
来自寄存器D的当前数据:1000万
来自登记册E的当前数据:1000万
来自登记册F的当前数据:1000万
来自登记册10的当前数据:1000万
来自登记册11的当前数据:1000万
来自登记册12的当前数据:1000万
----------------------------------

如果我尝试从信道7上的设备上的各个寄存器读取数据,我只需返回要读取的寄存器的地址。

----------------------------------
示例输出#3
----------------------------------
来自设备7:0上寄存器0的当前数据
设备7:1上寄存器1的当前数据
来自设备7:10上寄存器2的当前数据
设备7:11上寄存器3的当前数据
设备7:100上寄存器4的当前数据
来自设备7上寄存器5的当前数据:101.
来自设备7上寄存器6的当前数据:110
来自设备7寄存器7的当前数据:111.
设备7:1000上寄存器8的当前数据
设备7上寄存器9的当前数据:1001.
来自设备7上寄存器10的当前数据:1010
设备7上寄存器11的当前数据:1011
设备7:1100上寄存器12的当前数据
来自设备7寄存器13的当前数据:1101.
来自设备7寄存器14的当前数据:1110
----------------------------------

当我尝试通过多路复用器读取AD7746中的数据时,明显出现了错误。 这也意味着我无法知道是否能够向AD7746写信。 当我刚刚将微控制器连接到AD7746时,我的代码工作正常,所以我必须相信问题出在多路复用器上。 我的当前代码已被修改为对多路复用器使用正确的I2C地址,并且以100kHz时钟频率运行。

是否有人遇到类似的问题? TCA9548A是否与多寄存器I2C设备完全兼容?

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

    我尚不能确定导致此行为的原因。 您认为您是否可以使用示波器来观察TCA9548A两侧的I2C波形,以获取用于更改通道以及从转换器读取的命令? 我想验证您发送的是正确的I2C命令,也验证交换机没有出现任何问题(因为MCU和转换器之间的直接连接可以正常工作)。

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

    您好,Max,

    我附上了MUX前后的时钟和数据线波形的图片。 在MUX之后,两条线路都保持在3.3V的高电压。 在MUX之前,波形无论如何都不完美,但它们至少看起来像是在做一些事情。 图片按此顺序排列[SCL先于MUX,SDA先于MUX,SCL先于MUX,SDA After MUX ]。

     

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

    感谢您了解这些信息。 由于mux输出上没有切换,是否确定您正在观察的频道处于活动状态? 您是否能够从mux的控制寄存器成功读取和写入?

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

    您好Kush:

    我们需要查看I2C事务来对MUX进行编程。  我想看看你编程总线后是否会产生停机条件。  我们要求启动命令以打开信道。  我希望在一次示波器拍摄中看到船长的SDA和SCL。  

    我看到许多人在写入设备时犯了错误,但之后没有执行停止条件,这意味着它已加载到寄存器中,但未执行。

    Francis Houde

    P.S.请告诉我是否是问题所在。

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

    您好,Max,

    我现在已经开始工作了。 我认为问题在于I2C停止位被发送到多路复用器,或者不被发送。 我一直在使用重复启动,因为 AD7746在接收到停止位时重置其地址指针,但TCA9548A必须接收停止位,以便将更多位发送到相应的I2C通道。 因为我没有发送停止位,所以我只是在TCA9548A控制寄存器上反复写入和读取。

    谢谢!
    库什

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

    您好,Francis:

    感谢这项建议--我认为问题实际上是关于停止条件,正如我在给Max的答复中所写的那样。 我使用重复的启动条件而不是停止,因为停止对我的从属设备不方便,但我需要向TCA9548A发送停止以结束与控制寄存器的通信。 因为我没有发送任何停止条件,所以我只是反复写信和阅读控制寄存器。

    我已经解决了这个问题,现在我的应用程序可以与多个从属设备正常工作。

    谢谢!
    库什