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.

[参考译文] CC2340R5:I2C 未在 SimpleLink Zephyr (CC2340R5) 中检测到器件、但在 LPF3 SDK 和上游 Zephyr 中工作

Guru**** 2905440 points

Other Parts Discussed in Thread: CC2340R5, TMP112

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1641108/cc2340r5-i2c-not-detecting-devices-in-simplelink-zephyr-cc2340r5-but-works-in-lpf3-sdk-and-upstream-zephyr

器件型号: CC2340R5
主题: TMP112

使用 SimpleLink Zephyr 时、我在基于 Texas Instruments CC2340R5 的定制电路板上遇到 I2C 问题。

消息

  • 定制板 (CC2340R5)
  • 两个 I2C 器件:
    • TMP112
    • ATECC608.
  • 使用 Zephyr I2C API 实现的 I2C 扫描仪

观察结果

  1. SimpleLink Zephyr(TI 下游)
    • I2C 扫描仪 未检测到任何器件
  2. LPF3 SDK (TI SDK)
    • 相同的硬件+相同的布线
    • 两个设备都被正确检测到
  3. 上游 Zephyr(在 CC1352R1 LaunchPad 上测试)
    • 相同的扫描仪逻辑工作正常
    • 是否正确检测到器件

Zephyr 代码:

 

下面附上了使用的 Zephyr 代码(用于 SimpleLink 和上游 Zephyr)。

i2c_scanner.zip 


其他注意事项

  • 验证硬件是否正常工作(LPC3 SDK 确认这一点)
  • 存在且正确的上拉电阻
  • I2C 频率设置为 100kHz

问题

在以下方面是否存在任何已知问题或区别:

  • SimpleLink Zephyr 与 LPF3 SDK 中的 I2C 驱动程序行为?
  • Zephyr 中的 CC23xx 所需的配置 (pinctrl、电源域或驱动程序 init)?

具体而言、我想了解:

  • 为什么相同的 I2C 逻辑在 LPC3 SDK 和上游 Zephyr 中工作、但在 SimpleLink Zephyr 中失败
  • 是否需要额外配置才能使 I2C 在 Zephyr 的 CC2340R5 上正常运行

任何指导或参考示例都将非常有用。

