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.

[参考译文] CC3235SF:应用 CPU 未进入 LPDS

Guru**** 2558250 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1008028/cc3235sf-application-cpu-not-entering-lpds

器件型号:CC3235SF

在 SDK 4.30中遇到问题、器件在 I2C 发生错误后无法进入 LPDS。

将 CC3235用作 I2C 主设备并处于 I2C_MODE_CALLACK 模式。

I2C 总线上有时会出现以下错误。 我能够通过重试从这些情况中恢复。 I2C_STATUS_DATA_NACK、 I2C_STATUS_ADDR_NACK、 I2C_STATUS_ARB_LOST。

问题是在这种情况发生后、MCU 不会进入 LPDS。 I2C 继续正常工作。

如何调试该问题。 我已验证 我正在调用 I2C_CloseConnection()。 故障和成功。

下面是代码流程:

void I2C_Callback (I2C_Handle handle、I2C_Transaction * I2CTransaction_struct、bool 结果)

lastI2CTransStatus = I2CTransaction_struct->status;
SEM_POST (&App_CB.i2c 传输);

I2C_init();

I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
i2cParams.transferMode = I2C_MODE_CALLACK;
i2cParams.transferCallbackFxn =(I2C_CallbackFxn)&I2C_Callback;

i2cHandle = I2C_open (CONFIG_I2C_0、&i2cParams);

I2C_transfer (i2cHandle、&i2cTransaction);

错误= SEM_timedwait (&App_CB.i2c 传输、&ts);

在错误条件下、信号量返回-1

I2C_Close (i2cHandle);

