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.

[参考译文] AM6442:M4F I2C 无法在 MCU+SDK 11.0.0.15上正常运行

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1500722/am6442-m4f-i2c-not-working-on-mcu-sdk-11-0-0-15

器件型号:AM6442
主题:SysConfig 中讨论的其他器件

工具/软件:

您好:

在升级到 MCU+SDK 11.0.0.15后、我尝试在 M4F 上使用 MCU_I2C0。 我正在使用高级驱动程序、I2C_TRANSFER()函数总是返回状态 I2C_STS_ERR_TIMEOUT。 之前、我使用的是 MCU+SDK 9.1.0.41、它使 I2C 正常工作。 我还应注意、M4F 运行 FreeRTOS 并使用 IPC RPMsg 与 A53 (运行 Linux)进行通信。

以下是在 M4F 上执行 I2C 传输的代码:

#define I2C_BUF_SIZE 16u
#define I2C_TIMEOUT_MS 100u

uint8_t i2c_rx_buf[I2C_BUF_SIZE] = {0u};
uint8_t i2c_tx_buf[I2C_BUF_SIZE] = {0u};
I2C_Handle i2c_handle;
I2C_Transaction i2c_transaction_handle;

static int32_t i2c_transfer_msg(uint8_t i2c_send_buf[], uint8_t send_buf_len, uint8_t i2c_recv_buf[], uint8_t recv_buf_len, uint8_t i2c_addr)
{
    if ((i2c_send_buf == NULL) || (i2c_recv_buf == NULL)) // Ensure the pointers aren't NULL
    {
        return I2C_STS_ERR;
    }
    
    memset(i2c_rx_buf, 0, I2C_BUF_SIZE); // Clear the I2C Rx buffer
    
    int32_t status;
    
    i2c_transaction_handle.targetAddress = i2c_addr;
    i2c_transaction_handle.writeBuf = i2c_send_buf;
    i2c_transaction_handle.writeCount = send_buf_len;
    i2c_transaction_handle.readBuf = i2c_recv_buf;
    i2c_transaction_handle.readCount = recv_buf_len;
    i2c_transaction_handle.timeout = I2C_TIMEOUT_MS;
    //i2c_transaction_handle.controllerMode = true;
    //i2c_transaction_handle.expandSA = false;
    
    status = I2C_transfer(i2c_handle, &i2c_transaction_handle);
    
    if (status != I2C_STS_SUCCESS)
    {
        status = I2C_recoverBus(gI2cHandle[CONFIG_I2C0], I2C_TIMEOUT_MS);
    }

    memset(i2c_tx_buf, 0, I2C_BUF_SIZE); // Clear the I2C Tx buffer

    return status;
}

这是用于 I2C 的 SysConfig:

我还应该注意的是、在我更改了    ${MCU+SDK}/source/drivers/i2c/v0/i2c_v0.c.中 I2C_OPEN ()函数的这一行之前、MCU_I2C0没有正确初始化

我 将 I/O 连接到 I2C、让它在这个新的 MCU+SDK 版本上运行会非常好。

感谢您的帮助!

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

    尊敬的 Brycen:

    感谢您报告上述错误。 是的、需要使用 AddrTranslateP_getLocalAddr() API 调用来转换为 M4F 内核配置的 RAT 地址。  

    我将提交一个内部 Jira 工单、以便在下一个版本中将其修复。

    此致、

    Tushar

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

    尊敬的 Tushar:

    1)我们是否在谈论 MCU+SDK v11.1的版本来纠正?

    2)您可能需要检查 AM62x MCU+SDK 的 M4F 内核是否有相同的问题。

    晚一点

    Jim

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

    您好、Jim、

    1)我们是否在谈论 MCU+SDK v11.1的版本来进行校正?

    是的、您回答正确。

    2)您可能需要检查 AM62x MCU+SDK 的 M4F 内核是否存在相同的问题

    AM62x SDK 具有正确的实现。

    请参阅下图。

    此致、

    Tushar

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

    尊敬的 Tushar:

    是否有办法 让 M4的 I2C 与新的 MCU+SDK 配合使用? 还是将在下一个版本中修复? 升级到 MCU+SDK 11.0后、每当我启动 I2C 传输时、I2C 总线都会挂起、永远不会发送该消息。 MCU+SDK 9.1中没有这种情况。

    我感到困惑的是,我在最初的帖子中提到的两个错误中的哪一个将在下一个版本中得到修复。

    谢谢、

    Brycen

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

    您好、Brycen

    请参阅 faq-processor-sdk-am64x-no-to-open-i2c-drivers-for-mcu-i2c 中建议的步骤

    此致、

    Tushar

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

    尊敬的 Tushar:

    我已经尝试过、但仍然无法使用 M4F I2C。 每当我使用 I2C_TRANSFER()函数时、数据不会发送、它会返回 I2C_STS_ERR_TIMEOUT。 我已经使用逻辑分析仪验证了 I2C 总线上没有数据传输。 我之前在 MCU+SDK 9.1上使用了这个功能、因此我不确定为什么它在这里不起作用。

    谢谢、

    Brycen

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

    尊敬的 Brycen:

    我已经测试了这个示例、它按预期运行。 您能否确认您是否能够使用 I2C_PROBE () API 探测 I2C 器件?

    另外、请确保器件已正确连接并通电。

    此致、

    Tushar

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

    尊敬的 Tushar:

    感谢您展示我的 I2C_PROBE () API 函数。 将其与逻辑分析仪结合使用、向我展示了 I2C 正在 M4F 上工作。 我的问题是超时周期设置为100ms (这之前在 MCU+SDK 9.1上测得、比 I2C 传感器的最大响应时间长约10倍)。  

    为什么发生超时后 I2C 总线不可恢复? 我尝试使用此函数将其恢复:

    status = I2C_recoverBus(gI2cHandle[CONFIG_I2C0], I2C_TIMEOUT_MS);

    删除 i2c_transaction_handle 中设置的超时设置(在我的原始代码中)后、I2C 便正常工作。 您能给我展示如何正确使用 I2C 超时来复位 I2C 总线吗?

    感谢您的帮助、

    Brycen

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

    尊敬的 Brycen:

    是否可以尝试为超时配置不同的值?

    下面是在 SDK 中与 I2C_recoverBus () API 一起使用的几个宏。 请参阅下图。

    请尝试使用上述值一次并更新结果。

    此致、

    Tushar

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

    尊敬的 Tushar:

    我已经尝试过您提供的值、这些值看起来正常工作。 我的 I2C 不会一直返回  I2C_STS_ERR_TIMEOUT 状态。

    感谢您的帮助!

    Brycen