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.

[参考译文] PCA9548A:了解 PCA9548A 的功能

Guru**** 2394305 points
Other Parts Discussed in Thread: PCA9548A

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/685884/pca9548a-understanding-functionality-of-pca9548a

器件型号:PCA9548A

您好!

 ZC702电路板。  我有一个脚本、用于为 VGA 输出(HSYNC、VSYNC、数据等)生成测试图像。  此部件工作正常、并已在 VGA 显示屏上进行验证。

在项目的第一步中、我尝试使用 ZC702板作为 HDMI 输出、但 I2C 和配置器件存在一些问题。  我可以提供 I2C 控制器和配置文件。  如果有人愿意查看、也可以查看仿真文件。  我真的不清楚为什么这不起作用。  我已按照 Analog Devices 的应用手册 AN-1270中的 I2C 写入操作。

 下面是一些问题:

为什么8开关器 件的 ZC702文档具有9个地址?:I2C 地址为0x74、但列出了其他8个通道。

PCA9548文档具有另一组地址、用于写入 PCA9548 I2C (文档的表1第9.6节、8个通道0x70-0x77) 。在本文档中、0x74是通道5。   

我的 akncycle 在 SDA 线上应该是1'b1还是1'bz? 我在这里看到了一些相互冲突的信息。  

时钟拉伸是否正常?  正如您在我的片段中看到的、在等待应答时、CLK 中存在一些延迟。

在 PCA 文档中,它指出我需要提供从机地址+控制寄存器。  是这样吗?  如果我在 SDA 线上只有一个器件、并且我发送00001或1111111、实际上会有任何差异。 我知道控制寄存器用于访问 I2C 通道上的不同器件。  如果一个通道上只有一个器件、那么启用所有器件或其中一个器件不应起作用?

谢谢

Jerome

 

