I2C - I²Cマスター

I2C - I²Cマスター

Information

本ページは私家版のため、誤り等あればご指摘ください。
最新の情報は公式のドキュメントをご参照ください。 http://mbed.org/handbook/I2C

I2Cマスター (I-squared-C)
SDA、SCLは、それぞれ2.2kΩ程度の抵抗器でプルアップしておきましょう。

連続送信・受信は、スタートコンディション・ストップコンディション・アドレスは自動的に発行されます。
1バイトずつ送受信する場合は、スタートコンディション・ストップコンディション・アドレス送信などの制御が必要です。

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

初期化

I2C name(sda, scl);

name: 名前
sda: SDAピン名(p9, p28)
scl: SCLピン名(p10, p27)

クロックレート

name.frequency(hz);

hz: クロック周波数

連続受信

val = name.read(address, data, length, ack);

address: I2Cアドレス(1~7bit)
data: 受信データを格納する配列(char *)
length: 受信データのバイト数
ack: false=ack、true=nack(省略時=false)

val: 結果 0=成功、0以外=失敗

連続送信

val = name.write(address, data, length, repeated);

address: I2Cアドレス(1~7bit)
data: 送信データの配列(char *)
length: 送信データのバイト数
repeated: false=ストップコンディション出力、true=ストップコンディション省略、リ ピー ト ス ター ト用(省略時=false)

val: 結果 0=成功、0以外=失敗

スタートコンディション出力

name.start();

ストップコンディション出力

name.stop();

受信

val = name.read(ack);

ack: false=ack、true=nack

val: 受信データ

送信

val = name.write(data);

data: 送信データ

val: 1=ack受信、0=他(nack)

参考

/media/uploads/okini3939/i2c_signal.png

超音波センサーSRF05の値を読み込む

#include "mbed.h"

I2C i2c(p9, p10);        // sda, scl
Serial pc(USBTX, USBRX); // tx, rx

const int addr = 0x70; // define the I2C Address

int main() {
    char cmd[2];
    while(1) {
        cmd[0] = 0x0;            // pointer to command register
        cmd[1] = 0x51;           // Start ranging, results in cm
        i2c.write(addr, cmd, 2); // Send command string

        wait(0.07);              // Could also poll, 65ms is typical

        // Set pointer to location 2 (first echo)
        cmd[0] = 0x2;
        i2c.write(addr, cmd, 1);
        i2c.read(addr | 1, cmd, 2); // read the two-byte echo result

        // print the ranging data to the screen
        float echo = 0.01 * ((cmd[0] << 8) + cmd[1]);
        pc.printf("Range = %.2f\n", echo);
        wait(0.1);
    }
}

ストップコンディションを省略し、アドレスが同じデバイスや別のデバイスと通信を続けることができる (対応していないデバイスもあるっぽい)

        i2c.write(addr, cmd, 1, true);  // *** true
        i2c.read(addr | 1, cmd, 2);

詳細 戻る


Report

2 comments on I2C - I²Cマスター:

29 Jan 2015

ドキュメントありがとうございます。 たいへん参考になりました。

08 Jan 2017

自作のI2Cデバイスをmbedでコントロールするのに、丁度このような情報が欲しかったところです。ありがとうございます。I2Cインターフェイスは大変面白いですよね。不細工ですがI2C関連のブログを開設しました。ご興味がありましたら、一度見に来ていただけると嬉しいです。<検索キーワード:"I2C nomatan">

Please log in to post comments.