I2CSlave
I2CSlave
I2Cスレーブ
SDA、SCLは、それぞれ2.2kΩ程度の抵抗器でプルアップします。
初期化
I2CSlave name(sda, scl);
name: 名前(自由に決めて良い)
sda: SDAピン名(p9, p28)
scl: SCLピン名(p10, p27)
クロックレート
name.frequency(hz);
hz: クロック周波数
アドレス設定
name.address(addr);
addr: I2Cアドレス
受信チェック
val = name.receive();
val | 備考 |
---|---|
NoData | データなし |
ReadAddressed | マスターからのデータ送信要求 |
WriteAddressed | マスターからデータを受信 |
WriteGeneral | マスターからデータを受信(全スレーブ宛) |
受信
val = name.read(ack);
repeated: 0=ack、0以外=nack
val: 受信データ
連続受信
val = name.read(data, length);
data: 受信データを入れる配列(char *)
length: dataの最大バイト数
val: 結果 0=成功、0以外=失敗
送信
val = name.write(data);
data: 送信データ
val: 1=ack受信、0=他
連続送信
val = name.read(data, length);
data: 送信データの配列(char *)
length: 送信データのバイト数
val: 結果 0=成功、0以外=失敗
ストップコンディション出力
name.stop();
例
受信した文字列を表示と、文字列を送信
#include <mbed.h> I2CSlave slave(p9, p10); int main() { char buf[10]; char msg[] = "Slave!"; slave.address(0xA0); while (1) { int i = slave.receive(); switch (i) { case I2CSlave::ReadAddressed: slave.write(msg, strlen(msg) + 1); // Includes null char break; case I2CSlave::WriteGeneral: slave.read(buf, 10); printf("Read G: %s\n", buf); break; case I2CSlave::WriteAddressed: slave.read(buf, 10); printf("Read A: %s\n", buf); break; } for(int i = 0; i < 10; i++) buf[i] = 0; // Clear buffer } }
1 comment on I2CSlave:
Please log in to post comments.
連続送信のコマンドはval = name.read(data, length);となっていますがval = name.write(data, length);ではないのでしょうか