I2C介紹
- I2C裡有兩個角色,一個是Master,另一個是Slave。Master的角色只能有一個,而Slave可以有很多個。每個Slave都有自己的位址(address)編號,所以當Master要與特定的Slave溝通時,就會使用這個位址。I2C使用了兩根接腳,一根是資料線(SDA),另一根是時脈線(SCL)。Master藉由控制SCL讓Slave知道有東西要傳,而資料就可以在SDA上面傳送。I2C在當初Arduino的範例裡,為了親易近人而稱呼I2C為Wire,雖然後來Arduino也承認取名為Wire看來是個錯誤,但在Arduino的example仍然常常看到。(Wire取名的細節請參考此篇中的”Use full, everyday words.”)
這個範例裡,我們將Ameba當作I2C Master Writer, 而Arduino為I2C Slave Receiver。
I2C Master會傳字串到I2C Slave,並且I2C Slave將字串印出來。
首先我們先準備 Arduino,先將Arduino IDE選成Arduino, “Tools” -> “Board” -> “Arduino/Genuino Uno”:
I2C Master會傳字串到I2C Slave,並且I2C Slave將字串印出來。
- 準備Arduino Uno為 I2C Slave
首先我們先準備 Arduino,先將Arduino IDE選成Arduino, “Tools” -> “Board” -> “Arduino/Genuino Uno”:
接著打開 Slave Receiver 的範例,”Examples” -> “Wire” -> “slave_receiver”
然後點選 “Sketch” -> “Upload” 將程式編譯並上傳到 Arduino Uno。
準備Ameba 為 I2C Master
我們額外再開一個Arduino IDE,確定板子是 Ameba, “Tools” -> “Board” -> “Arduino Ameba”
然後打開 Master Writer 的範例, “File” -> “Examples” -> “AmebaWire” -> “master_writer”
後點選 “Sketch” -> “Upload” 將程式編譯並上傳到 Ameba。
Arduino的範例裡,使用A4當作I2C SCL, A5為I2C SDA。這些接腳與Ameba一樣。
- 接線
Arduino的範例裡,使用A4當作I2C SCL, A5為I2C SDA。這些接腳與Ameba一樣。
另外很重要的是,兩塊板子的GND要互接。
打開包含Arduino Uno的Arduino IDE,開啟Serial Monitor, “Tools” -> “Serial Monitor”, 會出現Serial Monitor的視窗,這個視窗可以讓你看到Arduino Uno印出來的訊息。
接著按下Arduino Uno的Reset按鈕,讓Arduino Uno等待I2C master連接。
再按下Ameba的Reset按鈕,讓Ameba開始傳訊息。這時候會看到Serial Monitor每隔0.5秒出現新的訊息,這樣就代表成功了。
程式碼說明
Ameba使用同樣的Arduino範例,Ardunio官方網站的範例說明可以參考這裡:
https://www.arduino.cc/en/Tutorial/MasterWriter
首先Wire.begin()會先設定address, 如果是Master可以不用設定address:
https://www.arduino.cc/en/Reference/WireBegin
接著Master使用Wire.beginTransmission()來設定要傳到哪一個Slave:
https://www.arduino.cc/en/Reference/WireBeginTransmission
使用Wire.write()送資料, 並且最後使用Wire.endTransmission()將所有資料傳出去:
https://www.arduino.cc/en/Reference/WireEndTransmission
https://www.arduino.cc/en/Tutorial/MasterWriter
首先Wire.begin()會先設定address, 如果是Master可以不用設定address:
https://www.arduino.cc/en/Reference/WireBegin
接著Master使用Wire.beginTransmission()來設定要傳到哪一個Slave:
https://www.arduino.cc/en/Reference/WireBeginTransmission
使用Wire.write()送資料, 並且最後使用Wire.endTransmission()將所有資料傳出去:
https://www.arduino.cc/en/Reference/WireEndTransmission
master write
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
}
byte x = 0;
void loop() {
Wire.beginTransmission(8); // transmit to device #8
Wire.write("x is "); // sends five bytes
Wire.write(x); // sends one byte
Wire.endTransmission(); // stop transmitting
x++;
delay(500);
}
master read
#include <Wire.h>
void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(8, 6); // request 6 bytes from slave device #8
while (Wire.available()) { // slave may send less than requested
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
delay(500);
}
沒有留言:
張貼留言