i2c 2

Dependencies:   mbed

Committer:
kosukesuzuki
Date:
Fri Apr 22 17:24:36 2022 +0000
Revision:
0:bf86efb237ca
Child:
1:b38a436a0059
lpc1768 c++ MPU9250 i2c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kosukesuzuki 0:bf86efb237ca 1 /*
kosukesuzuki 0:bf86efb237ca 2 MPU9250をi2c通信してみた。
kosukesuzuki 0:bf86efb237ca 3
kosukesuzuki 0:bf86efb237ca 4 1バイトずつ送受信する場合は、スタートコンディション・ストップコンディションなどのアドレス送信などの制御が必要です。
kosukesuzuki 0:bf86efb237ca 5 連続だったら、いいらしい。(参照 https://os.mbed.com/users/okini3939/notebook/I2C_jp/ )
kosukesuzuki 0:bf86efb237ca 6
kosukesuzuki 0:bf86efb237ca 7 「マスターが受信する」によって、取得するため
kosukesuzuki 0:bf86efb237ca 8
kosukesuzuki 0:bf86efb237ca 9 1.slave address(スレーブアドレス→内部レジスタ)
kosukesuzuki 0:bf86efb237ca 10
kosukesuzuki 0:bf86efb237ca 11 2.ack(受信)
kosukesuzuki 0:bf86efb237ca 12 3.data1(8bits)
kosukesuzuki 0:bf86efb237ca 13 4.ack=1(送信)
kosukesuzuki 0:bf86efb237ca 14 5.data2(8bits)
kosukesuzuki 0:bf86efb237ca 15 6.ack=1(送信)
kosukesuzuki 0:bf86efb237ca 16
kosukesuzuki 0:bf86efb237ca 17 (参照 http://www.picfun.com/c15.html )
kosukesuzuki 0:bf86efb237ca 18 */
kosukesuzuki 0:bf86efb237ca 19
kosukesuzuki 0:bf86efb237ca 20 #include "mbed.h"
kosukesuzuki 0:bf86efb237ca 21
kosukesuzuki 0:bf86efb237ca 22 Serial pc(USBTX,USBRX);
kosukesuzuki 0:bf86efb237ca 23 I2C i2c(p9, p10);
kosukesuzuki 0:bf86efb237ca 24
kosukesuzuki 0:bf86efb237ca 25 const int addr = 0xD0; //加速度とジャイロのスレーブアドレス
kosukesuzuki 0:bf86efb237ca 26
kosukesuzuki 0:bf86efb237ca 27 short int xl,xh; //x軸の加速度
kosukesuzuki 0:bf86efb237ca 28 short int yl,yh; //y軸の加速度
kosukesuzuki 0:bf86efb237ca 29 short int zl,zh;
kosukesuzuki 0:bf86efb237ca 30
kosukesuzuki 0:bf86efb237ca 31 int main()
kosukesuzuki 0:bf86efb237ca 32 {
kosukesuzuki 0:bf86efb237ca 33 i2c.frequency(100000);
kosukesuzuki 0:bf86efb237ca 34 pc.printf("Start!!\r\n");
kosukesuzuki 0:bf86efb237ca 35
kosukesuzuki 0:bf86efb237ca 36 while(1) {
kosukesuzuki 0:bf86efb237ca 37 //x軸加速度取得
kosukesuzuki 0:bf86efb237ca 38
kosukesuzuki 0:bf86efb237ca 39 //1.slave address(スレーブアドレス→内部レジスタ)
kosukesuzuki 0:bf86efb237ca 40 i2c.start();
kosukesuzuki 0:bf86efb237ca 41 i2c.write(addr);// slaveアドレス
kosukesuzuki 0:bf86efb237ca 42 i2c.write(0x3b);// 内部レジスタ(59)
kosukesuzuki 0:bf86efb237ca 43 i2c.stop();
kosukesuzuki 0:bf86efb237ca 44
kosukesuzuki 0:bf86efb237ca 45 //2.ack=0(受信)
kosukesuzuki 0:bf86efb237ca 46 i2c.start();
kosukesuzuki 0:bf86efb237ca 47 i2c.read(false); //ack(受信)
kosukesuzuki 0:bf86efb237ca 48 //3.data1(8bits)
kosukesuzuki 0:bf86efb237ca 49 i2c.write(0x3c);//data1(60)1
kosukesuzuki 0:bf86efb237ca 50 i2c.stop();
kosukesuzuki 0:bf86efb237ca 51
kosukesuzuki 0:bf86efb237ca 52 //4.ack=0(送信)
kosukesuzuki 0:bf86efb237ca 53 i2c.start();
kosukesuzuki 0:bf86efb237ca 54 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 0:bf86efb237ca 55 xh = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 56 i2c.stop();
kosukesuzuki 0:bf86efb237ca 57
kosukesuzuki 0:bf86efb237ca 58 i2c.start();
kosukesuzuki 0:bf86efb237ca 59 //5.data2(8bits)
kosukesuzuki 0:bf86efb237ca 60 i2c.write(0x3d);//data2(61)2
kosukesuzuki 0:bf86efb237ca 61 //6.ack=1(送信)
kosukesuzuki 0:bf86efb237ca 62 i2c.write(addr|0x01); //ack=1(受信)
kosukesuzuki 0:bf86efb237ca 63 xl = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 64 i2c.stop();
kosukesuzuki 0:bf86efb237ca 65
kosukesuzuki 0:bf86efb237ca 66 //以下2~6を繰り返す。
kosukesuzuki 0:bf86efb237ca 67
kosukesuzuki 0:bf86efb237ca 68
kosukesuzuki 0:bf86efb237ca 69 //y軸加速度取得
kosukesuzuki 0:bf86efb237ca 70 i2c.start();
kosukesuzuki 0:bf86efb237ca 71 i2c.read(false); //ack(受信)
kosukesuzuki 0:bf86efb237ca 72 i2c.write(0x3e); //data(62)3
kosukesuzuki 0:bf86efb237ca 73 i2c.stop();
kosukesuzuki 0:bf86efb237ca 74
kosukesuzuki 0:bf86efb237ca 75 i2c.start();
kosukesuzuki 0:bf86efb237ca 76 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 0:bf86efb237ca 77 yh = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 78 i2c.stop();
kosukesuzuki 0:bf86efb237ca 79
kosukesuzuki 0:bf86efb237ca 80 i2c.start();
kosukesuzuki 0:bf86efb237ca 81 i2c.write(0x3f); //data(63)4
kosukesuzuki 0:bf86efb237ca 82 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 0:bf86efb237ca 83 yl = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 84 i2c.stop();
kosukesuzuki 0:bf86efb237ca 85
kosukesuzuki 0:bf86efb237ca 86 //z軸加速度取得
kosukesuzuki 0:bf86efb237ca 87 i2c.start();
kosukesuzuki 0:bf86efb237ca 88 i2c.read(false); //ack(受信)
kosukesuzuki 0:bf86efb237ca 89 i2c.write(0x40); //data(64)5
kosukesuzuki 0:bf86efb237ca 90 i2c.stop();
kosukesuzuki 0:bf86efb237ca 91
kosukesuzuki 0:bf86efb237ca 92 i2c.start();
kosukesuzuki 0:bf86efb237ca 93 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 0:bf86efb237ca 94 zh = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 95 i2c.stop();
kosukesuzuki 0:bf86efb237ca 96
kosukesuzuki 0:bf86efb237ca 97 i2c.start();
kosukesuzuki 0:bf86efb237ca 98 i2c.write(0x41); //data(65)6
kosukesuzuki 0:bf86efb237ca 99 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 0:bf86efb237ca 100 zl = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 101 i2c.stop();
kosukesuzuki 0:bf86efb237ca 102
kosukesuzuki 0:bf86efb237ca 103
kosukesuzuki 0:bf86efb237ca 104
kosukesuzuki 0:bf86efb237ca 105
kosukesuzuki 0:bf86efb237ca 106 double acc_ax = short((xh<<8) | (xl));
kosukesuzuki 0:bf86efb237ca 107 double acc_ay = short((yh<<8) | (yl));
kosukesuzuki 0:bf86efb237ca 108 double acc_az = short((zh<<8) | (zl));
kosukesuzuki 0:bf86efb237ca 109
kosukesuzuki 0:bf86efb237ca 110 double AX = (acc_ax)*2/32768*9.81;
kosukesuzuki 0:bf86efb237ca 111 double AY = (acc_ay)*2/32768*9.81;
kosukesuzuki 0:bf86efb237ca 112 double AZ = (acc_az)*2/32768*9.81;
kosukesuzuki 0:bf86efb237ca 113
kosukesuzuki 0:bf86efb237ca 114 pc.printf("%f %f %f\r\n",AX,AY,AZ);
kosukesuzuki 0:bf86efb237ca 115 wait(0.01);
kosukesuzuki 0:bf86efb237ca 116 }
kosukesuzuki 0:bf86efb237ca 117 }