Armadilloフォーラム

I2Cスレーブデバイス2個接続で通信が不安定

kdhiro

2022年2月18日 9時05分

現在、Armadillo-640のI2C3を有効化して添付のデバイス2種類をI2C3に接続させて動作をさせていますが、
動作途中でデバイスが認識されなくなります。デバイス1種類づつのみの接続では安定して連続動作します。
プルアップ抵抗等も調整しましたが改善されません。原因が分からず、投稿させて頂きました。
デバイスは、それぞれMCP23017(アドレス0x68)とMCP3425(アドレス0x20)です。

ファイル ファイルの説明
mcp3425.pdf
mcp23017_mcp23s17.pdf
コメント

at_shiita.ishigaki

2022年2月18日 11時00分

石垣です。

> 動作途中でデバイスが認識されなくなります。デバイス1種類づつのみの接続では安定して連続動作します。

どのような条件でデバイスが認識できなくなるか特定できないため、
できればI2Cアナライザー、無ければオシロスコープを使用して波形の確認を行い、
デバイスが認識できなくなる条件を特定するべきかと思われます。

> 石垣です。
>
> > 動作途中でデバイスが認識されなくなります。デバイス1種類づつのみの接続では安定して連続動作します。
>
> どのような条件でデバイスが認識できなくなるか特定できないため、
> できればI2Cアナライザー、無ければオシロスコープを使用して波形の確認を行い、
> デバイスが認識できなくなる条件を特定するべきかと思われます。

オシロスコープ等で波形を見ていますが、波形のなまり等も見られません。
PythonプログラムでI2Cの連続リード動作をしている最中に突然、下記のエラーが
出て止まってしまいます。

BlockingIOError: [Errno 11] Resource temporarily unavilable

現在、プログラムのリード間隔時間を3秒入れるようにすると
安定するようになりましたが、時々、上記エラーが出て停止
します。I2C通信自体の理解も浅いのですが、リード間隔3秒
が長いように思うのですが、プログラムに問題があるので
しょうか?

アットマークテクノの古賀です。

kdhiroさん:
>>>動作途中でデバイスが認識されなくなります。デバイス1種類づつのみの接続では安定して連続動作します。
>>
>>どのような条件でデバイスが認識できなくなるか特定できないため、
>>できればI2Cアナライザー、無ければオシロスコープを使用して波形の確認を行い、
>>デバイスが認識できなくなる条件を特定するべきかと思われます。
>
>オシロスコープ等で波形を見ていますが、波形のなまり等も見られません。
>PythonプログラムでI2Cの連続リード動作をしている最中に突然、下記のエラーが
>出て止まってしまいます。
>
>BlockingIOError: [Errno 11] Resource temporarily unavilable
>
>現在、プログラムのリード間隔時間を3秒入れるようにすると
>安定するようになりましたが、時々、上記エラーが出て停止
>します。I2C通信自体の理解も浅いのですが、リード間隔3秒
>が長いように思うのですが、プログラムに問題があるので
>しょうか?

オシロスコープで観測される波形に問題がないのであれば、ハードウェア要因ではなく、ソフトウェアが要因だと思われます。動作停止する際に出るという、上のエラーメッセージにある 'BlockingIOError' が、Python の BlockingIOError 例外なのであれば、この例外を送出する条件が成立しているのでしょう:
 https://docs.python.org/ja/3/library/exceptions.html#os-exceptions

二点確認させて下さい:

Q1.) リード間隔時間を3秒入れない状態で動かした際、動作途中でデバイスが認識されなくなる症状が起きた時も、上記のエラーメッセージが出て停止するのでしょうか?あるいは、別のエラーメッセージが出るのでしょうか。

Q2.) お使いになっている二つの I2C デバイスは、AD コンバーター(MCP3425)と I/O エクスパンダー(MCP23017)ですが、これら二つのデバイスとの I2C 通信は、逐次的に行っている(一方との通信が完了した後、他方との通信を行う)という認識で合っているでしょうか?

Python による I2C 通信を、どのように行っていらっしゃるのか分からないのでコメントするのが難しいですが、もし、asyncio やスレッドを使った構造になっているのであれば、それらを使わず、単純に、main 内で二つの I2C デバイスとの I2C 通信を逐次行うループを実行するプログラムを作って、症状が再現するかどうかを見て頂くと、要因の切り分けに役立つかと思います。

Q1については、同じBlockingIOErrorが出ます。Q2については、逐次的に行っています。
ADコンバータとI/Oエクスパンダ―の電源をCON9の8pin又は20pinから供給していますが、これをArmadillo-640に
供給しているDC5Vに変更したところ、安定動作するようになりました。これは、CON9のDC3.3Vの電源の供給できる
電流の能力が不足していたのでは?と推測しております。CON9のVCC_3.3Vの供給できる電流の最大値は何Aでしょうか?

アットマークテクノの古賀です。

動作が不安定になる原因は、ソフトウェア要因ではなく、対向 I2C デバイスの電源だったようですね。

kdhiroさん:
>Q1については、同じBlockingIOErrorが出ます。Q2については、逐次的に行っています。

了解しました。

>ADコンバータとI/Oエクスパンダ―の電源をCON9の8pin又は20pinから供給していますが、これをArmadillo-640に
>供給しているDC5Vに変更したところ、安定動作するようになりました。これは、CON9のDC3.3Vの電源の供給できる
>電流の能力が不足していたのでは?と推測しております。CON9のVCC_3.3Vの供給できる電流の最大値は何Aでしょうか?

CON9 に出ている VCC_3.3V の最大出力電流については、マニュアルの「15.4. 電源回路の構成」にあるブロック図に記載しています:
 https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

この図によると、CON4 10pin, CON7 9pin, CON9 7,8,20pin, CON10 1pin, CON11 4,5pin, CON14 1pin の合計で最大 500mA となっています。
お使いになっている二つの I2C デバイスのデータシート記載の Supply Current の値を見ると、この値に比べると十分小さいですが、CON9 以外のピンからの出力電流に依存するかと思いますので、状況からすると、おっしゃるように VCC_3.3V からの電源供給能力に不足が生じるのでしょうね。

どちらの I2C デバイスも、データシートによれば電源電圧 5V でも動作するようですから、今回対応されたように、CON12 1pin または CON13 2pin から VCC_5V 入力電源をとって頂くのが良いと思います。