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.

[参考译文] CC2652R7:如果 UART 处于活动状态、则 I2C 上存在 I2C_STATUS_DATA_NACK 错误

Guru**** 2582905 points
Other Parts Discussed in Thread: SYSCONFIG, CC2652R7, CC2652P7

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1158221/cc2652r7-i2c_status_data_nack-error-on-i2c-if-uart-is-active

器件型号:CC2652R7
Thread 中讨论的其他部件:SysConfigCC2652P7

您好!

我的项目基于简单外设示例和 simplelink_cc13xx_cc26xx_sdk_5_40_00_40 SDK。 每当我并行使用 UART 和 I2C 时、我都会在 I2C 上收到 I2C_STATUS_DATA_NACK 错误。 如果没有通过 UART 进行通信、或者如果在初始化 UART 之后我没有立即与 I2C 通信、那么 I2C 可以正常工作。 但是、如果 UART 或 UART 中有任何正在进行的通信刚刚初始化、并且如果我尝试通过 I2C 发送数据、那么我将收到  I2C_STATUS_DATA_NACK 错误。 例如、执行 UART2_open、然后执行 I2C_Init、I2C_Open 和 I2C_transfer。 请就此向我提供帮助。

此致、

Madhudhan

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

    大家好、Madhusudhan、

    您参考的 SDK 和编译器版本是什么?  使用的基本示例项目是什么、涉及的是射频堆栈?  请提供 UART/I2C 用法或项目的代码摘录以进一步评估。  您是否考虑过在执行 I2C 传输之前等待 UART 完成或进入关键段(禁用硬件中断)?  您是否对两个外设都使用回调或阻塞模式?  您是否为每个外设使用单独的任务?每个外设的优先级是多少?

    此致、
    Ryan

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

    您好、Ryan、

    我的项目基于 simple_peripheral 示例。 我使用 的是 simplelink_cc13xx_cc26xx_sdk_5_40_00_40 SDK 和 TI Clang v1.3.0.LTS 编译器。  

    我刚刚意识到 UART 和 I2C 通信正处于同一任务中。 很抱歉。  

    简单来说、我 的代码序列如下:UART2_Open、I2C_Init、I2C_Open、然后是 I2C_transfer。 然后、我将获得  I2C_STATUS_DATA_NACK。 请注意、此处未通过 UART 进行通信。 我刚才打开了 UART2驱动程序实例。  

    如果在上述序列中、我注释掉 UART2_Open、则 I2C_transfer 会成功。

    此致、

    Madhudhan

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

    您好、Ryan、

    我想我发现了这个问题。 我没提到过、UART2_Open 和 I2C_Init 之间有一行代码 Power_setConstraint (PowerCC26XX_Disallow_STANDBY)。 如果我注释掉功率限制线、则 I2C 工作正常。 如果我注释 UART2_Open 并保留功率限制线、那么 I2C 也可以正常工作。 您能 解释一下问题到底是什么吗?

    此致、

    Madhudhan

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

    大家好、Madhusudhan、

    感谢您提供更新。  您是否已从 BLE SysConfig 模块(射频堆栈-> BLE ->高级设置->电源管理)中删除了省电功能?  否则、您应该允许应用程序控制电源管理。  目前、I2C TI 驱动器具有自己的功率限制控制、这会干扰您的应用。  如果您不打算使用 UART RX、那么您也不需要禁止待机。  如果您确实需要 UART RX、则删除 POWER_SAVE_SAVE_POWER 并进一步监视您的电源策略/实现。

    此致、
    Ryan

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

    您好、Ryan、

    在我的项目中启用了 POWER_SAVing。 我需要 UART RX、因此在 UART 操作完成之前不允许待机。 启用 power_saving 后,我们是否可以禁止应用程序的待机? 我不想处理整个电源管理过程、所以我启用了省电模式、并且在必要时不允许待机、这样电源管理就不会将芯片置于待机模式。  如何禁止 在 I2C 中将备用导联连接到 I2C_STATUS_DATA_NACK?

    即使我不允许应用程序进入待机状态、而是 在 UART2_open 后调用 UART2_rxEnable、也会出现问题。

    使用以下代码序列、我将获得 I2C_STATUS_DATA_NACK。

    UART2_OPEN
    UART2_rxEnable
    I2C_init
    I2C_open
    I2C_transfer

    具有以下代码序列的 I2C 工作正常。

    UART2_OPEN
    I2C_init
    I2C_open
    I2C_transfer

    此致、

    Madhudhan

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

    您可以 使用 i2ctmp 测试 I2C TI 驱动程序和 Power_setConstraint (PowerCC26XX_disallow_standby)。  这也将很好地验证没有 BLE 接口的 UART RX 的使用情况。  UART2_rxEnable 也会关闭低功耗模式。  LPSTK-CC1352R1还有一个使用 UART (仅限 TX)、I2C 和 BLE 的 multi_sensor 示例、您可以进一步参考该示例。  您可以考虑使用带有 UART 的流控制从 LPM 唤醒并处理 RX 操作。  另一种选择是使用 传感器控制 器进行位 bang UART 或 I2C 控制、尽管这将要求传感器控制器内核在运行期间处于活动状态。  您是否有示波器或逻辑分析仪来进一步观察 I2C 通信 有何不同?

    此致、
    Ryan

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

    您好、Ryan、

    我已导入 i2ctmp 示例项目并进行了更改以在 I2C 之前添加 UART2。 我仍然可以看到问题。 如果对 UART2代码进行了注释、则 I2C 工作正常、否则会出现  I2C_STATUS_DATA_NACK 错误。  

    我已经在使用传感器控制器作为 UART 仿真器与其他器件进行通信。

    我正在努力获取逻辑分析仪、以观察两种情况下的 I2C 通信。 我捕获日志后会通知您。

    此致、

    Madhudhan

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

    i2ctmp 示例应该已经使 UART2和 I2C 连续工作。  您是否意味着您添加了 UART2 RX 功能、并出现了该问题?  否则、我建议您进一步评估按预期运行的 i2ctmp 解决方案、并相应地修改您的 BLE 应用。  如果您在任务之间切换(不能连续运行)、传感器控制器可以同时支持 UART 和 I2C。  鉴于传感器控制器在模拟 UART 时必须处于活动状态、您尝试实现的平均功耗是多少?

    此致、
    Ryan

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

    您好、Ryan、

    我已删除 i2ctmp 示例中的显示 UART 并添加了一个正常的 UART2实例。 我还修改了 i2ctmp 示例中的 i2c 代码以唤醒我的 i2c 从器件芯片。 为了更好地理解、我附加了工作中和非工作中的 i2ctmp 项目。 在工作项目中、只有 i2c 存在、在非工作项目中、我在 I2C 之前打开了 UART2实例。

    我还获得了工作场景和非工作场景的逻辑分析仪日志、并附加了相同的日志。 在问题场景中、I2C SCL 被上拉、这会阻止 i2c 从器件芯片通过 SDA 发送数据。

    e2e.ti.com/.../i2c-issue-projects.zip

    e2e.ti.com/.../i2c-issue-logic-analyzer-logs.zip     

    I2C 工作:

    I2C 故障:

    此致、

    Madhudhan

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

    我已经尝试在  LPSTK-CC1352R1上使用支持 I2C 接口的板载湿度和光传感器的 i2ctmp、i2copt3001_CPP 和 multi_sensor 项目来重现此问题、并且在每种情况下添加另一个 UART2模块或改变第一个模块的用途不会与 I2C 操作相冲突。  这包括带/不带电源策略和 UART2_rxEnable。如果未使用 Display 模块、请确保将其从 SysConfig 中删除、否则尝试打开 Display 引用的 UART2实例可能会导致问题。  您是否使用 TI LaunchPad 进行测试?  如果没有、请考虑使用、并检查定制电路板上是否存在任何冲突的引脚分配或连接。  证据表明这 是硬件问题。

    此致、
    Ryan

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

    您好、Ryan、

    我使用的是定制硬件。 我已从 SysConfig 中删除显示模块、您可以在我之前共享的示例项目文件中看到该模块。 引脚分配正确、UART 连接到另一个微控制器、UART 通信正常、I2C 连接到安全元件芯片。 从工作和非工作示例项目中可以看出、唯一的区别是 UART2_OPEN 在 I2C 之前完成。 此外、您还可以看到它在逻辑分析仪捕获的两种情况下如何影响 I2C 通信。 这是一个硬件问题吗? 您还能解释一下为什么在问题场景中上拉 I2C SCL?

    此致、

    Madhudhan

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

    请允许我澄清。  首先、感谢您提供展示您的问题的示例项目。  遗憾的是、它们不会重复我正在使用的硬件的错误行为。  这就是我怀疑硬件差异可能与观察到的行为有关的原因。  这也是一种感官体验、因为其他社区成员能够同时使用 UART 和 I2C。  您可以考虑更改上拉电阻器值或尝试使用 TI LaunchPad 重现问题、以便其他人能够复制并提供进一步帮助。  在 I2C 故障期间、SimpleLink 器件是否检测到第一个 I2C 读取 ACK?   

    此致、
    Ryan

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

    您好、Ryan、

    我正在尝试使用 TI Launchpad 来重现此问题。 我将使用安全元件芯片(i2c 从器件)的分线板、并将其连接到 TI launchpad、然后尝试重现问题。 将在测试完成后通知您。 在回答有关 I2C 读取 ACK 的问题时、在 I2C 故障场景中、我只从 I2C_Transfer API 获取了数据 NACK。

    此致、

    Madhudhan

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

    您好、Ryan、

    我能够再现 TI CC2652R7 Launchpad 和 SparkFun ATECC508A 分线板的问题。 我运行了我之前与您共享的示例代码项目、我能够重现此问题。 我通过以下链接购买了 ATECC508A 分线板。 请告诉我如何继续。

    www.rhydolabz.com/.../sparkfun-cryptographic-coprocessor-breakout-atecc508a-qwiic-p-2797.html

    此致、

    Madhudhan

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

    大家好、Madhusudhan、

    感谢您提供更多信息。  您如何将分线板连接到 LaunchPad、故障和工作情况下的通信逻辑分析仪屏幕截图是否与之前提供的相同?  您是否已将项目更改为 ATECC508A ( 0x60)的 I2C 地址、项目之间的唯一其他差异如下所示?

        UART2_Handle uart;
        UART2_Params params;
    
        UART2_Params_init(&params);
        params.baudRate = 115200;
        params.readMode = UART2_Mode_BLOCKING;
        params.writeMode = UART2_Mode_BLOCKING;
        // Open the UART
        uart = UART2_open(CONFIG_UART2_0, &params);
    

    此致、
    Ryan

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

    您好、Ryan、

    我已使用常规母对母连接器将 ATECC508A 分线板连接到 Launchpad (已连接下图)。 逻辑分析仪的屏幕截图与之前针对工作用例和非工作用例提供的屏幕截图相同(附在下面的屏幕截图中)。 是的、我已将 I2C 地址更改为0x60、您可以在下面的逻辑分析仪屏幕截图中看到该地址、项目之间的唯一区别是 UART 、如上所示。

    I2C 工作:

    I2C 不工作:

    此致、

    Madhudhan

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

    XDS110或外部电源如何为您的 CC2652P7供电?  您的代码实现不应打开 I2C 两次(编辑:请注意、您正在关闭 I2C 驱动程序、复位比特率、然后重新打开)。  您是否尝试过使用任何其他 UART 引脚名称?  您是否还可以使用 v6.20 SDK 进行测试、因为版本说明中提到了 UART2驱动程序的多个更新?  同样、我将尝试根据这些信息进行一些进一步的测试。

    release_notes_coresdk_cc13xx_cc26xx_6_10_00_13.html 
    release_notes_coresdk_cc13xx_cc26xx_6_20_01_00.html 

    此外、关闭编译器优化时行为是否会受到影响?  您是否尝试过回调模式?

    此致、
    Ryan

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

    您好、Ryan、

    我已经使用 simplelink_cc13xx_cc26xx_sdk_6_20_00_29 sdk i2ctmp 示例项目进行了测试、看起来它现在可以正常工作。

    要在自定义项目中进行测试、我必须将我的项目从 simplelink_cc13xx_cc26xx_sdk_5_40_00_40移植 到 simplelink_cc13xx_cc26xx_sdk_6_20_00_29。 我已经开始处理它。 您是否有任何有关此移植的文档?  

    此致、

    Madhudhan

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

    您可以查看 BLE5-Stack 迁移指南、但最终最好导入 SDK v6.20 simple_peripheral 示例并直接应用您的应用更改。

    此致、
    Ryan