• ベストアンサー

PICマイコンによるI2C通信について

私は高専の学生で、マイコンを使う部活に所属しております。 今回の活動で、複数のPICを使用することになり、I2C通信を使おうと思っています。 そこで、ある問題が発生しました。 PICによるI2C通信の解説を行っているとある方のサイトには、 「I2Cの通信方式は+5VにプルアップされたSDAとSCLの各信号線を、それぞれのデバイスがオープンドレイン等によるワイヤードオア接続で信号の操作と共有を行っている関係から、 電気的にはあまり強い環境ではありません。 なので、沢山のデバイスを接続したり、通信距離を長くしたりといったことには不向きなので、 ハードウエアの構築には細心の注意が必要でしょう。」 とあります。 今回の活動で使うPICは、事情により700~800mm程度離れた状態になると思われます。 距離が長い通信には不向きとありますが、この場合は大丈夫なのでしょうか。 また、I2C通信が不可能な場合はどのような通信手段を使えばよいのでしょうか。 知っている方がいらっしゃったら、御回答をよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.3

なんというか、とりあえず動けばいいのか、例えば製品レベルできちんと動かさなければいけないのか、によります。 とりあえず動けばいいなら、1mくらいなら、I2Cでも数百kbpsくらいの速度なら多分動くと思います。 SPIは、I2CのようにワイヤードORの線かはないので、I2Cよりは長距離でも動く可能性が高いです。 ただ、もしかしたらPICのピン直結だと駆動力が足らないので、外に別に駆動用のトランジスタを設けたほうがいいかもしれません。まあ。多分直結でも大丈夫なんではないかと思いますが。 もし、製品レベルできちんと動くものがほしいなら、I2CもSPIも基本的には不適です。(不可能ではないでしょうけど)

ozwind
質問者

お礼

とても具体的な回答ありがとうございます。 ロボットコンテスト用に使う為、I2Cでやってみようと思います。 もしかしたら、オンボードになるかもですし。 御回答ありがとうございました。

その他の回答 (2)

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

1mくらいなら、まあ、そんなに気にしないでも大丈夫という気はしますが。 心配なら、I2Cではなくて、SPIなんかにしたらどうでしょう。(ピン数が増えてしまいますが)

ozwind
質問者

補足

SPI通信の方でも考えてみたのですが、 SPI通信の事を調べる際に参考にした以下のサイト http://www.hi-ho.ne.jp/hida/pic41.htm では、SPI通信による通信もケーブルを使用した通信ではなく 基盤上のデバイス間通信に使うとあります。 SPI通信でも距離的な問題が発生するのではないでしょうか? 未熟者で申し訳ありませんが、御回答をよろしくお願い致します。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

>今回の活動で使うPICは、事情により700~800mm程度離れた状態になると思われます。 I2Cは本来近距離用のシステムですので、5V駆動でシールド線を使用し低速なモードであっても心配が残ります。 >また、I2C通信が不可能な場合はどのような通信手段を使えばよいのでしょうか。 距離が長くなることに対しての信頼性を要求するのであれば、ツイストペアケーブルを使用した差動信号方式の通信を使用すべきです。

ozwind
質問者

補足

ツイストペアケーブルを使用した差動信号方式の通信というのは、 つまりLANを使用するということでしょうか? 研究にあまり時間をかけたくない為、LANによる通信はあまり行いたくありません。 未熟者ですいませんが、詳細をよろしくお願いいたします。

