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.

[参考译文] LAUNCHCC3220MODASF:I2C 通信问题。

Guru**** 2589300 points
Other Parts Discussed in Thread: CC3220SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/997817/launchcc3220modasf-problem-with-i2c-communication

器件型号:LAUNCHCC3220MODASF
主题中讨论的其他器件:CC3220SF

您好的支持团队。

我通过 I2C 将 CC3220SF 与 FRAM 存储器和 RTC 通信。
我使用的是 TI-RTOS 和德州仪器 I2C 驱动程序。
I2C 的频率为400KHz。
仅在几秒钟后与两个器件进行通信。
我正在使用 I2C_transferTimeout 函数、当错误发生时、该函数的返回值为 I2C_STATUS_ERROR。
我查看了 Texas I2C.c 驱动程序代码、但未找到问题的线索。
我将逻辑分析仪连接到 I2C 引脚、并在 LED 上连接了一个触发信号、我称之为"Blu"。
当 I2C_transferTimeout 函数返回 I2C_STATUS_ERROR 时、我将"Blu" LED 编程为上升。
此图来自使用 FRAM 的传输。
在此事务中、我配置了:
从器件地址= 0x50;
写入字节数= 2、这两个字节是要访问的 FRAM 存储器的地址0x00和0x18;
读取字节数= 6、在这种情况下、将读取地址0x0018的6个字节。

在下图中、当通信成功时、我在顶部放置了一个捕获、在底部放置了一个错误发生时。

图的两部分来自同一个捕获、上部大约为19.3ms、误差大约为49.9ms。

我注意到的不同之处在于、在将地址发送到 FRAM 后、:
1 -仅发生 ACK (A)、CC3220SF 不执行重复启动(SR);
2 -由于某种原因、I2C 总线在没有 SCL 时钟的情况下保持空闲;
3 -在一个几乎2字节的周期后、停止(P)发生;
4-一段时间后、启动(S)发生;
5 -从器件的地址被放置用于读取、并且 FRAM 发送顶部看到的相同数据;
6 -但是 I2C_transferTimeout 函数返回 I2C_STATUS_ERROR、从而触发蓝光信号。

出现此错误后、所有后续事务都会指示 I2C_STATUS_ERROR。
我注意到、即使重新启动调试、问题仍然存在、我需要执行上电复位。 我不知道任何器件都在保持 I2C 总线。
我还使用 I2C_transfer 函数进行了测试、并出现了相同的症状、一段时间后、该函数返回 false、查看逻辑分析仪、行为类似。

我使用的是 CCS 10.3.0.0000007和 SimpleLink CC32xx SDK 5.10.0.02。

我还在问题发生时放置了一个包含 I2C 寄存器的映像。

感谢你的任何帮助。

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

    您好!

    感谢您提供详细的调试信息。 通过查看 I2C 寄存器、我得到了以下注释:

    总线处于 RX 模式
    无时钟超时错误、总线似乎处于空闲状态[MCS]
    RX FIFO 满、检测到停止、中断挂起[MRI]
    没有屏蔽中断、禁用中断? [MIMR]
    SDA、SCL 检测到高电平[MBMON]
    6字节突发[6 byte burst、MBLEN]
    突发完成[burst complete、MBCNT]
    所有 I2C 从器件寄存器0、仅主器件模式有效(正确)
    FIFO 有0x0 -不清楚是否没有数据、或者只是当前字节为0x0
    当存在6个以上字节时触发 RX FIFO。 RX FIFO 不为空
    TX FIFO 为空

    话虽如此、我怀疑上面的寄存器没有反映错误条件、因为根据驱动程序已经完成的错误处理、自返回 I2C_STATUS_ERROR 后、状态可能会发生变化。

    查看这些驱动程序、返回 I2C_STATUS_ERROR 的唯一合理方法似乎是发生时钟超时。 这大致与提供的寄存器内容一致-查看驱动程序、如果检测到时钟超时、发出 STOP 并执行清理。

    话虽如此、默认情况下不应启用时钟超时。 是否启用 SCL 超时? 如果是、如果您禁用它会发生什么情况?

    此致、

    Michael

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

    您好、Michael、感谢您的提示。

    我实际上设置了 SCL 超时。
    在初始化 I2C 接口时、我调用 I2C_setClockTimeout 函数。
    因此寄存器 I2CMCLKOCNT 的 CNTL 值指示2。
    我禁用了对 I2C_setClockTimeout 的调用、使寄存器 I2CMCLKOCNT = 0。
    这确实解决了问题、我用逻辑分析仪将程序运行了1个多小时、触发器未触发。

    非常感谢。