前にmbedの基本的な使い方についてメモし,次はi2c,SPI,割り込みを
書きますなんていってましたが,具体的なサンプルもあったほうがいいと思うので
一つずつ書いていこうと思います.
今回はLPC1114FN28を二つ使用し,通信させてみます.
・回路
回路図は省略します.
SDA(dp5),SDL(dp27)を接続.それぞれを1k抵抗でプルアップします.
1kで問題ありませんでしたが,2.2k程度が良いようです.
・プログラム
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 件のコメント:
コメントを投稿