LPC82XでI2Cのリスタートコンディションがうまく動いていないようです。

30 Dec 2014

こんにちは

Questionsに質問したのですが、相談した場所が適切でなかったようなので、日本語フォーラムに再度アップさせて頂きます。 https://developer.mbed.org/questions/5773/LPC82XI2C/?c=15008

Switch Science mbed LPC824を入手しまして、MMA8451とI2Cで通信しようとしたところ、うまく動かず次の質問をしました。 測定器やデバッガなど持ち合わせていないので、他のmbedでInteruptInを利用しI2Cの周波数を低くして、SCLとSDAを見たところ、リスタートコンデションがうまく動いていないようです。

http://developer.mbed.org/questions/5761/I2C-Problem/

mbed-srcのtargets/hal/TARGET_NXP/TARGET_LPC82X/i2c_api.cを確認しましたが、 repeated_startを1にするコードは存在していません。

static uint8_t repeated_start = 0;
~省略~
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;
}

また、複数バイトの処理であるi2c_read、i2c_writeでは、i2c_param.stop_flag = stop;で設定されているようですが、うまく動いていないようです。この後、どの様にして良いか分からずご質問させて頂きました。

よろしくお願いします。

Yasuhisa KAWAMOTO wrote:

LPC812ですが以前I2Cの挙動で不思議なことがあったときに調べたものです。 参考になるでしょうか http://pukiwiki.mujirushi.org/index.php?%A4%B3%A4%B3%A4%ED%A4%CE%A4%C8%A4%D3%A4%E9%2F2014-01-30

Manabu Taniguchi wrote:

KAWAMOTOさん

情報有り難うございます。LPC812と同じように、LPC82x User manual Rev. 1 — 18 September 2014の15.3.1 I2C transmit/receive in master modeにMSTDATにスレーブアドレスを書き込んでから (MSTCTLレジスタの)MSTSTARTビットを1にセットすると書いてありました。

この処理は、mbed-srcを見ますとLPC81XとLPC82Xで同じ処理をしていました。LPC82Xには、I2C-bus ROM APIというものがあるようで、i2c_read、i2c_writeの処理が違っていました。やはり、何かこの辺りの記述に問題があるようです。この部分をユーザが修正することは可能なのでしょうか。

30 Dec 2014

ユーザーが修正することも可能ですが、他にも直したいところがあるので修正しておきます。
また修正をしたら、こちらに報告をします。情報ありがとうございます。

30 Dec 2014

TSUBOIさん

修正よろしくお願いします。修正方法を調べていましたが、日曜プログラマには少々ハードルが高いなと感じていました。(^_^;)