2419952_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2419952_zh-CN

2419952_zh-CN

LPI2C6 无法发送 0 位吗?

您好,我正在尝试在我的 MIMXRT1170 SoC 上对连接到 T5 和 R5 的设备实现控制。

最初,我尝试这样设置:

  lpi2c_master_config_t cfg ;
  LPI2C_MasterGetDefaultConfig ( & cfg );
  LPI2C_MasterInit ( I2C_BASE , & cfg ,
                   srcClockHz );
  status_t start_status = LPI2C_MasterStart ( I2C_BASE , 0x15 , kLPI2C_Write );
 
我发现它在示波器上似乎没有按预期工作。我看到的是起始序列,然后是 0,之后就什么都没有了。所以我尝试直接在 MTDR 中写入类似这样的内容来替换启动命令:
 
I2C_BASE -> MTDR = 0x4FA ;
 
这个地址由很多 1 组成,后面跟着 1 和 0 交替出现。我在示波器上看到,在接收到第一个零之后,模块就放弃了,不再传输剩余的比特。为什么会发生这种情况?
image17148.png
为了方便起见,我附上原理图:
alex0_0-1791556133098.pngalex0_1-1791556168055.png

我还要补充一点,我们还增加了几个 2.2k 的引体向上。

Re: LPI2C6 can't send 0 bit?

嗨@alex0 ,

非常感谢您对我们产品的关注以及对我们社区的使用。

关于您提出的LPI2C6引脚T5和R5的通信问题,请查看以下内容:

1:引脚配置:将 SCL 和 SDA 配置为启用 SION 和启用开漏。确认 T5/GPIO_LPSR_11 已复用至 LPI2C6_SCL,R5/GPIO_LPSR_10 已复用至 LPI2C6_SDA。还要确认 SCL 和 SDA 输入 DAISY 选择是否指向这些焊盘,并检查上拉电阻。

mayliu1_3-1791599821057.png

2:调试接口:确认您使用的是 SWD 还是 JTAG。这些引脚(T5 和 R5)也具有 JTAG 功能。如果使用 JTAG,请检查是否存在引脚复用或板级连接冲突。

3:时钟配置:确认 LPI2C6 功能时钟已启用,并且传递给 LPI2C_MasterInit() 的 srcClockHz 值与其配置的频率相匹配。LPI2C 时序取决于该功能时钟。

请在完成这些检查后重试转账。如果在地址字节处仍然停止,请提供故障发生后捕获的SCL/SDA波形和LPI2C6 MSR值。


希望对你有帮助

顺祝商祺!

刘梅

Re: LPI2C6 can't send 0 bit?

你好May,谢谢你的快速回复!

1. 关于引脚配置,我注意到它与我们之前使用的略有不同,但 SION 和开漏已启用。尽管如此,我们还是尝试修改它,使其与截图完全一致——但仍然无效。

2. 关于 JTAG——我们已经了解。我们使用的是SWD,但似乎默认配置无需任何引脚配置即可正常工作。

3. 时钟工作正常。I2C配置为以100kHz运行,并且它正是以这个频率运行的。

以下是我们配置焊盘的方式:

  IOMUXC_SetPinMux(IOMUXC_GPIO_LPSR_10_LPI2C6_SDA,1U);
  IOMUXC_SetPinMux(IOMUXC_GPIO_LPSR_11_LPI2C6_SCL, 1U);
  IOMUXC_SetPinConfig(IOMUXC_GPIO_LPSR_10_LPI2C6_SDA, 0x21U);
  IOMUXC_SetPinConfig(IOMUXC_GPIO_LPSR_11_LPI2C6_SCL, 0x21U);

据我了解,IOMUXC_SetPinMux 函数负责处理输入 DAISY 引脚的选择。

#define IOMUXC_GPIO_LPSR_10_LPI2C6_SDA 0x40C08028U, 0x2U, 0x40C08090U, 0x1U, 0x40C08068U
#define IOMUXC_GPIO_LPSR_11_LPI2C6_SCL 0x40C0802CU, 0x2U, 0x40C0808CU, 0x1U, 0x40C0806CU

这似乎是正确的:

alex0_0-1791802030066.pngalex0_1-1791802048218.png

之后得到的 MSR 值为: 0x02000801


Re: LPI2C6 can't send 0 bit?

稍作更正,我们实际上使用的是JTAG,而不是SWD。

断开 JTAG 连接并按照您建议的配置(快速转换速率、正常驱动强度、保持选择)后,我们现在没有时钟信号。

image31606.png

 

Re: LPI2C6 can't send 0 bit?

嗨,玛丽,

我不太明白您所说的“仅仅拔掉 JTAG 探针可能无法隔离仍然连接到板上 SDA/SCL 网络的电阻器或其他电路”是什么意思。

我们将镜像写入板,断开 JTAG 探针与板的连接,然后执行上电复位。是否需要在软件方面进行一些额外的配置才能禁用 JTAG,还是这是硬件问题?

我提到的那两个电阻器确实是按照你描述的方式连接的。它们不在原理图中,但存在于 I2C 从设备侧。

Re: LPI2C6 can't send 0 bit?

嗨@alex0 ,

感谢您提供的最新信息。

我建议切换到 SWD 进行对比测试,并确认调试器和 RT1170 目标板均已连接并配置为 SWD。仅仅拔下 JTAG 探针可能无法隔离仍然连接到板上 SDA/SCL 网络的电阻器或其他电路。

我无法在您提供的原理图中识别出 SDA 和 SCL 网络上的上拉电阻。既然您提到要添加两个 2.2 kΩ 的上拉电阻,请您确认一个连接到 SDA,另一个连接到 SCL,并且两个电阻都上拉到相应的 I/O 电源?

此致,
可能

Re: LPI2C6 can't send 0 bit?

嗨@alex0 ,

1:抱歉,我之前的措辞不够清楚。我的意思并不是说在断开探针并执行上电复位后,还需要额外的软件步骤来禁用 JTAG。我担心后续的任何引脚配置是否可能会覆盖 LPI2C6 的 GPIO_LPSR_10/11 设置。请您在传输之前立即读取引脚多路复用寄存器、输入选择寄存器和焊盘控制寄存器,以确认 LPI2C6 配置仍然有效?

2:I²C 主设备和从设备是否在同一块板上?如果没有,请确认他们是否有共同点。

3:断开探针连接后,请通过 UART 或 GPIO 确认应用程序是否到达传输点,并记录传输返回状态以及传输前后 LPI2C6 MSR 的值。如果可用,SWD 调试可以帮助在传输停止时检查寄存器。

此致,
可能

Re: LPI2C6 can't send 0 bit?

嗨,May,

我很高兴地告诉大家,这个问题已经解决了。问题源于引脚配置重叠。CM7 的设置中定义了引脚复用,但 CM4 覆盖了该定义。

我们可以将其标记为已解决。感谢您抽出时间!

タグ(1)
評価なし
バージョン履歴
最終更新日:
昨日
更新者: