既にご覧になったように、i2c バスでは、sda ラインと scl ラインの両方でプルアップ抵抗が不可欠です。通常、sda ラインが双方向であることは明らかですが、スレーブがラインを低く維持してバスの速度を下げることができるため、scl もある程度双方向であることは明らかではありません。
多くの場合、衝突やプルアップの喪失などの物理的な問題が原因でバスがロックされる可能性があります。このような場合、一部のスレーブはまだアドレス指定されていることを認識しているため、バスを適切に解放しません。この状況は、マスターが出力 SCL パルスを送信し、最終的に回線が解放されたときに停止条件を送信することによって修正できます。しかし、奴隷がいないと言うなら、それはおそらくあなたの場合ではありません.
プルアップが一時的に切断されているため、マスターの i2c ペリフェラルが予期したときにラインが高くなることを認識していないことが原因である可能性があります。あなたの場合に私が考えることができる最善の解決策は、それらのプルアップを緩めないようにすることです. これを実現する最善の方法は、各ラインに 2 つまたは 3 つの抵抗器を並列に接続することです。この方法では、バスを「引っ張らない」ままにするために、2 つまたは 3 つすべてを切断する必要があります。SDA 用に 2 つの 10k 抵抗を並列に使用し、SCL 用に別の 2 つを使用します。