谢谢。

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

    您好!

    目前、I2C 的 Zephyr 和 LPF3 SDK 驱动程序实现之间没有已知错误或巨大差异。
    我要说的最大区别是、已经对驱动程序进行了一些修改、以符合 Zephyr API 和配置。
     Zephyr 3.7.0-ti-9.10.01_ea 中添加了 I2C

    我认为调试的第一步是观察通过 I2C 线路实际发送的内容。 我建议您使用逻辑分析仪或任何其他工具、使用 LPC3 SDK 和 Zephyr 下游在 I2C 线路上记录信号、并查看是否存在任何布尔值差异。

    另外需要注意的是、像 CC1352R1 这样的 F2 器件仅受 Zephyr 开源社区的支持、而 TI 工程师则不支持。

    此致、
    Lea  

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

    尊敬的 Lea:

    我在 SimpleLink Zephyr 和 LPF3 SDK 上运行相同的扫描仪代码时、在 μ I²C 线路上完成了逻辑分析仪捕获。

    观察 (SimpleLink Zephyr):

    • SDA/SCL 上根本没有活动
    • 未生成启动条件
    • 这些行在整个执行过程中保持空闲
    • 最初怀疑的军控冲突,但排除了

    观察 (LPC3 SDK/CCS):

    • 在总线上可以看到正确的 μ I²C 活动
    • START、ADDRESS (0x48 和 0x60)、ACK、DATA 和 STOP 条件都存在
    • 两个器件都正确响应并被检测到

      SimpleLink Zephyr 中 CC23xx 上的 μ I²C 是否需要任何其他配置(pinctrl,电源域或时钟使能)?

    如果不是、这里可能会出现什么问题?

    谢谢。此致、

    Nafih

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

    您好!

    这太令人惊讶了。 我已经确认 I2C 正在使用 CC2340R53 LaunchPad 上下游最新版本的 Zephyr:

    下面是我用于测试的项目: e2e.ti.com/.../i2c_5F00_sample.zip

    是否知道您是否能够在 LaunchPad 上重现问题? 我现在最好的调试建议是记录您所使用的 I2C 函数的错误代码,并将全局日志级别设置为 3 ,这样错误将显示在以下 Kconfigs 中:

    CONFIG_LOG=y
    CONFIG_LOG_DEFAULT_LEVEL=3

    与我的项目相比、我在您的项目中看到的一些问题是您从不调用 i2c_configure 函数、这应该会导致错误–22。 启用日志记录后、您应该能够更轻松地看到此问题。

    此致、
    Lea

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

    您好、

    对延迟的回复表示歉意。 在过去一周里、我被其他一些高度优先的任务束缚住了。

    我能够解决我这边的问题。 μ I²C 总线在以下事件后开始正常工作:

    1. Explicitly configuring the controller usingi2c_configure(i2c_dev, I2C_MODE_CONTROLLER | I2C_SPEED_SET(I2C_SPEED_STANDARD));
    2. i2c_transfer() i2c_read() 对于扫描仪逻辑、从切换到。 通过这些更改、现在可以正确检测到两个器件并观察到正确的总线活动。

    我有一个后续问题:是否有已知原因导致 i2c_transfer() 此设置在 i2c_read() 按预期工作时失败? 了解这是否是限制、配置依赖关系或特定于当前驱动程序实现的内容会有所帮助。

    感谢您的支持。

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

    您好!

    您能告诉我在调用 i2c_transfer 时是否返回错误代码吗? 这将有助于缩小问题的范围。

    此致、
    Lea

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

    您好、

    是的、 i2c_transfer() 我这边返回了一个错误。

    1. 第一次迭代时、器件正确响应、 没有错误
    2. 第二次迭代开始i2c_transfer() 始终返回 –22

    对于上下文、呼叫在连续 for 循环(I²C 扫描仪样式)中、因此同一事务将背靠背重复。

    这种行为是一致的:

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

    我没有可以读取的 I2C 器件、因此我这边无法重现问题。

    令人惊讶的是、该函数只起作用一次、然后返回 EINVAL。
    当未配置驱动程序或 i2c_message 结构不正确时、例如 NULL 缓冲区、长度为 0 或错误标志、可能会发生这种情况。

    您能否分享您在示例中使用的代码?

    此致、
    Lea

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

    我在下面附上我的代码。  

    谢谢
    e2e.ti.com/.../5621.i2c_5F00_scanner.zip

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

    你好、Nafih!

    我很遗憾没有 I2C 目标,所以在我这边,你的代码只返回–5 错误,因为找不到有效的 I2C 目标:

    0x03 处无器件(错误:–5)
    0x04 处无器件(错误:–5)
    0x05 处无设备(错误:–5)
    0x06 时无器件(错误:–5)
    0x07 时无器件(错误:–5)
    0x08 时无器件(错误:–5)
    0x09 时无器件(错误:–5)
    在 0x0A 时无器件(错误:–5)
    0x0B 处无器件(错误:–5)
    0x0C 处无器件(错误:–5)
    0x0D 时无器件(错误:–5)
    ...

    i2c_read 的代码在后台使用 i2c_transfer。 您可以在 Zephyr\include\Zephyr\drivers\i2c.h 中看到这一点:

    static inline int i2c_read(const struct device *dev, uint8_t *buf,
    			   uint32_t num_bytes, uint16_t addr)
    {
    	struct i2c_msg msg;
    
    	msg.buf = buf;
    	msg.len = num_bytes;
    	msg.flags = I2C_MSG_READ | I2C_MSG_STOP;
    
    	return i2c_transfer(dev, &msg, 1, addr);
    }

    因此、如果能够连续运行多个 i2c_read、应该能够连续运行多个 i2c_transfer。

    此致、
    Lea