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);ではないのでしょうか