此致

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

    您好!

    您如何处理这些错误? 来重新尝试传输?

    您知道 I2C 故障的原因是什么吗? 这种情况发生的频率有多高? 这是预期的吗?

    如果您使用(默认) I2C_MODE_BLOCKING、会发生什么情况? 您仍然看到错误吗? 进入 LPDS 时出现问题?

    您能否尝试在  失败后关闭 I2C (使用 I2C_Close、我不确定什么是 I2C_CloseConnection)并使用 SEM_Destroy、然后重新打开这两者?

    BR、

    Kobi

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

    您好、Kobi、

    是的、我们针对错误条件实现了重试。 重试按预期工作。

    在出现任何错误情况后:

    I2C_CANCEL (i2cHandle);

    如果 I2C 总线 SDA 由从器件保持低电平、则通过切换 SCL 线路来复位 I2C 总线、直到从器件释放 SDA。

    I2C_Close (i2cHandle);

    然后重试整个操作。

    故障原因是主设备和从设备之间的导线较长(约23cm)。 我们无法避免这种情况。 此错误极少发生。

    I2C_MODE_BLOCKING 导致无限期挂起条件、以避免我们实现的非阻塞条件。

    I2C_CloseConnection 仅为 I2C_Close (i2cHandle);并返回0。

    我可以尝试 SEM 销毁并重新打开。  

    我们能否查看一些变量的寄存器值以检查它为什么不进入 LPDS?

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

    我想我能够弄清楚原因。 在其中一个故障情况下,我没有在  I2C_TRANSF()之后调用 SEM_timedwait()。  

     这是预期 行为吗?

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

    它可以是。  我们需要验证这一点(在代码和 TRM 中)、但这并不简单。  

    您也可以尝试跟随 Power_sleep()来查看失败的位置。

    请尝试修复缺少的 SEM_timedwait() 并告知我们。

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

    您好、Kobi、

    我的测试更加严格。 问题似乎不是由于硬件设计而出现的、而是与驱动程序有关的问题。

     为了简化实现、我从 SDK 中修改了 i2ctemp 示例、并尝试在超时分块模式下重新创建行为。 我写入176个字节并重复读回7个字节。 我运行代码数小时、读取或写入时没有任何毛刺脉冲。  

    但当我有意在 I2C 总线上添加干扰时、我遇到了一些问题。 我希望代码能够从这些干扰中恢复。 但在某种情况下(I2C_STATUS_BUS_BUS_BUS_BUSY)、我必须重新启动 CC3235才能恢复它。 您能建议正确的方式从这种情况中恢复吗?

    我要附上修改后的代码和串行终端日志。 我将 TDO 和 TDI 引脚用于 I2C。

    我在错误条件中添加了 I2C 寄存器状态以及 SDA 和 SCL 逻辑分析仪。

    此致

    e2e.ti.com/.../i2ctemp_5F00_logs.txte2e.ti.com/.../modified_5F00_i2ctemp.c

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

    您好、Kobi、

    更多观察结果。 当从器件有时处于忙状态并且无法应答数据时、会出现以下情况。 CC3235从不会从这种情况中恢复。 从这种情况中恢复的唯一方法是循环通电。

    请检查附件。

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

    您好、Kobi、

    还有一种情况是主器件无法恢复。

    确认主机时出现延迟。  I2C_transferTimeout ()返回时、I2C_STATUS_ARB_LOST 、然后 I2C_STATUS_BUS_BUS_BUS_BUS_BUSY 永远不变。

    I 这个条件通过重新加载调试会话来解决这个问题。 无需重启电源。

    此致

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

    出现错误后、您是否尝试重置 I2C (即调用 I2CCC32XX_RESET)?

    我不确定模块是否可以在未  复位的情况下处理接口上的错误。

     

    BR、

    Kobi

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

    我将尝试更新您。

    您可以从 I2C 寄存器获得的任何提示。 为什么它甚至不尝试总线上的任何内容并返回  I2C_STATUS_BUS_BUS_BUS_BUSY。 在这个状态中、总线看起来完全空闲。 I2C 模块的一些内部状态机似乎在某种情况下处于停滞状态。

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

    我不确定您的干扰会导致什么、但模块似乎错过了 STOP 信号、并且它保持在总线忙状态(在 MCS 寄存器中)。

    我 已经简要检查 了 TRM ( https://www.ti.com/lit/pdf/swru543 ),但我找不到任何其它将使总线忙的东西。

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

    您好、Kobi、

    您能否咨询设备驱动程序团队? 他们必须有线索。

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

    请尝试重置模块。

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

    您好、Kobi、

    建议使用  I2CCC32XX_RESET 功能。 但它既未记录在代码中、也未在任何示例中使用。
    我发现、如果在 SDK 3.30.01.02中使用、但未在3.20.0.6中使用、并且不在4.10.00.07、4.20.00.07和4.30.00.06中使用。

    调用此函数时的用例是什么? 我是否应在器件启动阶段调用它? 或者 I2C_open 是否涵盖类似内容(我们仅在引导阶段使用此函数;I2C_init 当前不执行任何操作、即使是强制调用也是如此)?

    调用 I2C_transferTimeout 时、我们的错误是 I2C_STATUS_INCOMPLETE。
    总线上有2个从器件、但发生此问题时只有 LED 驱动器 ADP8866处于活动状态(其他从器件为 EEPROM 24LC64)。

    此致
    Jiří μ A

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

    我知道这不是 作为公共(TI 驱动程序) API 提供的、但您可以在 I2CCC32XX.c 中检查实现

    它使用 PRCM 复位 I2C 模块。

    /*
     *  ======== I2CC32XX_reset ========
     */
    void I2CCC32XX_reset()
    {
        PRCMPeripheralReset(PRCM_I2CA0);
        while(!PRCMPeripheralStatusGet(PRCM_I2CA0)) {}
    }
    

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

    那么、当检测到某些问题时、不应该在内部使用它? 我的意思是、它不应是应用的责任。

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

    并非所有问题都需要重置模块。 应用程序可能会决定在更好的情况下重置整个系统、

    此特定问题本来可以由驱动程序处理、但目前没有处理。

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

    它是否对  I2C_transferTimeout 返回的 I2C_STATUS_INCOMPLETE 有效?
    如果不是,在这种情况下,恢复程序应是什么?

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

    它表示并非所有字节都被写入/读取。  

    您需要检查 I2C 线路以更好地了解出现了什么问题。

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

    感谢您的提示。