2016年12月3日土曜日

LPC1114FN28 I2C通信テスト

前にmbedの基本的な使い方についてメモし,次はi2c,SPI,割り込みを
書きますなんていってましたが,具体的なサンプルもあったほうがいいと思うので
一つずつ書いていこうと思います.
今回はLPC1114FN28を二つ使用し,通信させてみます.

・回路

  回路図は省略します.
  SDA(dp5),SDL(dp27)を接続.それぞれを1k抵抗でプルアップします.
  1kで問題ありませんでしたが,2.2k程度が良いようです.
  それぞれのdp14に確認用LEDを配置します.



・プログラム


Slave
#include "mbed.h"
#define SLVADRS (0x20<<1)   //Slaveアドレス

I2CSlave slave(dp5, dp27);  //SDA,SCL
DigitalOut  myled(dp14);    //受信確認LED
int main() 
{
     char num[2];  //送信配列
     num[0] = 0;   //初期化
     slave.address(SLVADRS);  //Slaveアドレス設定
     while (1) {
         int i = slave.receive();   //受信
         if(i == I2CSlave::ReadAddressed){
             slave.write(num,1); //
             num[0]++;       //加算
             myled = !myled; //dp14よりトグル出力
        }
     }
}

Slaveが送信要求を受けるとLEDが点滅し,前回の送信+1の値を送信します.
今回のプログラムを応用することで,LPC1114をセンサとして使用なんてことも可能です.

Master
#include "mbed.h"
I2C i2c(dp5, dp27);  //SDA,SCL
Serial pc(dp16, dp15); //TX,RX
DigitalOut myled(dp14); //起動確認LED
const int addr = (0x20<<1); //スレーブアドレス
int main() {
    char buf[2];//受信配列
    int err;    //エラーチェック
    while(1) {
        err = i2c.read(addr, buf, 1);   //スレーブから受信
        wait(0.5);
        pc.printf("State = %d num =  %d\n",err, buf[0]);  //シリアル出力
        myled = !myled;         //dp14よりトグル出力
    }
}

Masterは1byte受信し,PCにシリアルで送信します.一応エラーチェックもします.
動作の様子


無事動作していることを確認しました.


i2cデバイスは,パラレル通信に比べピンの量を節約できるので,
積極的に活用していきたいところです.
特に同じ3.3VのデバイスであるRaspberry PIと2ピンで接続できるのはうれしい.

次回は割り込みorSPIについてサンプル書いていきたいと思います.

0 件のコメント:

コメントを投稿