I2C

I2Cは他の電子部品と通信するための通信方式です。I2Cは同じ配線に複数台繋げられるというのが最大の特徴です。そのため多くのセンサーがあっても同じI2Cに全部つなぐこともできて配線が楽です。また、UARTやSPIなどと違い相手とやり取りしながらデータを送るため、相手がいない場合や相手が拒否した場合には送信自体がエラーとなります。その代わり通信速度はSPIなどと比べるとそれほど速くありません。

I2Cの特徴

  • 2本の通信線だけで双方向通信する上に、複数台で通信できる。
  • 親子関係があり、親1つに対して子をたくさん繋げられる。
  • 子はアドレスを持つ。
  • 親が好きなタイミングで1つの子に対して通信を始める。書き込みと読み込みがある。
  • 子は書き込みでも読み込みでも必ず”返事”をして、返事がないとエラーになる。
  • 子は親に対して「ちょっとまってね、今準備してるから」や「それは無理」という返事(NAK)ができる。

配線時の注意点

I2Cはsdaとsclという2本の線で通信しますが、どちらも双方向通信するようになっています。そのために、オープンドレイン+プルアップ抵抗という構成で通信する必要があります。

マイコンにある内蔵プルアップはとても弱いためI2Cで利用するには足りない場合があります。安定した通信をするためには外部で数kオームの抵抗でプルアップする必要があります。また、UARTやI2C以上に距離が長い通信を苦手とします。

初期設定

利用できるI2Cの数はデバイスにより異なります。obniz Boardシリーズの場合はi2c0の1つとなります。i2c.start()によりi2cを設定します。ioとi2cは別のもので、start()時にi2cのsda, sclそれぞれで利用するioの番号を指定します。

例えば、Masterモード(親)で、io0をsdaに、io1をsclにする場合は、このようになります。

var i2c = obniz.getFreeI2C();
i2c.start({mode:"master", sda:0, scl:1, clock:400000}); 

obniz.getFreeI2C()により利用されていないi2cを取得できます。または利用するi2cを直接指定します。

obniz.i2c0.start({mode:"master", sda:0, scl:1, clock:400000}); 

pullでsdaとsclの内部プルアップを指定できます。io.pull()で設定できるものが利用できます。内蔵プルアップ指定時は400kHzまでとなっています。特に3vの内蔵プルアップは弱いため、3vの内蔵プルアップを指定した場合は100khzまでとなっており、それ以上はエラーとなります。また、相手の回路やセンサーとgndがつながっておらず、ioを相手のgndと繋ぐ場合はgndで利用するioを指定することもできます。

obniz.i2c0.start({mode:"master", sda:0, scl:1, gnd:2, clock:400000, pull:"5v"}); 

上記はそれぞれmasterの場合の初期設定です。masterかslaveかによって初期設定が異なりますのでそれぞれのページを参照ください。

終了

開始したi2cはi2c.end()で終了します。

Articles