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/
#include "mbed.h"
#define I2C_ARDUINO_ADDR (0x08 << 1) // 8bit address
I2C I2cArduino(PB_9, PB_8); // SDA, SCL
int main()
{
I2cArduino.frequency(400000);
uint8_t x = 0;
while(1) {
if (I2cArduino.write(I2C_ARDUINO_ADDR, "x is ", 5, true) != 0) {
printf("I2C failure");
}
if (I2cArduino.write(I2C_ARDUINO_ADDR, (char *)&x, 1) != 0) {
printf("I2C failure");
}
x++;
wait_ms(500);
}
}
view raw gistfile1.txt hosted with ❤ by GitHub

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

#include <Wire.h>
void setup() {
Wire.begin(8); // join i2c bus with address #8
pinMode(A4, INPUT); // disable pullup
pinMode(A5, INPUT); // disable pullup
Wire.setClock(400000);
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
}
void loop() {
delay(100);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x); // print the integer
}
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 件のコメント:

コメントを投稿