私はI2Cを介してSTマイクロコントローラと通信するためにKontron組み込みコンピュータを使用しています。説明されている単純なread()およびwrite()関数を使用してI2Cとインタフェースするために開発アダプタを使用しています。ここ。
問題は、スレーブが何らかの理由でバイトを受け入れない場合、I2Cバスが停止し、マスターは何も送受信できないことです(プログラムが閉じて再起動されますが!)。現在、I2Cバスをリセットする唯一の方法は再起動ですが、これは理想的ではありません。私ができることを提案する人はいますか?
答え1
私はDesignWare I2Cコントローラを使用してUpBoardX86を操作してきました。カーネルをバインド解除して/dev/i2c-5
デバイスを再バインドする方法を見つけました。
ls -al /dev/i2c-5
echo -n "808622C1:01" > /sys/bus/platform/drivers/i2c_designware/unbind
ls -al /dev/i2c-5
echo -n "808622C1:01" > /sys/bus/platform/drivers/i2c_designware/bind
ls -al /dev/i2c-5
名前/dev/i2c-*
とデバイスツリーのパス名は、使用しているハードウェアによって異なります。バインド解除後、ls -al コマンドは失敗し、デバイスが存在しなくなったことを示します。次の記事でこれを行う方法を学びました。https://lwn.net/Articles/143397
これがあなたが経験している問題が解決されるかどうかはわかりませんが、おそらく再起動に関連する最も近い方法です。