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.

[参考译文] LP-MSPM0C1104:I2C 目标读取失败

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1404135/lp-mspm0c1104-i2c-target-read-failed

器件型号:LP-MSPM0C1104

工具与软件:

我根据"i2c_target_rw_multibyte_fifo_interrupts"示例实现了它。
主器件侧通过 I2C 正常与 MCU 通信
但是、主器件端将无法读取 MCU。
我添加了日志以在中断中查看事件状态并获得以下结果
DL_I2C_IIDX_TARGET_START
↓μ A
DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER
↓μ A
DL_I2C_IIDX_TARGET_START
↓μ A
DL_I2C_IIDX_TARGET_STOP

无法输入事件 DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER。
我尝试了在 syscfg 中启用 TXFIFO_TRIGGER
但结果仍然相同
还有其他需要设置的内容吗?

此外、我如何知道地址的位0是1还是0? (读取或写入)

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

    您好、Ken、

    首先、确保 SDA 和 SCL 线路上存在强上拉电阻(2.2k)。  接下来、您将需要一个示波器或逻辑探头(例如 Saleae)并监控 I2C 线路。  您可以捕获第一个字节、即地址字节、并检查 ADDR (位7..1)和 R/W 位0。

    让我知道你发现了什么。

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

    您如何判断主器件发生了故障? 这个跟踪似乎表明它成功了。

    对于该示例、我观察到 TXFIFO 触发器会在启动时立即发生、因为 FIFO 为空、然后程序填充 Tx FIFO (16字节)。 从 FIFO 填充后续读取请求时、目标不会直接看到该请求、因此跟踪不会在启动和停止之间显示任何内容。

    另一条线索是、在启动后、如果 TX FIFO 为空、目标将延展时钟、因此(假设所需的中断以某种方式未发生)、我们将不会在您的迹线中看到停止。

    顺便说一下:除了添加迹线之外、您是否更改了此示例中的任何其他内容?

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

    仅获取寄存器、无地址

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

    对不起,也许我没有明确地表达自己。

    我对读取 I2C 通信的理解如下:Start→Address→Reg→Start→Data... →停止。

    与中断事件相对应、我认为应该是:

    DL_I2C_IIDX_TARGET_START
    ↓μ A
    DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER
    ↓μ A
    DL_I2C_IIDX_TARGET_START
    ↓μ A
    DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER
    ↓μ A
    DL_I2C_IIDX_TARGET_STOP

    这就是我问如何确定地址的位0是0还是1的原因、因为我需要知道这是读取操作。 如果是、我需要读取内部表并将其填充到 Tx FIFO 中、以返回到主器件。

    或者我是否误解了某件事?

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

    尊敬的 Dennis:

    抱歉、您可能误解了我的观点。 我指的是如何在程序中确定地址的位0是0还是1、或者是否有一个函数告诉我当前进程是写入还是读取操作。

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

    TXFIFO 中断是请求填充它、而不是表示它正在耗尽。 如果 FIFO 不为空、则会  自动发送 Tx (主器件接收)字节。

    我在 I2C 寄存器中没有看到指示方向的任何内容(我可能错过了它)。   [编辑:我正看着它,没有看到它。 我认为 SSR:TREQ 和 SSR:RREQ 可以告诉你一些东西。  [参考 TRM 第13.2.3.7节]]

    一种策略可能是将 TXFIFO 中断启用移至 START 中断。  

    另一种方法可能是根本不使用 TXFIFO 中断、而是接受 RXFIFO (非空)中断、生成输出、  然后将其存储在 TX FIFO 中。 您可能需要使用 ACKOEN/ACKOVAL 来对此 Rx 进行流控制[参考 TRM (SLAU893A)第13.2.3.4节]对于此[参考 TRM 第13.2.3.7节]、您将需要 SCLKSTRETCH=1。  

    TXWAIT_STALE_TXFIFO 功能[Ref TRM Sec 13.2.3.12.1]在此处可以使用。

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

    Ken、您好。

    通常您不需要解码 R/W 位。  该位与器件 ADDRS 一起由 HW 解码、并且根据该位是 R 或 W、MSP I2C 外设逻辑将进入读取或写入状态。  如果该位为 W、则主机将数据写入 MSP、MSP 将进入 RXFIFO。  此时、您将设置 I2C ISR 处理程序来处理 RXFIFO 中断、删除传入的数据、并将其放入您在应用中创建的缓冲区中。  

    请记住、在主机和 MSP 之间来回传递的数据有某种类型的一致协议。 例如、协议可能如下所示:[cmd][length][data]。  MSP 将通过查看 CMD 来接收数据包并解析该 CMD、并从中了解主机是否会请求一些数据、并可准备 TXFIFO 在主机发送下一个 R/W = READ 的数据包时发送数据。

    因此、我会看一下 M0 SDK 中的一些 I2C DriverLib 示例、以便了解如何在 ISR 处理程序中管理 RXFIFO 和 TXFIFO。  这样、您的应用程序就不需要费心去解释操作。  让中断可以控制步骤序列。

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

    状态更新:

    主设备现在可以从目标读取数据、但我不确定我的方法是否正确。

    我发现、DL_I2C_TARGET_STATUS_QUICK_COMMAND_READ_WRITE中的SLAVE.SSR允许我确定该操作是读取还是写入。

    因此、我QUICK_COMMAND_READ_WRITERXFIFO_TRIGGER事件期间添加了一项检查、以决定是否填充 TXFIFO。

    事件流程如下所示:


    DL_I2C_IIDX_TARGET_START
    ↓μ A
    DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER
    ↓μ A
    DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER
    ↓μ A
    DL_I2C_IIDX_TARGET_START
    ↓μ A
    DL_I2C_IIDX_TARGET_STOP

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

    这对您有用吗?

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

    是的、使用示波器测量时的波形看起来正确

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

    太棒了!  软件是否按您希望的方式工作?  还有其他问题吗?