ST意法半导体
直播中

世态薄凉

8年用户 1151经验值
私信 关注
[问答]

微控制器通过I2C总线传输的值错误怎么解决?

大家好,

我正在使用 STM32F303CB 微控制器,与不支持 CLK 延展的 I2C 从设备相连。I2C 总线线路被 4k75 欧姆电阻拉高,线路有一个 50 欧姆(大约)的串联电阻。示意图如下图所示。


我配置从站并在正常模式下运行它的例程如下。

  • 使用 HAL_I2C_Master_Transmit() 重置从机。
  • 延迟 100 毫秒。
  • 使用 HAL_I2C_Master_Transmit() 配置从机。
  • 延迟 1.5 毫秒。
  • 使用 HAL_I2C_Master_Transmit_IT() 运行从机(从配置模式到正常模式)。

威廉希尔官方网站 是在一定数量的 PCB 上实现的,并且该例程在大多数 PCB 上运行良好。然而,在某些 PCB 上,从站无法正常启动,并且发现问题出在我上面提到的例程的第 5 步。

通常,传输的数据应如下图所示(0x2A -> 从属地址,0x0A -> 从属内部的内存位置,0x00 -> 要写入该内存的数据)。


然而,在这些特定的 PCB 上,从设备的内存位置字节在 I2C 总线上传输不正确。µC“应该”传输 0x58 而不是 0x0A。


注意 - CLK 延长也会发生在正确的传输中,因此应排除此错误的原因。

如果是位偏移之类的,我可以理解这种错误。但这远非一点点转变。0x0A -> 0x58 移位是我无法理解的。因此,我也测试了模拟端,并注意到没有检测到毛刺/毛刺(500 MS/秒)。


正如我之前所说,从机不能控制 I2C 总线(没有 CLK 延展!)。PCB 上没有发生干扰。所有被测 PCB 的测试环境都是相同的。总线/电压系统上没有电压尖峰或奇怪的噪音。

由于硬件方面的选项开始耗尽,我开始从代码的角度进行调查。我试图查看是否从 µC 向从机发送了正确的值,它确实是正确的。由于 I2C 外设本身没有内部缓冲区,它总是指向我们在函数参数中提到的数组。数组变量的值在任何时候都不会更新。因此,当 I2C 通信正在进行时,变量不可能被覆盖。

如果有人知道我在处理什么,那就太好了。如果需要更多信息,请随时询问,我会立即分享。

谢谢!



回帖(1)

李敏

2022-12-28 14:28:23
大家好,

我正在使用 STM32F303CB 微控制器,与不支持 CLK 延展的 I2C 从设备相连。I2C 总线线路被 4k75 欧姆电阻拉高,线路有一个 50 欧姆(大约)的串联电阻。示意图如下图所示。


我配置从站并在正常模式下运行它的例程如下。

  • 使用 HAL_I2C_Master_Transmit() 重置从机。
  • 延迟 100 毫秒。
  • 使用 HAL_I2C_Master_Transmit() 配置从机。
  • 延迟 1.5 毫秒。
  • 使用 HAL_I2C_Master_Transmit_IT() 运行从机(从配置模式到正常模式)。

该威廉希尔官方网站 是在一定数量的 PCB 上实现的,并且该例程在大多数 PCB 上运行良好。然而,在某些 PCB 上,从站无法正常启动,并且发现问题出在我上面提到的例程的第 5 步。

通常,传输的数据应如下图所示(0x2A -> 从属地址,0x0A -> 从属内部的内存位置,0x00 -> 要写入该内存的数据)。


然而,在这些特定的 PCB 上,从设备的内存位置字节在 I2C 总线上传输不正确。µC“应该”传输 0x58 而不是 0x0A。


注意 - CLK 延长也会发生在正确的传输中,因此应排除此错误的原因。

如果是位偏移之类的,我可以理解这种错误。但这远非一点点转变。0x0A -> 0x58 移位是我无法理解的。因此,我也测试了模拟端,并注意到没有检测到毛刺/毛刺(500 MS/秒)。


正如我之前所说,从机不能控制 I2C 总线(没有 CLK 延展!)。PCB 上没有发生干扰。所有被测 PCB 的测试环境都是相同的。总线/电压系统上没有电压尖峰或奇怪的噪音。

由于硬件方面的选项开始耗尽,我开始从代码的角度进行调查。我试图查看是否从 µC 向从机发送了正确的值,它确实是正确的。由于 I2C 外设本身没有内部缓冲区,它总是指向我们在函数参数中提到的数组。数组变量的值在任何时候都不会更新。因此,当 I2C 通信正在进行时,变量不可能被覆盖。

如果有人知道我在处理什么,那就太好了。如果需要更多信息,请随时询问,我会立即分享。

谢谢!



举报

更多回帖

发帖
×
20
完善资料,
赚取积分