示波器中的锯齿波而不是方波
I2C 总线时钟和数据引脚以开漏(开集)模式驱动。
所以它不会是方波。
下降沿将是一个陡峭的台阶,但上升沿将是一个鲨鱼鳍状的 RC 充电波形。
所以你看到的是正常的,但是波形上升时间可能太慢了。
您应该调查总线是否符合所有芯片的规格,但看起来上升时间可能会更快一些,因此您可能需要更强的上拉。
您需要在 I2C 线路上使用更强(值更低)的上拉电阻,以便更快地为线路上的任何电容充电。
无论是什么驱动 I2C 线路都可以非常强烈地将线路拉低,但不会将线路驱动为高,这取决于上拉电阻将其拉高。
如果您的示波器探头具有 10x 模式,请尝试启用它。如果您以前没有这样做过,您可能还需要调整 10 倍补偿微调器。
对于典型的示波器探头,1x 模式的电容约为 100 pF,而 10x 模式的电容约为 15 pF。连接到 I2C 的 100 pF 电容类似于大约 1 米的额外电缆,这会减慢上升时间。
示波器轨迹显示 SCL 和 SDA 信号的时间常数远远超出了运行总线的频率所需的时间常数。我看到大约 20us 的时间常数。
你描述的电路应该在 SCL/SDA 和地之间有一个小于 100pF 的电容。连同 I2C 推荐的 10kOhm 量级的上拉电阻,我们应该看到 1E-10F * 1E4Ohm = 1E-6s = 1us 的时间常数。
但我们看到的是 20us 的时间常数(大约)。所以,你没有告诉我们什么。要么你在每条线和一个低阻抗节点(例如电源轨)之间连接了~2nF的电容,要么你没有10kOhm的上拉电阻。
如果你没有在那里贴额外的电容器,看起来你有大约 200kOhm-1MOhm 的上拉电阻 - 一到两个数量级太高了,这取决于这些线上的寄生电容。
这种上拉电阻将在微控制器 GPIO 引脚上的弱上拉范围内。所以看起来你正试图在微控制器中只用弱上拉来运行 I2C。这还不够。在 SCL 和 I/O 电源电压之间连接 10-15kOhm,对于 SDA 也是如此。