関連するQ&A

  • Arduino INA219 I2C通信できない

    Arduinoのsda, sclにINA219のsda, sclを接続すると出力が止まってしまいます。 確認のためLCDを使ってI2C通信を試してみましたが問題なく動作しました。

  • PIC24FでI2C

    PIC24FでRTCを制御するためのI2C通信がうまくいかず困っています。 そこでSDA/SCLから信号が出ているかのみを確認するため 下記のようなプログラムをPICに書込みました。 (STARTの出力のみ) 当方オシロを持っていませんので汎用のテスタでSDA/SCL電圧の一時的な変化を読み取ろうと試みましたが全く電圧の変化はありません。 #include "p24FJ64GA002.h" _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx1& FWDTEN_OFF ) _CONFIG2( IESO_ON & FNOSC_FRC & FCKSM_CSDCMD & OSCIOFNC_OFF & IOL1WAY_ON & I2C1SEL_SEC & POSCMOD_NONE) int main(void) { AD1PCFG = 0xffff; CLKDIV = 0; TRISA = 0xFFE3; TRISB = 0x006F; LATB = 0x0010; CNPU1 = 0x003C; /// I2Cの初期設定 I2C1BRG = 0x27; I2C1CON = 0x8000; I2C1RCV = 0x00; I2C1TRN = 0x00; while(1){ I2C1CONbits.SEN = 1; while(I2C1CONbits.SEN); } } 心ある方、どなたかご教示お願いいたします。

  • PIC I2C について

    8ビットのデータを送り、そのままスレーブのLEDに反映させるプログラムを組んでいます。 マスターからはリピートして何度もデータを送ります。 このとき、なぜか一瞬アドレスのビットデータをLEDに反映させてから本来のデータを表示します。 つまり、アドレスとデータを交互にLEDに表示する状況です。 たとえば、アドレスが 0b1111111 データが 0b00000000 だとします。 本来LEDは消灯状態にならなくてはいけないのですが、なぜか一瞬アドレスデータの内容で光ります 原因がお分かりの方はいらっしゃいますか? 使用PIC PIC16F873A //master #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, RESTART_WDT, FORCE_HW) output_float(PIN_C3); output_float(PIN_C4); while (1) { i2c_start(); i2c_write(AddData << 1); i2c_write(sBitData); i2c_stop(); delay_ms(50); } //slave #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0x00, SLOW, RESTART_WDT, FORCE_HW) output_float(PIN_C3); output_float(PIN_C4); while (1) { if (i2c_poll()) { indata = i2c_read(); output_b(indata); } }

  • I2C通信について

    マイコンにI2C通信対応ICを5個接続して使用しようとしています. 基板上で5個のICのI2Cバスを接続して通信したところ,1個だけ(型番 : INA231)データが正常に返ってきませんでした. オシロで波形を確認すると,INA231と通信する時のみ,SDA/SCLともに波形の電圧が正常時の半分程度でした.他の4個のICとの通信時は正常な電圧(highが電源電圧)でした. 試しに,マイコンとINA231を1:1で接続してI2C通信すると問題なくデータを取得できたため,プログラムは問題ないことが確認できました. 上記のような現象の発生原因と,対策など,お分かりになられる方がいらっしゃいましたら何卒ご教授よろしくお願い致します.

  • PICでのI2C通信でのマスタ、スレーブの切り替え

    現在PIC18F2550同士で、I2C通信を行いたくアセンブラでプログラミングをしておりますが、教えていただきたい点があります。 ・マスターとスレーブは動作中に入れ替えることはできないのでしょうか? RS等から任意の信号を与えると、マスタとスレーブが切り替わるようなことがしたいのですが、どの書籍をみてもそのような事ができるとは書いてなく困っております。 ・PICだけでなくI2C通信を行うことのできるマイコンorCPU(プログラミングが簡単で高速動作できる)はあるのでしょうか?あればお教えいただきたいです。 以上よろしくお願いいたします。

  • PICのI2C通信を行っているときにタイマ割り込みはできますか?

    私はC言語(CCS-Cコンパイラを使用)でPICのプログラミングをしています。使用しているPICは16F877Aです。 いま学習リモコンを製作中なのですが、赤外線信号の学習方法としてベタ読みを(1kByte分)行うつもりです。その際、16F877AではデータメモリがEEPROMを合わせても1kByteには足りません。ということは、赤外線信号を39kHz毎にチェックしながら、1ページ分(64byte)信号データがたまったらI2C通信で外部EEPROMにページ書き込みをしなくてはいけない、と考えています。 そこで、「I2C用組み込み関数を使用して外部EEPROM(24LC256)にページ書き込みを行っている最中に、タイマ割り込みは使用できるのか?」また、「タイマ割り込みが使える場合、正確にI2C通信が行えるのか(データが欠けたりしないか)?」を教えてほしいんです。 もちろん、18F452を使用すればデータメモリだけで1kByteを超えるので、この問題は解決できます。しかし、できれば現在手元にあるものを使って作りたいので、どなたか分かる方がみえましたら、教えてください!

  • PIC18F4550について

    現在PIC18F4550の回路基盤を製作しておりますが、何分電子工作が始めてなもので、わからない点がいくつかあります。下記に挙げさせていただきますので、どれかわかります点がありましたらご回答いただけたらうれしく思います。 ・48MHzで駆動させるにはXTALは何MHzのものを選択すればよいのでしょうか?ネット上で見つけたものでは、20MHzを使用していながら内部では48MHz駆動と書いてあるものがありましたが、どうにもよくわかりません。 ・PICを3台くらいで、I2C通信を行いと考えております。その際半導体リレーでSDL,SDAの信号線をスイッチング(ON、OFF)し、接続するPICを切り替えたいと考えております。ですが、そのような事は可能でしょうか?

  • I2Cについて

    現在、DALLASセミコンダクター社のDS1307というリアルタイムクロックICを制御しようとしています。 仕様書を見ると、I2Cという言葉が出てきたので、自分なりに調べて制御を試みています。 今は、SDA,SCLに与える信号をタイミングが合うように1bit毎に出力していますが、うまくいきません。 具体的には、DS1307からACK信号が帰って来ないためタイムアウトエラーなります。 何かアドバイスがある方がいましたらお願いします。

  • I2C通信線のリレー接続について

    現在PIC18F4550を使用し、I2C通信を行いたいと考えております。 そこで、I2Cの通信線に半導体リレーを接続し、PICから直接ドライブしたいのですが、どのようなリレーがいいのかがわかりません。 SSRやフォトモスリレー等種類がありすぎて何をどう選んで、どのように回路設計すればよいかわかりません。 リレーについてお教えねがえないでしょうか。また、わかりやすく書いてあるサイト等ありましたら教えていただけるとありがたいです。

  • PICのSPI通信(ハード)

    PICのSPI通信の回路を本で見るとSDOとSDIをそのまま接続しているのが多いのですが一部にはSDO、SDI、SCKをプルアップするものがあります。I2Cの場合は2線ともプルアップするようですがSPIの場合はクロックの極性によって変える必要があるのではないかと思ったのですがどうなのでしょうか? クロック極性CKP=0(アイドル=Low)の時はプルダウンしておいた方が良いのではと。SDO、SDIも同様の方が良いのでしょうか? どちらかに固定しておかないと不安定になりそうな気がしますが。 またクロックは長いほうが安定してデータが送れるものなのでしょうか?(Fosc/4よりFosc/64の方がノイズ等には強い?) ちなみに現在使用中はマスター18F452でスレーブが16F877と16F88です。よろしく御願いします。

専門家に質問してみよう