2018年11月4日日曜日

ArduinoとNucleo(mbed)でI2C通信してみる。

Nucleo(mbed)をマスター、ArduinoをスレーブとしてI2C通信してみました。

配線図


スレーブ側は中華製のArduino Pro Mini(3.3V/8MHz版)でPCとUART通信するために、秋月の「FT232RL USBシリアル変換モジュール」をつないでいます

Nucleo(マスター側)
https://os.mbed.com/users/ryood/code/Nucleo_i2c_master_writer/

Arduino(スレーブ側)はArduino-ArduinoのI2C通信の場合と同じです。
https://github.com/ryood/Arduino_I2C/tree/master/Arduino/Wire_Slave_Resiver_NoPullup

Arduinoのスケッチでは、

  pinMode(A4, INPUT);           // disable pullup
  pinMode(A5, INPUT);           // disable pullup

として、内部プルアップを無効化しています。配線図のように外付けの2.2kΩの抵抗でプルアップしています。

ArduinoのI2Cアドレスは7bitですが、mbedでは8bitです。mbedではアドレスを1bit左シフトします。

mbedの「I2C::write()」の引数の最後に「bool repeated=false」があります。このrpeatedをtureにすると、I2C通信で「STOPコンディション」が送信されません。

repeated=trueの場合

ch1:SDA ch2:SCL

repeated=falseの場合

ch1:SDA ch2:SCL

「repeated=false」の場合は最後の1バイトを送出する前に「STOPコンディション」が入っています。

「repeated=false」の場合は受信側のArduinoのスケッチでは正常に受信できず、コンソールには「x is32」と表示され続けました。

「repeated=true」の場合は前回のArduino同士のI2C通信のように、8bitカウンタがインクリメントされる様子が表示されます。

「STOPコンディション」は、SCLがHの間に、SDAがL→Hに変化するものです。


ch1:SDA ch2:SCL

0 件のコメント:

コメントを投稿