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.

[参考译文] TMS320F28020:I2C 信号缓冲器问题

Guru**** 2535150 points
Other Parts Discussed in Thread: TCA9803, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/807660/tms320f28020-i2c-signal-buffer-problem

器件型号:TMS320F28020
主题中讨论的其他器件:TCA9803C2000WARE

我想实现 I2C 信号缓冲器来驱动 I2C LCD。

原因是、如果没有缓冲器、DSP 28020 GPIO 不能驱动它。

您可以看到下面的波形。 上升时间不合适。

代码已成功生成。 0x7C (从器件地址)、0x80、0x28在数据线上发送时带有 STOP。  

添加 I2C 信号缓冲器芯片后、LCD 未正确初始化。  

因为波形现在看起来是这样的

 

DSP 只能发送第一个字节0x7C、其余2个字节丢失、并且不会生成停止条件。  

我使用的缓冲器芯片是 TI 的 TCA9803、电路原理图就在这里。

我在这里使用3.3V。 EN 直接连接至3.3V。  

我想这是一个硬件问题。 有人可以帮我解决这个问题吗?

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

    您使用的上拉电阻是多少? 在添加 I2C 缓冲器之前、您是否尝试调节上拉电阻? 减小上拉电阻器值可能会有所帮助、或者总线上的电容可能过大、超过400pF、您可能会也可能不会这样做。

    在第二个波形中、添加 I2C 缓冲器后、当从器件应进行 ACK 应答时、总线看起来会损坏。 您在什么接口上进行探测、即主器件到 I2C 缓冲器或 I2C 缓冲器到从器件? 最好检查这两个接口。

    将您的问题发布到相应的 TCA980x 论坛可能会有所帮助、因为专家将更熟悉器件。

    e2e.ti.com/.../138

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

    感谢您的回复!

    在第一幅图中、我将 LCD 直接连接到 GPIO、而无需上拉电阻器。 它是正确的配置还是需要添加类似这样的上拉电阻器?

    在第二个图中、我将探测缓冲器到从器件。 我猜从器件的响应无法传回 DSP (主器件)。

    此致、

    小明

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

    您好、Xiaoming、

    [引用用户="Xiaoming Wang"]在第一张图中、我将 LCD 直接连接到 GPIO、而无需上拉电阻器。 它是正确的配置还是需要添加类似这样的上拉电阻器?[/quot]

    您可能一直在使用 F28020的内部上拉电阻器。 您应该尝试禁用内部上拉电阻(使用 GPAPUD 或 GPBPUD 寄存器)并使用外部上拉电阻器、如您展示的原理图所示。 您可以查看波形并根据需要调整电阻(5.1K 可能正常)。

    [引用用户="Xiaoming Wang ]]对于第二张图、我将探测缓冲器到从器件。 我猜从器件的响应无法传回 DSP (主器件)。

    这是我最初看到的样子。 虽然看不到来自主器件(用于 ACK/NACK)的第9个时钟脉冲看起来很奇怪。 也许从器件将 SDA 保持在低电平来发出一个 ACK 信号并等待主器件发出的时钟脉冲、但它从未看到过。 SDA 信号的噪声很大、因此我不确定。

    您能否探测主器件/缓冲器接口并在此处提供屏幕截图? 此外、在发生此故障的通信后检查主器件侧的 I2C 寄存器可能会显示某些内容(至少 I2CSTR 和 I2CMDR 寄存器)。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    感谢您的回复!

    我发现了上升时间问题的硬件原因。 现在我移除了 I2C 总线上的电容器、现在上升时间看起来不错。  

    我还尝试禁用内部上拉电阻、并添加了2个3.6k Ω 外部上拉电阻(我没有找到5.1k Ω)。 上升时间甚至更短。  

    对于 I2C 缓冲器芯片、连接主/缓冲器接口并不容易、因此我无法为您提供屏幕截图。  

    我在 CCS 上检查了 I2C 寄存器实时值。 I2CSTR 在0x1421和0x0421之间跳转。 I2CMDR 为0x4220。  

    这些表示什么?  

    还有一个问题、我在非常糟糕的 EMI 环境中使用 I2C 功能。 I2C 端口和 DSP 附近有一个~30kHz 谐振转换器。 我想使用 LCD 来显示转换器的运行状态、但它不容易响应(转换器启动几秒钟后)、因此我猜 I2C 信号会受到干扰。 您是否知道抵消 EMI 或刷新/重新连接 I2C 器件的任何方法?

    此致、  

    小明

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

    您好、Xiaoming、

    这一点很好、您可以发现信号的一些硬件改进。

    关于寄存器值、您应该在 此处 TRM (技术参考手册)的 I2C 部分中检查这些位的含义、特别是 I2C_regs 部分:

    http://www.ti.com/lit/sprui09

    [引用用户="Xiaoming Wang "] I2CSTR 在0x1421和0x0421[/引用]之间跳转

    这种变化只是在总线上进行通信时设置的"总线忙"位(BB)和在器件作为从器件寻址时设置的"保存方向"位(SDIR)。

    [引用用户="Xiaoming Wang ]*还有一个问题、我在 EMI 环境非常糟糕的情况下使用 I2C 功能。 I2C 端口和 DSP 附近有一个~30kHz 谐振转换器。 我想使用 LCD 来显示转换器的运行状态、但它不容易响应(转换器启动几秒钟后)、因此我猜 I2C 信号会受到干扰。 您是否知道抵消 EMI 或刷新/重新连接 I2C 器件的任何方法?

    理想情况下、您希望以可降低 EMI 的方式路由通信信号。 您可以在线搜索有关硬件方面最佳实践的一般信息、例如添加滤波、去耦电源等 在软件方面、我认为使用的有益技术取决于您的应用和您正在与之通信的器件。 不确定您是否可以使用 LCD 设备的通信冗余或类似的冗余。

    最棒的

    Kevin

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

    谢谢、Kevin。  

    我将在下一个版本中添加去耦和低通滤波器。  

    我仍然想了解软件解决方案、因为硬件解决方案不是保证。  

    我在这里看到了一些提示。    

    在"通过保持 SDA 为低电平挂起总线的外部从器件"部分中、我看到:  

    '在这种情况下、外部从器件可能会将 SDA 保持在低电平以发送0 (或 ACK)。'

    如何通过编码检测 SDA 保持低电平?  

    谢谢!

    此致、

    小明

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

    您好、Xiaoming、

    重新启动传输后检查仲裁丢失条件可能是一个选项、如 wiki 页面上所述、但结果可能有所不同:

    "即使在这种情况下、直到它尝试发送'1'、它才会在看到 SCL 下降后实际释放 SDA。 最终结果是总线将挂起。 如果 I2C 尝试启动一个新的传输、它将达到一个"仲裁丢失"条件、这是因为 SDA 与它发送的地址不匹配。"

    您还可以尝试将 I2C 引脚切换为 GPIO 并检查引脚的状态、然后根据需要切换以释放总线。

    最棒的

    Kevin

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

    您好、Xiaoming、

    一个多星期内没有听到过您的声音。 您是否能够解决您的问题?

    如果是、我将继续并关闭此帖子。 如果您仍然需要其他支持、请随时在此处发布、或者如果此帖子因超时而关闭、您可以在论坛上发布新问题。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    感谢你的帮助! 我今天很忙,没有回复。 我已经为 I2C 端口设计了一个低通滤波器。 如有必要、我将尝试软件端解决方案。  

    现在、我正在28335平台上处理 I2C。 I2C 的28335 GPIO 与28020的 GPIO 不同。 配置引脚时出现问题。 我在输出端看不到 SCL 和 SDA 信号。 它们始终处于高电平、电压高于3.3V、约为3.7V。 硬件是否有问题?

    我还将附上 I2C 代码。  

    e2e.ti.com/.../0143.I2C.txt

    此致、  

    小明

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

    您好、Xiaoming、

    您正在代码中启用内部上拉电阻器。 可能会尝试禁用它们、因为您使用的是外部上拉电阻器。 除此之外、引脚配置看起来正常。

    3.7V 略高于数据表(3.465V)中建议的"高电平输入电压"。 可能值得研究的是、您为什么会看到更高的3.3V 电源电压。

    除了对 F2833x 进行一些细微的配置更改外、您使用的软件是否与您使用的 F2802x 平台相同?

    最棒的

    Kevin

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

    尊敬的 Kevin:  

    感谢您的回复!

    我已经尝试禁用上拉电阻器。 我在 SDA 和 SCL 上看不到 I2C 信号。 它们都是高电平时间。  

    至于3.7V 问题、如果我断开 I2C LCD、SDA 和 SCL 上的电压为3.3V。 在我连接 LCD 后、它们变为3.7V。  

    我还检查了硬件连接。 SDA 和 SCL 连接到相应的 DSP 引脚。  

    DSP 28335用于不同的应用、因此软件不同。 不过 I2C 代码非常相似。  

    我将进一步研究这个问题。  

    假期快乐!  

    小明

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

    您好、Xiaoming、

    F2833x I2C 可能无法将 SDA/SCL 线路拉低至3.7V。 我建议检查 LCD 屏幕 I2C 线路的原理图。 它是否由外部供电、电压为3.7V?

    如果您断开 LCD 并运行应用程序代码、您是否在总线上看到通信(起始条件/从地址)? 如果是、则可能是与 LCD 相关的问题。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    软件不同。 它们用于不同的用途。  

    我断开 LCD、SCL 和 SDA 始终为高电平。 我看不到任何切换。  

    可能是针脚损坏了?

    此致、

    小明

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

    您好、Xiaoming、

    如果没有连接 LCD 并使用适当的上拉电阻器、则在运行软件时、您应该能够看到从器件寻址部分、后跟一个 NACK (因为总线上没有从器件)。

    您的总线卡在3.3V、现在不是3.7V、对吧? 您是否正确地在示波器上触发总线? 不确定您的软件是否设置为反复重试从器件寻址、但如果没有设置、则可能很难捕获从器件寻址部分。

    最棒的

    Kevin

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

    尊敬的 Kevin:

    我更新代码以测试 I2C 端口。 我使用内部上拉并断开 LCD。 我仍然看不到任何输出。 I2C 端口卡在3.3V。  

    我在 CCS 上观察一些变量:

    I2caRegs.I2CSAR

    I2caRegs.I2CDXR

    I2caRegs.I2CCNT

    误差

    它们都是0。

    我确信 DSP 会通过 I2C 函数、因为在返回命令和设置标志之前有一个标志。

    不知道这里发生了什么。 你有什么想法吗?

    此致、  

    小明

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

    您好、Xiaoming、

    是否在程序中将 I2CSAR 设置为从机地址? 您似乎需要执行一些进一步的调试、利用断点在执行期间的不同时间检查寄存器值和总线行为。

    您能否尝试在 c2000ware 中运行 i2c_EEPROM 示例并查看 I2C 总线上是否有任何内容? 您可能需要根据 SDA/SCL 使用的引脚来更改 GPIO 配置。 目录位置:

    C:\ti\c2000Ware_2_00_00_02\device_support\f2802x\examples\structs\i2c_eeprom

    最棒的

    Kevin

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

    尊敬的 Kevin:

    感谢您的建议! 我们正在努力取得成功。

    以下是我的更新:

    我尝试 了 i2c_EEPROM 并看到了输出。 我在 i2c_EEPROM 示例中重新编写了代码、并成功点亮了我的 LCD。  

    我将此代码移植到我的现有项目代码中、但它不起作用。  

    我将再次检查我的代码、如果我无法确定、我将上传我的代码并寻求帮助!

    谢谢!

    此致、  

    小明  

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

    尊敬的 Kevin:

    我无法解决问题。

    我上传了两个 C 程序文件供您查看。  

    第一个可以点亮 LCD、第二个不能点亮。  

    e2e.ti.com/.../I2C_5F00_EEPROM.txt

    e2e.ti.com/.../I2C_5F00_LCD.txt

    我认为唯一的区别是、一个在 RAM 上运行、另一个从闪存读取代码。  

    为什么会发生这种情况?

    此致、  

    小明

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

    您好、Xiaoming、

    简要看一下您的代码、它们之间似乎还有一些其他差异。 我建议对这两个文件进行真正的比较、即使用除比较之外的软件或其他比较工具等软件来帮助进行比较。

    例如...

    • 您可以将 I2C_LCD 中的 I2CISAR 设置为0x003E 而不是0x3E、不确定这是否会产生差异。
    • I2CCLKL 和 I2CCLKH 在这两者之间是不同的

    可能还需要尝试从 RAM 运行 I2C_LCD 代码、看看这是否会产生影响。

    最棒的

    Kevin

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

    尊敬的 Kevin:  

    感谢您的回复!

    我尝试过相同的代码、问题仍然存在。 我认为这是一个"从闪存引导"问题。

    由于问题与此主题的标题无关、而且我们的对话很长、我决定开始新主题。 欢迎您在新主题中讨论此问题。 链接在此处。  

    感谢您的长期帮助!

    小明

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

    您好、Xioming、

    不用客气。 好的、我相信惠特尼一定能够帮助您解决这个问题。

    只需确保、您的项目中是否有代码 start branch file、D 2833x_CodeStartBranch.asm 从闪存运行? 在引导加载程序之后、需要执行此操作才能正确跳转到代码的开头。

    最棒的

    Kevin