I2C ダミークロック リセットについて

いつもお世話になります。
丸茂電機㈱ 水野と申します。
宜しくお願い致します。

【不具合現象】
・アプリケーション使用中、I2Cラインへの外部要因(ノイズ等)によりI2Cの通信が取れなくなる。

【お聞きしたい内容】
・不具合が発生した際のエラー処理を追加するため、下記2点について教えてください。
マニュアルや過去フォーラム投稿を確認してもわからなかったため、お手数かけますがよろしくお願い致します。

1.armadillo-440は起動時に、I2Cデバイスに対してダミークロックを出力してますが、
 自作アプリケーションにて同じようにダミークロックを出力する方法を教えてください。

2.上記ダミークロックを出力しても解決しない場合、
 armadillo-440のCPUであるi.MX25自体のI2C部分をソフトリセットする方法を教えてください。

【環境】
・armadillo-440 LCD拡張付
・atmark-dist-20171227
・linux-2.6.26-at25
・atde4-amd64-qt

以上、何卒宜しくお願い致します。

製品: 
Armadillo-440

溝渕です。

> 1.armadillo-440は起動時に、I2Cデバイスに対してダミークロックを出力してますが、
>  自作アプリケーションにて同じようにダミークロックを出力する方法を教えてください。

i2cdev等を利用して、存在しないスレーブアドレスに対してアクセスしようと
すると、クロックが出力されます。

[Armadillo実践開発ガイド 第3部: i2cdevドライバー]
https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-3_ja-3.0.0/ch02.html#_i2cdev%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC

> 溝渕です。
>
> > 1.armadillo-440は起動時に、I2Cデバイスに対してダミークロックを出力してますが、
> >  自作アプリケーションにて同じようにダミークロックを出力する方法を教えてください。
>
> i2cdev等を利用して、存在しないスレーブアドレスに対してアクセスしようと
> すると、クロックが出力されます。
>
> [Armadillo実践開発ガイド 第3部: i2cdevドライバー]
> https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-3_ja-3.0.0/ch02.html#_i2cdev%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC
>

遅くなり申し訳ありません。

丸茂電気の水野です。

溝渕様、コメントありがとうございます。

エラーを検出した際、使用していないスレーブアドレスに対してioctrlでアクセスするようにすれば
ダミークロックのようにできるという解釈でよろしいでしょうか。

また、I2CのPINはCON14-3をSCLにCON14-4をSDAとして使用しています。
gpioの/sys/class/gpio/CON9_12のようにI2Cで使用しているPINへのアクセスは可能でしょうか。

お手数かけますがよろしくお願い致します。

溝渕です。

> エラーを検出した際、使用していないスレーブアドレスに対してioctrlでアクセスするようにすれば
> ダミークロックのようにできるという解釈でよろしいでしょうか。

ダミークロックは、現在進行中のI2Cシーケンスを終了させるために出力しま
す。そのため、スレーブデバイスの最長のI2Cシーケンス分のクロックを送出
する必要があります。

クロックを出す為にはread/writeする必要があると思います。

> また、I2CのPINはCON14-3をSCLにCON14-4をSDAとして使用しています。
> gpioの/sys/class/gpio/CON9_12のようにI2Cで使用しているPINへのアクセスは可能でしょうか。

基本的に、Linuxカーネルでは、デバイスドライバ等で制御しているピンをユー
ザーランドから直接触ることはできません。

水野です。

溝渕様、コメントありがとうございます。

> > エラーを検出した際、使用していないスレーブアドレスに対してioctrlでアクセスするようにすれば
> > ダミークロックのようにできるという解釈でよろしいでしょうか。
>
> ダミークロックは、現在進行中のI2Cシーケンスを終了させるために出力しま
> す。そのため、スレーブデバイスの最長のI2Cシーケンス分のクロックを送出
> する必要があります。
>
> クロックを出す為にはread/writeする必要があると思います。

わかりました。
スレーブデバイスに対してread/writeしてみます。

> > また、I2CのPINはCON14-3をSCLにCON14-4をSDAとして使用しています。
> > gpioの/sys/class/gpio/CON9_12のようにI2Cで使用しているPINへのアクセスは可能でしょうか。
>
> 基本的に、Linuxカーネルでは、デバイスドライバ等で制御しているピンをユー
> ザーランドから直接触ることはできません。
>

デバイスドライバで制御している場合はアクセスできない旨、かしこまりました。

実際に行い解決しましたらまたコメント致します。

水野です。

無事解決しました。
エラーが起きた際フラグを建て、フラグが建っているとき
スレーブデバイス0x00~0xffに対してリードをかけ
エラーが起きたICに対して初期化処理を行うようにしました。

これによりI2CのPINを抜き挿ししても次回アクセスできるようになりました。

コメントありがとうございました。

> 水野です。
>
> 溝渕様、コメントありがとうございます。
>
> > > エラーを検出した際、使用していないスレーブアドレスに対してioctrlでアクセスするようにすれば
> > > ダミークロックのようにできるという解釈でよろしいでしょうか。
> >
> > ダミークロックは、現在進行中のI2Cシーケンスを終了させるために出力しま
> > す。そのため、スレーブデバイスの最長のI2Cシーケンス分のクロックを送出
> > する必要があります。
> >
> > クロックを出す為にはread/writeする必要があると思います。
>
> わかりました。
> スレーブデバイスに対してread/writeしてみます。
>
> > > また、I2CのPINはCON14-3をSCLにCON14-4をSDAとして使用しています。
> > > gpioの/sys/class/gpio/CON9_12のようにI2Cで使用しているPINへのアクセスは可能でしょうか。
> >
> > 基本的に、Linuxカーネルでは、デバイスドライバ等で制御しているピンをユー
> > ザーランドから直接触ることはできません。
> >
>
> デバイスドライバで制御している場合はアクセスできない旨、かしこまりました。
>
> 実際に行い解決しましたらまたコメント致します。