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.

[参考译文] MSPM0G1106:I2C 下拉 SDA 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1317916/mspm0g1106-i2c-pulling-down-sda-issue

器件型号:MSPM0G1106

您好!

我最近看到过这种行为。

我的设备正像这样干扰线路。

另一个器件正在发送我们观察到的消息。 完成消息后、我的设备会尝试发送一些内容、然后永远拉低线路。 我已经检测到是我的器件在下拉线路。

如何检测自己的设备是否堵塞线路? 我看到没有碰撞中断。

发送前、我用  

        如果(! DL_I2C_getSDAStatus( I2C_INST )
          &&DL_I2C_getSCLStatus ( I2C_INST )
然后通过选中"BUSY"复选框
          while ((DL_I2C_getControllerStatus (I2C_INST)
              DL_I2C_CONTROL_STATUS_BUS_BUS ()
此后:
-填充 FIFO
-   while ((!( DL_I2C_getControllerStatus ( I2C_INST )&
                DL_I2C_CONTROL_STATUS_IDLE ())
-   DL_I2C_startControllerTransferAdvanced (I2C_INST
              (i2c_msg_G.buf[ 0 ]>>1),DL_I2C_CONTROLLER_DIRECTION_TX,
              I2C_msg_G.length - 1、DL_I2C_CONTROL_START_ENABLE、DL_I2C_CONTROL_STOP_ENABLE、
              I2C_MCTR_ACK_DISABLE );
注意:这并不总是发生。 我目前每350ms 运行一次测试、其中3个器件同时发送一条消息。 有时它失败后的30消息。 有时故障需要较长时间。
我想知道如何检测和处理碰撞,并使"发送前"流程有效。 其他器件与我的器件不同、不基于 TI。  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更新:这是我为了把它发下来而做的。 我实施了超时传输、每次超时、我都会这样做

    DL_I2C_disablePower ( I2C_INST );
    DL_GPIO_initDigitalOutput (GPIO_I2C_IOMUX_SCL);
    DL_GPIO_initDigitalOutput (GPIO_I2C_IOMUX_SDA);

    DL_GPIO_writePins (GPIO_I2C_SCL_PORT、
    GPIO_I2C_SCL_PIN | GPIO_I2C_SDA_PIN );
    DL_GPIO_initPeripheralInputFunctionFeatures (GPIO_I2C_IOMUX_SDA、
    GPIO_I2C_IOMUX_SDA_FUNC、DL_GPIO_INVERSION、
    DL_GPIO_resistor_none、DL_GPIO_hysteresis_disable
    DL_GPIO_WAKEUP_DISABLE);
    DL_GPIO_initPeripheralInputFunctionFeatures (GPIO_I2C_IOMUX_SCL、
    GPIO_I2C_IOMUX_SCL_FUNC、DL_GPIO_INVERSION、
    DL_GPIO_resistor_none、DL_GPIO_hysteresis_disable
    DL_GPIO_WAKEUP_DISABLE);
    DL_GPIO_enableHiZ (GPIO_I2C_IOMUX_SDA);
    DL_GPIO_enableHiZ (GPIO_I2C_IOMUX_SCL);
    DL_I2C_enablePower ( I2C_INST );
    它最终会失败、并显示如下行:
    我尝试用 DL_i2c_Reset()函数重置它,但它不起作用。 问题是、当它发生故障时、控制器通常处于繁忙状态。
    我真不知道该怎么办。 感谢您的帮助
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Asiel;

    您需要检查并确保以下几个问题:

    1)。  从发送的图1可以看出 M0是目标器件。 主机器件将0x59写入 M0后、仍会出现七个时钟且发生七位传输。 但 I2C 传输的格式应为8位数据+ ACK、因此此处的 I2C 传输对于某些未完成。 级联结构。 你可以尝试找出原因。 可能是由主机器件造成的。

    2)。 如果只想使用 M0将数据发送到主机器件、M0也可以在 I2C 目标模式下发送数据、只能控制 SCL。 但是、如果您希望让 M0控制 SCL 并将数据发送到其他器件、则应先将 I2C 切换到 GPIO 、然后再通过 IOMUX 将目标重新配置为主机、请参阅 MSPM0G 系列用户指南的"8.2.1章外设功能分配"。 我发现我的同事 Helic 已经在帖子"MSPM0G1106:I2C 干扰"中回复了您。 之后、您可以继续配置 I2C 主机配置(例如 DL_I2C_startControllerTransferAdvanced 等)。  

    3)。 在配置 I2C 时、我认为您不需要配置 Hi-Z、或许您可以尝试删除 Hi-Z 配置。 当输出逻辑为1时、 输出为高阻抗。 Hi-Z 不是高电平或低电平。 大家可以看到 Hi-Z 为"开路"、它的阻抗非常高。 Hi-Z 将使 I2C 主机器件对 I2C 目标器件没有影响。

    4)。 您可以检查 SDA 和 SCL 线路的上拉寄存器。

    5). I2C 支持一个主机<->乘法目标、但它不支持乘法主机<->一个目标。 因此、您应该检查"其中3个器件同时发送消息"的含义。

    6)。 我们的 SDK 提供许多示例代码、可帮助您更正代码和配置。

    此致、

    K·扬茨

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

    谢谢!  

    1.-这是一个  需要满足要求的多主机通道、因此在发送目标时不是什么选择、这就是我正在进行从主设备到目标设备的动态切换的原因。 但是、是的、我看到我的器件是尝试发送并随后保持线路的器件。

    2.-我不知道我必须先更改引脚、然后才能从主设备切换到目标设备。 我没有将 GPIO 从目标更改为控制器。 GPIO 变化是因为、为了解决第一个问题、我强制 SCL 和 SDA 加电、然后回到 I2C 模式。 我不知道是否遵循正确的顺序来实现它。

    我将删除高阻态。 只是我不知道如何在 I2C 和 GPIO 模式之间切换。 我只是基于自动生成的初始化。

    4.-我如何以及为什么可以检查它?

    5.-通信中的所有器件都是多主器件、

    6.-我已经对它们进行了检查、我的代码便是基于这些检查的。

    7.-是否可以中止传输? 即使它尚未开始或正在进行的事务?

    感谢您的支持。

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

    现在、我认为您需要做以下事情:

    1)。 阐明整个操作流程的逻辑、这可以帮助您找到错误。

    2)。 检查是否只有一个主机器件同时执行发送任务。 多个主机器件无法同时发送消息。

    3)。 检查第一张图中发送的 M0是主机器件还是目标器件。 如果 M0在更改后是目标甚至是主机、也不可能因为没有第二条读取/写入指令而中断 M0发送过程。 请查看其他设备的发送过程中断的原因(我已在之前的回复中提到)。 如果 M0最初是主机、请检查 M0代码以确保发送过程不完整的原因。

    3)。 但是、在主机模式和目标模式之间切换之前、最好先执行取消初始化、然后重新初始化。 这就是为什么 Helic 可以更改引脚功能。

    4)。   I2C 支持一个主机<->乘法目标、但它不支持乘法主机<->一个目标。 因此、您应该检查"其中3个器件同时发送消息"的含义。

    5). 您可以尝试根据我们的 SDK 示例代码构建您的项目。

    6)。 如果您仍有问题、您可以向负责您或您所在地区的 AE/FAE 发送电子邮件。

    希望您可以解决这个问题、此致、

    K·扬茨

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

    也许与负责您的 FAE 联系是个不错的选择、他可以到现场为您提供帮助。

    此致、

    K·扬茨