谢谢、

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

    您好 Jerome、

    "为什么 ZC702文档为8开关器件提供了9个地址?"
    -我不确定为什么 ZC702文档中有9个地址。 您能参考用户指南中的哪些位置吗?

    我假设您正在讨论 zc702的 Xilinx 用户指南中的表1-19。 如果是这种情况、则仅使用我们的 PCA9548A 器件之一、因为它看起来像其他器件(8个其他器件、总共9个、我们的器件)。

    "I2C 地址为0x74、但列出了其他8个通道用于彼此的器件。"
    我们的器件可以配置为具有不同的地址、具体取决于您排列硬件的方式。 (您可以通过拉高或拉低地址引脚来更改器件的地址来实现此目的)。 为了避免地址冲突、需要多个地址。 我假设您所引用的实际上只是具有不同 I2C 地址的不同器件、而不是器件的通道。

    "我的知识周期应该是1'b1还是1'bz 在 SDA 线上? 我在这里看到了一些相互冲突的信息。 "
    每9个时钟周期发生一次确认、对于 ACK、应为零、对于 NACK、应为1。 如果您尝试结束读取序列、则需要 NACK、但如果您尝试写入或继续读取、则需要 ACK。 这也取决于谁在进行堆栈、如果你发送0x74h 和一个读/写位、那么主器件不应该进行回栈、因为从器件是正在堆栈的器件、主器件应该在寻找它。


    "时钟拉伸是否正常? 正如您在我的片段中看到的、在等待应答时、CLK 中存在一些延迟。"
    -我看不到您的片段,您能否重新发布? 您需要单击蓝色链接,显示“插入代码、附加文件等...”。 然后单击上方框中的图标以及图像图片。 (复制粘贴不起作用,很遗憾。。。。)
    通常、通过我们的开关可以实现时钟拉伸、并且由于开关引入的传播延迟、可能会产生一些延迟。 我还应该注意的是、如果您直接与 PCA9548A 通信、则不应进行时钟扩展。

    "在 PCA 文档中、它指出我需要提供从器件地址+控制寄存器。 这是正确的吗?"
    是的、您需要发送7位地址(在您的情况下为0x74h)。在看到从器件 ACK 后、您可以发送控制寄存器数据。

    "如果我在一个通道上只有一个器件、那么启用所有器件或其中一个器件不应起作用?"
    只要其他通道具有上拉电阻器、就不会看到差异。 如果它们悬空、则通道可能会悬空至 GND 并在短时间内将信号拉低、尽管这种情况不太可能发生。

    谢谢、
    -Bobby

    此外、如果您有任何其他问题或遇到问题、请告知我。 (如果您有问题、还应附上示波器截图)

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

    谢谢。

    我尝试将 I2C 写入 AnalogDevices AD7511 HDMI 芯片、以便将其配置为在 AN-1270之后进行后续输出(请参阅最后一页)

    如果我理解正确:

    从 FPGA I 应该从 ZC702文档中发送8位 HDMI 地址(0b0111001+ 0写入) +控制寄存器(1111111+0写入)+从 AN-1270中发送24位、并进行指定的写入。

    I2C,用于: 01110010;111111;01110010;00001;0000000,其中我已将 SDA 保持在低电平以用于 ACK,但我在 ACK 上确实有一些时钟拉伸。 这是可访问的?

    在 第9个时钟周期内等待 ACK 时、主 I2C_SDAT 应该为1'B1或1'bz?  我意识到输出将是来自从器件的低电平。

    是否可以将控制寄存器发送为11111111?  

    您想看不到我理解的时钟周期拉伸吗?  这将导致器件无法正常工作?

    除了使用逻辑分析仪之外、我还想询问其他方法来确认从器件收到 ACK。  例如、通常的做法是创建一 个逻辑条件、使 I2C_SCLK 保持高电平、直到 SDAT 被拉低?  如果我按上述方式(通过设置为1'bz)释放 I2C_SDAT、则默认状态将拉高 上拉电阻器。  因此、我应该保持 I2C_SCLK 为高电平、直到该线路转换为低电平(来自从器件的 ACK)。

    谢谢、

    e2e.ti.com/.../AN_2D00_1270.pdf

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

    您好 Jerome、

    '从 FPGA I 应该从 ZC702文档中发送8位 HDMI 地址(0b0111001+ 0写入) +控制寄存器(1111111+0写入)+从 AN-1270发送24位 HDMI 地址、并进行指定的写入。'

    -涉及控制寄存器的第二步是错误的。 应为:

    (111111+0写入)(请注意、我添加了一个额外的1、因为我们要将8个位写入控制寄存器)

    不应存在+ 0、因为这是从器件应进行 ACK 应答的第0个时钟周期。 在您之前的数据中、您已经向要写入的器件指示了您要写入的数据。 (请记住、所有数据都在8的序列中、最后一位是收发器的 ACK / NACK 信号)

    "AN-1270中的+ 24位、具有指定的写入。"

    发送地址和要写入的通道后、需要释放 I2C 总线(停止条件)、然后初始化启动条件或执行重启条件。 如果除了继续写入控制寄存器之外还想执行其他操作、则需要执行此操作、否则开关仍会认为您正在尝试与控制寄存器进行通信。

    因此、写入开关后、您需要(停止然后启动)发送 AD7511的7位地址和一个读取或写入位。 (我假设您正在写入)、然后发送您的24位(一次8位、并在发送下一个8位之前在第9个时钟周期之后查找 ACK)。 之后、您需要释放 I2C 线路。

    在您的波形中、我没有看到任何 ACK、因为看起来第9个时钟脉冲只是保持低电平、并且在重新启动条件发生之前永远不会返回???????

    " 在第9个时钟周期内等待 ACK 时、主 I2C_SDAT 应为1'B1或1'bz?  我意识到输出将是来自从器件的低电平。"

    我假设您的主器件无法上拉、(推挽架构会损坏器件)。 我不确定1'b1 或1'bz 是什么、因为这似乎是有关您的特定驱动程序的软件问题。 我假设它应该为1、因为您不想将线路拉低、但这看起来就像您在查看的位1、它不是 ACK 位???? (不知道该驱动程序/代码)

    "可以接受将控制寄存器发送为11111111吗? "

    是的。

    "您想看不到我理解的时钟周期拉伸吗?  这将导致器件无法正常工作?"

    我们的器件不支持直接看到时钟拉伸(您可以通过通道进行时钟拉伸、但不能直接与我们的器件通信)。 不需要时钟拉伸。 我应该提到、主器件通常不执行时钟扩展、时钟扩展由从器件完成、以便有更多时间解析数据。 主器件根本不应针对您正在做的事情进行时钟拉伸。

    "例如、通常的做法是创建一个逻辑条件、使 I2C_SCLK 保持高电平、直到 SDAT 被拉低?"

    I2C 无法实现这一点、因为它是漏极开路。 这意味着您不能主动将信号拉高。 (如果您这么做、则会在出现低电平时损坏下拉 FET)。 如果主器件未拉低、则应处于三态模式。

    '如果我按上述方式释放 I2C_SDAT (通过设置为1'bz)、则默认状态将拉高 上拉电阻器。'

    这正是我们想要的。

    "因此、我应该保持 I2C_SCLK 为高电平、直到该线路转换为低电平(来自从器件的 ACK)。"

    主器件是生成时钟信号的器件、而不是从器件、您应该继续生成时钟脉冲(主器件 shoudl 生成第9个时钟脉冲)、但从器件应该在脉冲9上拉低 SDA。

    ----------------------------------------------------------------------

    您是否可以访问 o 示波器、并且可以在前两次通信期间探测 SDA/SCL? (当您发送从机地址和控制寄存器时)

    逻辑分析仪不会向我显示器件实际看到的内容、我更容易理解正在发生的情况。

    谢谢、

    -Bobby

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

    我已经实现了您的意见。  请确认。

    1) 1) 下面是查找表。 首先、我写入 PCA9548 @ 0x74。  我发送0xFF 3次。  我不认为这会产生什么影响、允许我使用一个 LUT 来进行配置。

    2) 2) 在我将所有通道配置为打开后、我随后在0111001处写入 ADV7511、并添加1进行写入。  后跟24位数据。

    下面是一个仿真链接。  M2C ACK 和 END 用于状态机。  我认为关键行是 I2C_SDAT 和 I2C_SCLK、我认为它们符合标准。

    这是写第一行: 8'b11101001,8hFF、8hFF、8hFF

    我将继续进行故障排除、因为 ADV7511无法正常工作。  但这可能更下游。  请告诉我、如果使用此方法写入您的器件时出现任何错误、我曾尝试向您重复此操作。

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

    到目前为止、您是否有幸进行过调试? Bobby 目前不在办公室、但我看到我们从未在您的最后一篇文章中回复过您、因此我看了一下。 不过、我认为我不理解用于写入 PCA9548A 的 SDA 波形。 在启动条件之后(当 SDA 在 SCL 保持高电平时变为低电平)、我希望看到器件地址(从1110开始)、但看起来 SDA 线路在几个时钟周期内保持低电平。 您知道原因吗? 我也看不到器件确认 FF 写入的情况(在数据传输的每个字节后、从节点应该驱动一个低位)。 您知道原因吗? 您之前提供的一些波形似乎与我的预期更接近。

    最大