2014/01/30

mbed(LPC812)でI2Cを使っててあれ?って思ったこと

#include "mbed.h"

I2C i2c(P0_10, P0_11);

int main() {
    i2c.frequency(400 * 1000);

    while(1) {
        i2c.start();
        i2c.write(0xBA | 0);
        i2c.write(0x0F);
        i2c.start();
        i2c.write(0xBA | 1);
        i2c.read(0);
        i2c.stop();

        i2c.start();
        i2c.write(0xBA | 0);
        i2c.write(0x10);
        i2c.write(0x00);
        i2c.stop();

        wait(2.0);
    }
}

上記main.cppのときの波形(上:SCL、下:SDA)

1_scl_sda.png

SDAがずれているように見える。

mbed-srcをインポートしてi2c_api.c中身を確認すると i2c_start()関数内ではMSTCTLレジスタだけをセットしている

inline int i2c_start(i2c_t *obj) {
    int status = 0;
    if (repeated_start) {
        obj->i2c->MSTCTL = (1 << 1) | (1 << 0);
        repeated_start = 0;
    } else {
        obj->i2c->MSTCTL = (1 << 1);
    }
    return status;
}

しかしLPC800 User manual Rev. 1.3 ― 22 July 2013 の 16.3.1 I2C transmit/receive in master mode を確認すると MSTDATにスレーブアドレスを書き込んでから (MSTCTLレジスタの)MSTSTARTビットを1にセットすると記述してある。

そこでi2c_start()関数内ではフラグだけ立て i2c_do_write()関数内でMSTDATにスレーブアドレスを書き込んでから MSTCTLレジスタへの書き込みを行うように変更

変更後の波形(上:SCL、下:SDA)

2_scl_sda.png

SDAが正常になったように見える。


添付ファイル: filei2c_api.c.patch 220件 [詳細] file2_scl_sda.png 191件 [詳細] file1_scl_sda.png 200件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-01-30 (木) 13:38:04 (1724d)