I2CSlave

I2CSlave

I2Cスレーブ
SDA、SCLは、それぞれ2.2kΩ程度の抵抗器でプルアップします。

http://mbed.org/media/uploads/mbedofficial/i2c_interfaces.png

初期化

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
    }
}

詳細 戻る (back)


1 comment on I2CSlave:

04 Oct 2015

連続送信のコマンドはval = name.read(data, length);となっていますがval = name.write(data, length);ではないのでしょうか

Please log in to post comments.