i2c 2

Dependencies:   mbed

Committer:
kosukesuzuki
Date:
Fri Apr 22 19:03:26 2022 +0000
Revision:
1:b38a436a0059
Parent:
0:bf86efb237ca
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 2.ack(受信)
kosukesuzuki 0:bf86efb237ca 11 3.data1(8bits)
kosukesuzuki 0:bf86efb237ca 12 4.ack=1(送信)
kosukesuzuki 0:bf86efb237ca 13 5.data2(8bits)
kosukesuzuki 0:bf86efb237ca 14 6.ack=1(送信)
kosukesuzuki 0:bf86efb237ca 15
kosukesuzuki 0:bf86efb237ca 16 (参照 http://www.picfun.com/c15.html )
kosukesuzuki 0:bf86efb237ca 17 */
kosukesuzuki 0:bf86efb237ca 18
kosukesuzuki 0:bf86efb237ca 19 #include "mbed.h"
kosukesuzuki 0:bf86efb237ca 20
kosukesuzuki 0:bf86efb237ca 21 Serial pc(USBTX,USBRX);
kosukesuzuki 0:bf86efb237ca 22 I2C i2c(p9, p10);
kosukesuzuki 0:bf86efb237ca 23
kosukesuzuki 0:bf86efb237ca 24 const int addr = 0xD0; //加速度とジャイロのスレーブアドレス
kosukesuzuki 0:bf86efb237ca 25
kosukesuzuki 1:b38a436a0059 26 short int axl,axh; //x軸の加速度
kosukesuzuki 1:b38a436a0059 27 short int ayl,ayh; //y軸の加速度
kosukesuzuki 1:b38a436a0059 28 short int azl,azh; //z軸の加速度
kosukesuzuki 1:b38a436a0059 29
kosukesuzuki 1:b38a436a0059 30 short int gxl,gxh; //xの角速度
kosukesuzuki 1:b38a436a0059 31 short int gyl,gyh; //yの角速度
kosukesuzuki 1:b38a436a0059 32 short int gzl,gzh; //zの角速度
kosukesuzuki 0:bf86efb237ca 33
kosukesuzuki 0:bf86efb237ca 34 int main()
kosukesuzuki 0:bf86efb237ca 35 {
kosukesuzuki 0:bf86efb237ca 36 i2c.frequency(100000);
kosukesuzuki 0:bf86efb237ca 37 pc.printf("Start!!\r\n");
kosukesuzuki 0:bf86efb237ca 38
kosukesuzuki 0:bf86efb237ca 39 while(1) {
kosukesuzuki 1:b38a436a0059 40 //加速度
kosukesuzuki 0:bf86efb237ca 41 //x軸加速度取得
kosukesuzuki 0:bf86efb237ca 42
kosukesuzuki 0:bf86efb237ca 43 //1.slave address(スレーブアドレス→内部レジスタ)
kosukesuzuki 0:bf86efb237ca 44 i2c.start();
kosukesuzuki 0:bf86efb237ca 45 i2c.write(addr);// slaveアドレス
kosukesuzuki 0:bf86efb237ca 46 i2c.write(0x3b);// 内部レジスタ(59)
kosukesuzuki 0:bf86efb237ca 47 i2c.stop();
kosukesuzuki 0:bf86efb237ca 48
kosukesuzuki 0:bf86efb237ca 49 //2.ack=0(受信)
kosukesuzuki 0:bf86efb237ca 50 i2c.start();
kosukesuzuki 0:bf86efb237ca 51 i2c.read(false); //ack(受信)
kosukesuzuki 0:bf86efb237ca 52 //3.data1(8bits)
kosukesuzuki 0:bf86efb237ca 53 i2c.write(0x3c);//data1(60)1
kosukesuzuki 0:bf86efb237ca 54 i2c.stop();
kosukesuzuki 0:bf86efb237ca 55
kosukesuzuki 0:bf86efb237ca 56 //4.ack=0(送信)
kosukesuzuki 0:bf86efb237ca 57 i2c.start();
kosukesuzuki 0:bf86efb237ca 58 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 59 axh = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 60 i2c.stop();
kosukesuzuki 0:bf86efb237ca 61
kosukesuzuki 0:bf86efb237ca 62 i2c.start();
kosukesuzuki 0:bf86efb237ca 63 //5.data2(8bits)
kosukesuzuki 0:bf86efb237ca 64 i2c.write(0x3d);//data2(61)2
kosukesuzuki 0:bf86efb237ca 65 //6.ack=1(送信)
kosukesuzuki 0:bf86efb237ca 66 i2c.write(addr|0x01); //ack=1(受信)
kosukesuzuki 1:b38a436a0059 67 axl = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 68 i2c.stop();
kosukesuzuki 0:bf86efb237ca 69
kosukesuzuki 0:bf86efb237ca 70 //以下2~6を繰り返す。
kosukesuzuki 0:bf86efb237ca 71
kosukesuzuki 0:bf86efb237ca 72
kosukesuzuki 0:bf86efb237ca 73 //y軸加速度取得
kosukesuzuki 0:bf86efb237ca 74 i2c.start();
kosukesuzuki 0:bf86efb237ca 75 i2c.read(false); //ack(受信)
kosukesuzuki 0:bf86efb237ca 76 i2c.write(0x3e); //data(62)3
kosukesuzuki 0:bf86efb237ca 77 i2c.stop();
kosukesuzuki 0:bf86efb237ca 78
kosukesuzuki 0:bf86efb237ca 79 i2c.start();
kosukesuzuki 0:bf86efb237ca 80 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 81 ayh = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 82 i2c.stop();
kosukesuzuki 0:bf86efb237ca 83
kosukesuzuki 0:bf86efb237ca 84 i2c.start();
kosukesuzuki 0:bf86efb237ca 85 i2c.write(0x3f); //data(63)4
kosukesuzuki 0:bf86efb237ca 86 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 87 ayl = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 88 i2c.stop();
kosukesuzuki 0:bf86efb237ca 89
kosukesuzuki 0:bf86efb237ca 90 //z軸加速度取得
kosukesuzuki 0:bf86efb237ca 91 i2c.start();
kosukesuzuki 0:bf86efb237ca 92 i2c.read(false); //ack(受信)
kosukesuzuki 0:bf86efb237ca 93 i2c.write(0x40); //data(64)5
kosukesuzuki 0:bf86efb237ca 94 i2c.stop();
kosukesuzuki 0:bf86efb237ca 95
kosukesuzuki 0:bf86efb237ca 96 i2c.start();
kosukesuzuki 0:bf86efb237ca 97 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 98 azh = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 99 i2c.stop();
kosukesuzuki 0:bf86efb237ca 100
kosukesuzuki 0:bf86efb237ca 101 i2c.start();
kosukesuzuki 0:bf86efb237ca 102 i2c.write(0x41); //data(65)6
kosukesuzuki 0:bf86efb237ca 103 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 104 azl = i2c.read(0);//data取り出す
kosukesuzuki 0:bf86efb237ca 105 i2c.stop();
kosukesuzuki 0:bf86efb237ca 106
kosukesuzuki 0:bf86efb237ca 107
kosukesuzuki 1:b38a436a0059 108 //ジャイロセンサ
kosukesuzuki 1:b38a436a0059 109 //x
kosukesuzuki 1:b38a436a0059 110 i2c.start();
kosukesuzuki 1:b38a436a0059 111 i2c.read(false); //ack(受信)
kosukesuzuki 1:b38a436a0059 112 i2c.write(0x42); //data
kosukesuzuki 1:b38a436a0059 113 i2c.stop();
kosukesuzuki 1:b38a436a0059 114
kosukesuzuki 1:b38a436a0059 115 i2c.start();
kosukesuzuki 1:b38a436a0059 116 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 117 gxh = i2c.read(0);//data取り出す
kosukesuzuki 1:b38a436a0059 118 i2c.stop();
kosukesuzuki 1:b38a436a0059 119
kosukesuzuki 1:b38a436a0059 120 i2c.start();
kosukesuzuki 1:b38a436a0059 121 i2c.write(0x43); //data
kosukesuzuki 1:b38a436a0059 122 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 123 gxl = i2c.read(0);//data取り出す
kosukesuzuki 1:b38a436a0059 124 i2c.stop();
kosukesuzuki 1:b38a436a0059 125
kosukesuzuki 1:b38a436a0059 126 //y
kosukesuzuki 1:b38a436a0059 127 i2c.start();
kosukesuzuki 1:b38a436a0059 128 i2c.read(false); //ack(受信)
kosukesuzuki 1:b38a436a0059 129 i2c.write(0x44); //data
kosukesuzuki 1:b38a436a0059 130 i2c.stop();
kosukesuzuki 1:b38a436a0059 131
kosukesuzuki 1:b38a436a0059 132 i2c.start();
kosukesuzuki 1:b38a436a0059 133 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 134 gyh = i2c.read(0);//data取り出す
kosukesuzuki 1:b38a436a0059 135 i2c.stop();
kosukesuzuki 1:b38a436a0059 136
kosukesuzuki 1:b38a436a0059 137 i2c.start();
kosukesuzuki 1:b38a436a0059 138 i2c.write(0x45); //data
kosukesuzuki 1:b38a436a0059 139 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 140 gyl = i2c.read(0);//data取り出す
kosukesuzuki 1:b38a436a0059 141 i2c.stop();
kosukesuzuki 1:b38a436a0059 142
kosukesuzuki 1:b38a436a0059 143 //z
kosukesuzuki 1:b38a436a0059 144 i2c.start();
kosukesuzuki 1:b38a436a0059 145 i2c.read(false); //ack(受信)
kosukesuzuki 1:b38a436a0059 146 i2c.write(0x46); //data
kosukesuzuki 1:b38a436a0059 147 i2c.stop();
kosukesuzuki 1:b38a436a0059 148
kosukesuzuki 1:b38a436a0059 149 i2c.start();
kosukesuzuki 1:b38a436a0059 150 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 151 gzh = i2c.read(0);//data取り出す
kosukesuzuki 1:b38a436a0059 152 i2c.stop();
kosukesuzuki 1:b38a436a0059 153
kosukesuzuki 1:b38a436a0059 154 i2c.start();
kosukesuzuki 1:b38a436a0059 155 i2c.write(0x47); //data
kosukesuzuki 1:b38a436a0059 156 i2c.write(addr|0x01); //ack=1(送信)
kosukesuzuki 1:b38a436a0059 157 gzl = i2c.read(0);//data取り出す
kosukesuzuki 1:b38a436a0059 158 i2c.stop();
kosukesuzuki 0:bf86efb237ca 159
kosukesuzuki 0:bf86efb237ca 160
kosukesuzuki 1:b38a436a0059 161 double acc_ax = short((axh<<8) | (axl));
kosukesuzuki 1:b38a436a0059 162 double acc_ay = short((ayh<<8) | (ayl));
kosukesuzuki 1:b38a436a0059 163 double acc_az = short((azh<<8) | (azl));
kosukesuzuki 1:b38a436a0059 164
kosukesuzuki 1:b38a436a0059 165 double acc_gx = short((gxh<<8) | (gxl));
kosukesuzuki 1:b38a436a0059 166 double acc_gy = short((gyh<<8) | (gyl));
kosukesuzuki 1:b38a436a0059 167 double acc_gz = short((gzh<<8) | (gzl));
kosukesuzuki 0:bf86efb237ca 168
kosukesuzuki 0:bf86efb237ca 169 double AX = (acc_ax)*2/32768*9.81;
kosukesuzuki 0:bf86efb237ca 170 double AY = (acc_ay)*2/32768*9.81;
kosukesuzuki 0:bf86efb237ca 171 double AZ = (acc_az)*2/32768*9.81;
kosukesuzuki 0:bf86efb237ca 172
kosukesuzuki 1:b38a436a0059 173 double GX = (acc_gx)*0.0128114995; //0.02562299
kosukesuzuki 1:b38a436a0059 174 double GY = (acc_gy)*0.0128114995; //0.0128114995(測定レンジ±500)
kosukesuzuki 1:b38a436a0059 175 double GZ = (acc_gz)*0.0128114995;
kosukesuzuki 1:b38a436a0059 176
kosukesuzuki 0:bf86efb237ca 177 pc.printf("%f %f %f\r\n",AX,AY,AZ);
kosukesuzuki 1:b38a436a0059 178 pc.printf("%f %f %f\r\n",GX,GY,GZ); //GXがずれている
kosukesuzuki 0:bf86efb237ca 179 wait(0.01);
kosukesuzuki 0:bf86efb237ca 180 }
kosukesuzuki 0:bf86efb237ca 181 }