Armadilloフォーラム

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

marumo_mizuno

2019年2月18日 18時36分

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

【不具合現象】
・アプリケーション使用中、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

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

コメント

at_mizo

2019年2月20日 10時51分

溝渕です。

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

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

[Armadillo実践開発ガイド 第3部: i2cdevドライバー]
https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-3_ja-3…

marumo_mizuno

2019年2月22日 19時40分

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

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

丸茂電気の水野です。

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

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

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

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

at_mizo

2019年2月22日 19時57分

溝渕です。

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

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

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

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

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

marumo_mizuno

2019年2月25日 17時51分

水野です。

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

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

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

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

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

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

marumo_mizuno

2019年3月12日 18時22分

水野です。

無事解決しました。
エラーが起きた際フラグを建て、フラグが建っているとき
スレーブデバイス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カーネルでは、デバイスドライバ等で制御しているピンをユー
> > ザーランドから直接触ることはできません。
> >
>
> デバイスドライバで制御している場合はアクセスできない旨、かしこまりました。
>
> 実際に行い解決しましたらまたコメント致します。

tec_inoue

2019年6月10日 16時59分

パシフィックシステムの井上と申します。
現在、水野様と同様外部からのノイズによりI2Cのデバイスに対して読み書き不能になるという現象に直面しております。

> 水野です。
>
> 無事解決しました。
> エラーが起きた際フラグを建て、フラグが建っているとき
> スレーブデバイス0x00~0xffに対してリードをかけ
> エラーが起きたICに対して初期化処理を行うようにしました。
>
> これによりI2CのPINを抜き挿ししても次回アクセスできるようになりました。
>

水野様は解決されたとのこと
> エラーが起きたICに対して初期化処理を行うようにしました。
初期化処理とは具体的にどのようにされたのでしょうか?

ご教示くださいますよう、お願いします。

marumo_mizuno

2020年2月3日 12時00分

遅くなり申し訳ありません。
開発を半年ほど離れていたため確認していませんでした。
丸茂電気の水野です。

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

ここでいう初期化設定は、
ICに対して使用する際どのように使うか最初に書き込んでいると思います。
其方を指しています。

> パシフィックシステムの井上と申します。
> 現在、水野様と同様外部からのノイズによりI2Cのデバイスに対して読み書き不能になるという現象に直面しております。
>
> > 水野です。
> >
> > 無事解決しました。
> > エラーが起きた際フラグを建て、フラグが建っているとき
> > スレーブデバイス0x00~0xffに対してリードをかけ
> > エラーが起きたICに対して初期化処理を行うようにしました。
> >
> > これによりI2CのPINを抜き挿ししても次回アクセスできるようになりました。
> >
>
> 水野様は解決されたとのこと
> > エラーが起きたICに対して初期化処理を行うようにしました。
> 初期化処理とは具体的にどのようにされたのでしょうか?
>
> ご教示くださいますよう、お願いします。
>