mbed library for MPU9250 (SPI interface)

Dependents:   InvertedPendulum2017

Committer:
bluefish
Date:
Wed May 02 10:56:50 2018 +0000
Revision:
2:c142d5a352c5
Parent:
1:5334e111af53
for Peshala project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bluefish 1:5334e111af53 1 #include "Lib_MPU9250.h"
bluefish 1:5334e111af53 2
bluefish 1:5334e111af53 3 // constructor (use SPI)
bluefish 1:5334e111af53 4 MPU9250::MPU9250( PinName cs, PinName mosi, PinName miso, PinName sck ){
bluefish 1:5334e111af53 5 // initialize instance
bluefish 1:5334e111af53 6 _cs = new DigitalOut( cs );
bluefish 1:5334e111af53 7 _spi = new SPI( mosi, miso, sck );
bluefish 1:5334e111af53 8 _i2c = 0;
bluefish 1:5334e111af53 9 _i2c_addr = 0x0;
bluefish 1:5334e111af53 10
bluefish 1:5334e111af53 11 // spi setting
bluefish 1:5334e111af53 12 (*_cs) = 1;
bluefish 1:5334e111af53 13 _spi->format( 8, 0 );
bluefish 1:5334e111af53 14 _spi->frequency( 20000000 );
bluefish 1:5334e111af53 15
bluefish 1:5334e111af53 16 _accscale = MPU9250A_2G;
bluefish 1:5334e111af53 17 _gyroscale = MPU9250G_250DPS;
bluefish 1:5334e111af53 18
bluefish 2:c142d5a352c5 19 _imu_if = MPU9250_SPI;
bluefish 2:c142d5a352c5 20
bluefish 1:5334e111af53 21 return;
bluefish 1:5334e111af53 22 }
bluefish 1:5334e111af53 23
bluefish 1:5334e111af53 24 // constructor ( use I2C )
bluefish 1:5334e111af53 25 MPU9250::MPU9250( PinName sda, PinName scl, uint8_t addr ){
bluefish 1:5334e111af53 26 // initialize instance
bluefish 1:5334e111af53 27 _cs = 0;
bluefish 1:5334e111af53 28 _spi = 0;
bluefish 1:5334e111af53 29 _i2c = new I2C( sda, scl );
bluefish 1:5334e111af53 30 _i2c_addr = addr;
bluefish 1:5334e111af53 31
bluefish 1:5334e111af53 32 // I2C setting
bluefish 2:c142d5a352c5 33 _i2c->frequency( 100000 );
bluefish 1:5334e111af53 34
bluefish 1:5334e111af53 35 _accscale = MPU9250A_2G;
bluefish 1:5334e111af53 36 _gyroscale = MPU9250G_250DPS;
bluefish 2:c142d5a352c5 37
bluefish 2:c142d5a352c5 38 _imu_if = MPU9250_I2C;
bluefish 2:c142d5a352c5 39
bluefish 1:5334e111af53 40 return;
bluefish 1:5334e111af53 41 }
bluefish 1:5334e111af53 42
bluefish 1:5334e111af53 43
bluefish 1:5334e111af53 44 MPU9250::~MPU9250(){
bluefish 2:c142d5a352c5 45 return;
bluefish 1:5334e111af53 46 }
bluefish 1:5334e111af53 47
bluefish 1:5334e111af53 48 // スタート
bluefish 1:5334e111af53 49 void MPU9250::begin(){
bluefish 2:c142d5a352c5 50 if( _imu_if == MPU9250_SPI ){
bluefish 2:c142d5a352c5 51 // initialize state
bluefish 2:c142d5a352c5 52 _writeRegister( PWR_MGMT_1, 0x01 );
bluefish 2:c142d5a352c5 53 _writeRegister( PWR_MGMT_2, 0x00 );
bluefish 2:c142d5a352c5 54 _writeRegister( USER_CTRL, 0x30 );
bluefish 2:c142d5a352c5 55 _writeRegister( I2C_MST_CTRL, 0x0D ); // I2C clock speed : 400kHz
bluefish 2:c142d5a352c5 56
bluefish 2:c142d5a352c5 57 // reset AK8963
bluefish 2:c142d5a352c5 58 _writeRegister( I2C_SLV0_ADDR, AK8963_ADDR );
bluefish 2:c142d5a352c5 59 _writeRegister( I2C_SLV0_REG, CNTL2 );
bluefish 2:c142d5a352c5 60 _writeRegister( I2C_SLV0_DO, 0x01 );
bluefish 2:c142d5a352c5 61 _writeRegister( I2C_SLV0_CTRL, 0x81 );
bluefish 2:c142d5a352c5 62
bluefish 2:c142d5a352c5 63 // AK8963 mode : 100Hz sampling mode
bluefish 2:c142d5a352c5 64 _writeRegister( I2C_SLV0_ADDR, AK8963_ADDR );
bluefish 2:c142d5a352c5 65 _writeRegister( I2C_SLV0_REG, CNTL1 );
bluefish 2:c142d5a352c5 66 _writeRegister( I2C_SLV0_DO, 0x16 );
bluefish 2:c142d5a352c5 67 _writeRegister( I2C_SLV0_CTRL, 0x81 );
bluefish 1:5334e111af53 68
bluefish 2:c142d5a352c5 69 }else if( _imu_if == MPU9250_I2C ){
bluefish 2:c142d5a352c5 70 // initialize state
bluefish 2:c142d5a352c5 71 _writeRegister( PWR_MGMT_1, 0x01 );
bluefish 2:c142d5a352c5 72 _writeRegister( PWR_MGMT_2, 0x00 );
bluefish 2:c142d5a352c5 73 _writeRegister( USER_CTRL, 0x00 );
bluefish 2:c142d5a352c5 74 _writeRegister( I2C_MST_CTRL, 0x0D ); // I2C clock speed : 400kHz
bluefish 2:c142d5a352c5 75 // reset AK8963
bluefish 2:c142d5a352c5 76 _writeRegister( I2C_SLV0_ADDR, AK8963_ADDR );
bluefish 2:c142d5a352c5 77 _writeRegister( I2C_SLV0_REG, CNTL2 );
bluefish 2:c142d5a352c5 78 _writeRegister( I2C_SLV0_DO, 0x01 );
bluefish 2:c142d5a352c5 79 _writeRegister( I2C_SLV0_CTRL, 0x81 );
bluefish 2:c142d5a352c5 80
bluefish 2:c142d5a352c5 81 // AK8963 mode : 100Hz sampling mode
bluefish 2:c142d5a352c5 82 _writeRegister( I2C_SLV0_ADDR, AK8963_ADDR );
bluefish 2:c142d5a352c5 83 _writeRegister( I2C_SLV0_REG, CNTL1 );
bluefish 2:c142d5a352c5 84 _writeRegister( I2C_SLV0_DO, 0x16 );
bluefish 2:c142d5a352c5 85 _writeRegister( I2C_SLV0_CTRL, 0x81 );
bluefish 1:5334e111af53 86
bluefish 2:c142d5a352c5 87 }
bluefish 1:5334e111af53 88 return;
bluefish 1:5334e111af53 89 }
bluefish 1:5334e111af53 90
bluefish 1:5334e111af53 91 // リセット
bluefish 1:5334e111af53 92 void MPU9250::reset(){
bluefish 1:5334e111af53 93 _writeRegister( PWR_MGMT_1, BIT_H_RESET );
bluefish 1:5334e111af53 94 return;
bluefish 1:5334e111af53 95 }
bluefish 1:5334e111af53 96
bluefish 2:c142d5a352c5 97 // WhoAmI
bluefish 2:c142d5a352c5 98 uint8_t MPU9250::getWhoAmI(){
bluefish 2:c142d5a352c5 99 uint8_t ret = 0x00;
bluefish 2:c142d5a352c5 100 ret = _readRegister( WHO_AM_I );
bluefish 2:c142d5a352c5 101 return ret;
bluefish 2:c142d5a352c5 102 }
bluefish 2:c142d5a352c5 103
bluefish 1:5334e111af53 104 // 加速度センサのレンジ設定
bluefish 1:5334e111af53 105 void MPU9250::setAccelRange( MPU9250BIT range ){
bluefish 1:5334e111af53 106 switch( range ){
bluefish 1:5334e111af53 107 case BITS_FS_2G:
bluefish 1:5334e111af53 108 _accscale = MPU9250A_2G;
bluefish 1:5334e111af53 109 break;
bluefish 1:5334e111af53 110 case BITS_FS_4G:
bluefish 1:5334e111af53 111 _accscale = MPU9250A_4G;
bluefish 1:5334e111af53 112 break;
bluefish 1:5334e111af53 113 case BITS_FS_8G:
bluefish 1:5334e111af53 114 _accscale = MPU9250A_8G;
bluefish 1:5334e111af53 115 break;
bluefish 1:5334e111af53 116 case BITS_FS_16G:
bluefish 1:5334e111af53 117 _accscale = MPU9250A_16G;
bluefish 1:5334e111af53 118 break;
bluefish 1:5334e111af53 119 default:
bluefish 1:5334e111af53 120 return;
bluefish 1:5334e111af53 121 }
bluefish 1:5334e111af53 122 _writeRegister( ACCEL_CONFIG, range );
bluefish 1:5334e111af53 123 return;
bluefish 1:5334e111af53 124 }
bluefish 1:5334e111af53 125
bluefish 1:5334e111af53 126 // ジャイロセンサのレンジ設定
bluefish 1:5334e111af53 127 void MPU9250::setGyroRange( MPU9250BIT range ){
bluefish 1:5334e111af53 128 switch( range ){
bluefish 1:5334e111af53 129 case BITS_FS_250DPS:
bluefish 1:5334e111af53 130 _gyroscale = MPU9250G_250DPS;
bluefish 1:5334e111af53 131 // _gyroscalerad = MPU9250G_250DPS_RAD;
bluefish 1:5334e111af53 132 break;
bluefish 1:5334e111af53 133 case BITS_FS_500DPS:
bluefish 1:5334e111af53 134 _gyroscale = MPU9250G_500DPS;
bluefish 1:5334e111af53 135 // _gyroscalerad = MPU9250G_500DPS_RAD;
bluefish 1:5334e111af53 136 break;
bluefish 1:5334e111af53 137 case BITS_FS_1000DPS:
bluefish 1:5334e111af53 138 _gyroscale = MPU9250G_1000DPS;
bluefish 1:5334e111af53 139 // _gyroscalerad = MPU9250G_1000DPS_RAD;
bluefish 1:5334e111af53 140 break;
bluefish 1:5334e111af53 141 case BITS_FS_2000DPS:
bluefish 1:5334e111af53 142 _gyroscale = MPU9250G_2000DPS;
bluefish 1:5334e111af53 143 // _gyroscalerad = MPU9250G_2000DPS_RAD;
bluefish 1:5334e111af53 144 break;
bluefish 1:5334e111af53 145 default:
bluefish 1:5334e111af53 146 return;
bluefish 1:5334e111af53 147 }
bluefish 1:5334e111af53 148 _writeRegister( GYRO_CONFIG, range );
bluefish 1:5334e111af53 149 return;
bluefish 1:5334e111af53 150 }
bluefish 1:5334e111af53 151
bluefish 1:5334e111af53 152 // ローパスフィルタ設定
bluefish 1:5334e111af53 153 void MPU9250::setDLPF( MPU9250BIT range ){
bluefish 1:5334e111af53 154 return;
bluefish 1:5334e111af53 155 }
bluefish 1:5334e111af53 156
bluefish 1:5334e111af53 157 // 6軸分の生データを取得
bluefish 1:5334e111af53 158 void MPU9250::read6AxisRaw( int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz ){
bluefish 1:5334e111af53 159 uint8_t buf[14];
bluefish 1:5334e111af53 160 _readBuffer( ACCEL_XOUT_H, 14, buf );
bluefish 1:5334e111af53 161 *ax = (int16_t)( ( buf[0] << 8 ) | buf[1] );
bluefish 1:5334e111af53 162 *ay = (int16_t)( ( buf[2] << 8 ) | buf[3] );
bluefish 1:5334e111af53 163 *az = (int16_t)( ( buf[4] << 8 ) | buf[5] );
bluefish 1:5334e111af53 164 *gx = (int16_t)( ( buf[8] << 8 ) | buf[9] );
bluefish 1:5334e111af53 165 *gy = (int16_t)( ( buf[10] << 8 ) | buf[11] );
bluefish 1:5334e111af53 166 *gz = (int16_t)( ( buf[12] << 8 ) | buf[13] );
bluefish 1:5334e111af53 167 return;
bluefish 1:5334e111af53 168 }
bluefish 1:5334e111af53 169
bluefish 1:5334e111af53 170 // 9軸分の生データを取得
bluefish 1:5334e111af53 171 void MPU9250::read9AxisRaw( int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz ){
bluefish 1:5334e111af53 172 uint8_t buf[21];
bluefish 1:5334e111af53 173 _writeRegister( I2C_SLV0_ADDR, AK8963_ADDR | 0x80 ); // Set the I2C slave addres of AK8963 and set for read.
bluefish 1:5334e111af53 174 _writeRegister( I2C_SLV0_REG, HXL ); // I2C slave 0 register address from where to begin data transfer
bluefish 1:5334e111af53 175 _writeRegister( I2C_SLV0_CTRL, 0x87 ); // Read 7 bytes from the magnetomete
bluefish 1:5334e111af53 176 _readBuffer( ACCEL_XOUT_H, 21, buf );
bluefish 1:5334e111af53 177 *ax = (int16_t)( ( buf[0] << 8 ) | buf[1] );
bluefish 1:5334e111af53 178 *ay = (int16_t)( ( buf[2] << 8 ) | buf[3] );
bluefish 1:5334e111af53 179 *az = (int16_t)( ( buf[4] << 8 ) | buf[5] );
bluefish 1:5334e111af53 180 *gx = (int16_t)( ( buf[8] << 8 ) | buf[9] );
bluefish 1:5334e111af53 181 *gy = (int16_t)( ( buf[10] << 8 ) | buf[11] );
bluefish 1:5334e111af53 182 *gz = (int16_t)( ( buf[12] << 8 ) | buf[13] );
bluefish 1:5334e111af53 183 *mx = (int16_t)( ( buf[15] << 8 ) | buf[14] );
bluefish 1:5334e111af53 184 *my = (int16_t)( ( buf[17] << 8 ) | buf[16] );
bluefish 1:5334e111af53 185 *mz = (int16_t)( ( buf[19] << 8 ) | buf[18] );
bluefish 1:5334e111af53 186 return;
bluefish 1:5334e111af53 187 }
bluefish 1:5334e111af53 188
bluefish 1:5334e111af53 189 // 加速度生データの取得
bluefish 1:5334e111af53 190 void MPU9250::readAccelRaw( int16_t* ax, int16_t* ay, int16_t* az ){
bluefish 1:5334e111af53 191 uint8_t buf[6];
bluefish 1:5334e111af53 192 _readBuffer( ACCEL_XOUT_H, 6, buf );
bluefish 1:5334e111af53 193 *ax = (int16_t)( ( buf[0] << 8 ) | buf[1] );
bluefish 1:5334e111af53 194 *ay = (int16_t)( ( buf[2] << 8 ) | buf[3] );
bluefish 1:5334e111af53 195 *az = (int16_t)( ( buf[4] << 8 ) | buf[5] );
bluefish 1:5334e111af53 196 return;
bluefish 1:5334e111af53 197 }
bluefish 1:5334e111af53 198
bluefish 1:5334e111af53 199 // ジャイロ生データの取得
bluefish 1:5334e111af53 200 void MPU9250::readGyroRaw( int16_t* gx, int16_t* gy, int16_t* gz ){
bluefish 1:5334e111af53 201 uint8_t buf[6];
bluefish 1:5334e111af53 202 _readBuffer( GYRO_XOUT_H, 6, buf );
bluefish 1:5334e111af53 203 *gx = (int16_t)( ( buf[0] << 8 ) | buf[1] );
bluefish 1:5334e111af53 204 *gy = (int16_t)( ( buf[2] << 8 ) | buf[3] );
bluefish 1:5334e111af53 205 *gz = (int16_t)( ( buf[4] << 8 ) | buf[5] );
bluefish 1:5334e111af53 206 return;
bluefish 1:5334e111af53 207 }
bluefish 1:5334e111af53 208
bluefish 1:5334e111af53 209 // 地磁気生データの取得
bluefish 1:5334e111af53 210 void MPU9250::readMagRaw( int16_t* mx, int16_t* my, int16_t* mz ){
bluefish 1:5334e111af53 211 uint8_t buf[7];
bluefish 1:5334e111af53 212 _writeRegister( I2C_SLV0_ADDR, AK8963_ADDR | 0x80 ); // Set the I2C slave addres of AK8963 and set for read.
bluefish 1:5334e111af53 213 _writeRegister( I2C_SLV0_REG, HXL ); // I2C slave 0 register address from where to begin data transfer
bluefish 1:5334e111af53 214 _writeRegister( I2C_SLV0_CTRL, 0x87 ); // Read 7 bytes from the magnetomete
bluefish 1:5334e111af53 215 _readBuffer( EXT_SENS_DATA_00, 7, buf );
bluefish 1:5334e111af53 216 *mx = (int16_t)( ( buf[1] << 8 ) | buf[0] );
bluefish 1:5334e111af53 217 *my = (int16_t)( ( buf[3] << 8 ) | buf[2] );
bluefish 1:5334e111af53 218 *mz = (int16_t)( ( buf[5] << 8 ) | buf[4] );
bluefish 1:5334e111af53 219 return;
bluefish 1:5334e111af53 220 }
bluefish 1:5334e111af53 221
bluefish 1:5334e111af53 222 // 温度生データの取得
bluefish 1:5334e111af53 223 int16_t MPU9250::readTempRaw(){
bluefish 1:5334e111af53 224 uint8_t buf[2];
bluefish 1:5334e111af53 225 _readBuffer( TEMP_OUT_H, 2, buf );
bluefish 1:5334e111af53 226 return (int16_t)( ( buf[0] << 8 ) | buf[1] );
bluefish 1:5334e111af53 227 }
bluefish 1:5334e111af53 228
bluefish 1:5334e111af53 229 // 6軸データの取得
bluefish 1:5334e111af53 230 void MPU9250::read6Axis( float* ax, float* ay, float* az, float* gx, float* gy, float* gz ){
bluefish 1:5334e111af53 231 int16_t a_x, a_y, a_z, g_x, g_y, g_z;
bluefish 1:5334e111af53 232 read6AxisRaw( &a_x, &a_y, &a_z, &g_x, &g_y, &g_z );
bluefish 1:5334e111af53 233 *ax = (float)a_x * _accscale;
bluefish 1:5334e111af53 234 *ay = (float)a_y * _accscale;
bluefish 1:5334e111af53 235 *az = (float)a_z * _accscale;
bluefish 1:5334e111af53 236 *gx = (float)g_x * _gyroscale;
bluefish 1:5334e111af53 237 *gy = (float)g_y * _gyroscale;
bluefish 1:5334e111af53 238 *gz = (float)g_z * _gyroscale;
bluefish 1:5334e111af53 239 return;
bluefish 1:5334e111af53 240 }
bluefish 1:5334e111af53 241
bluefish 1:5334e111af53 242 // 9軸データの取得
bluefish 1:5334e111af53 243 void MPU9250::read9Axis( float* ax, float* ay, float* az, float* gx, float* gy, float* gz, float* mx, float* my, float* mz ){
bluefish 1:5334e111af53 244 int16_t a_x, a_y, a_z, g_x, g_y, g_z, m_x, m_y, m_z;
bluefish 1:5334e111af53 245 read9AxisRaw( &a_x, &a_y, &a_z, &g_x, &g_y, &g_z, &m_x, &m_y, &m_z );
bluefish 1:5334e111af53 246 *ax = (float)a_x * _accscale;
bluefish 1:5334e111af53 247 *ay = (float)a_y * _accscale;
bluefish 1:5334e111af53 248 *az = (float)a_z * _accscale;
bluefish 1:5334e111af53 249 *gx = (float)g_x * _gyroscale;
bluefish 1:5334e111af53 250 *gy = (float)g_y * _gyroscale;
bluefish 1:5334e111af53 251 *gz = (float)g_z * _gyroscale;
bluefish 1:5334e111af53 252 *mx = (float)m_x * MPU9250M_4800uT;
bluefish 1:5334e111af53 253 *my = (float)m_y * MPU9250M_4800uT;
bluefish 1:5334e111af53 254 *mz = (float)m_z * MPU9250M_4800uT;
bluefish 1:5334e111af53 255 return;
bluefish 1:5334e111af53 256 }
bluefish 1:5334e111af53 257
bluefish 1:5334e111af53 258 // 加速度データの取得
bluefish 1:5334e111af53 259 void MPU9250::readAccel( float* ax, float* ay, float* az ){
bluefish 1:5334e111af53 260 int16_t x, y ,z;
bluefish 1:5334e111af53 261 readAccelRaw( &x, &y, &z );
bluefish 1:5334e111af53 262 *ax = (float)x * _accscale;
bluefish 1:5334e111af53 263 *ay = (float)y * _accscale;
bluefish 1:5334e111af53 264 *az = (float)z * _accscale;
bluefish 1:5334e111af53 265 return;
bluefish 1:5334e111af53 266 }
bluefish 1:5334e111af53 267
bluefish 1:5334e111af53 268 // ジャイロデータの取得
bluefish 1:5334e111af53 269 void MPU9250::readGyro( float* gx, float* gy, float* gz ){
bluefish 1:5334e111af53 270 int16_t x, y ,z;
bluefish 1:5334e111af53 271 readGyroRaw( &x, &y, &z );
bluefish 1:5334e111af53 272 *gx = (float)x * _gyroscale;
bluefish 1:5334e111af53 273 *gy = (float)y * _gyroscale;
bluefish 1:5334e111af53 274 *gz = (float)z * _gyroscale;
bluefish 1:5334e111af53 275 return;
bluefish 1:5334e111af53 276 }
bluefish 1:5334e111af53 277
bluefish 1:5334e111af53 278 // 地磁気データの取得
bluefish 1:5334e111af53 279 void MPU9250::readMag( float* mx, float* my, float* mz ){
bluefish 1:5334e111af53 280 int16_t x, y ,z;
bluefish 1:5334e111af53 281 readMagRaw( &x, &y, &z );
bluefish 1:5334e111af53 282 *mx = (float)x * MPU9250M_4800uT;
bluefish 1:5334e111af53 283 *my = (float)y * MPU9250M_4800uT;
bluefish 1:5334e111af53 284 *mz = (float)z * MPU9250M_4800uT;
bluefish 1:5334e111af53 285 return;
bluefish 1:5334e111af53 286 }
bluefish 1:5334e111af53 287
bluefish 1:5334e111af53 288 // get temperature
bluefish 1:5334e111af53 289 float MPU9250::readTemp(){
bluefish 1:5334e111af53 290 int16_t tmp;
bluefish 1:5334e111af53 291 tmp = readTempRaw();
bluefish 1:5334e111af53 292 return (float)tmp * MPU9250T_85degC;
bluefish 1:5334e111af53 293 }
bluefish 1:5334e111af53 294
bluefish 1:5334e111af53 295 // read register
bluefish 1:5334e111af53 296 uint8_t MPU9250::_readRegister( MPU9250REG addr ){
bluefish 1:5334e111af53 297 uint8_t ret;
bluefish 2:c142d5a352c5 298 if( _imu_if == MPU9250_SPI ){
bluefish 2:c142d5a352c5 299 (*_cs) = 0;
bluefish 2:c142d5a352c5 300 ret = _spi->write( addr | 0x80 ); // send address
bluefish 2:c142d5a352c5 301 ret = _spi->write( 0x00 );
bluefish 2:c142d5a352c5 302 (*_cs) = 1;
bluefish 2:c142d5a352c5 303 }else{
bluefish 2:c142d5a352c5 304 _i2c->write( _i2c_addr * 2, (char*)(&addr), 1, 1 );
bluefish 2:c142d5a352c5 305 _i2c->read( _i2c_addr * 2, (char*)(&ret), 1 );
bluefish 2:c142d5a352c5 306 }
bluefish 1:5334e111af53 307 return ret;
bluefish 1:5334e111af53 308 }
bluefish 1:5334e111af53 309
bluefish 1:5334e111af53 310 // write register
bluefish 1:5334e111af53 311 uint8_t MPU9250::_writeRegister( MPU9250REG addr, uint8_t data ){
bluefish 2:c142d5a352c5 312 if( _imu_if == MPU9250_SPI ){
bluefish 2:c142d5a352c5 313 (*_cs) = 0;
bluefish 2:c142d5a352c5 314 _spi->write( addr );
bluefish 2:c142d5a352c5 315 _spi->write( data );
bluefish 2:c142d5a352c5 316 (*_cs) = 1;
bluefish 2:c142d5a352c5 317 }else{
bluefish 2:c142d5a352c5 318 uint8_t buf[2] = { addr, data };
bluefish 2:c142d5a352c5 319 _i2c->write( _i2c_addr * 2, (char*)buf, 2 );
bluefish 2:c142d5a352c5 320 }
bluefish 1:5334e111af53 321 return 0;
bluefish 1:5334e111af53 322 }
bluefish 1:5334e111af53 323
bluefish 1:5334e111af53 324 // レジスタの読み込み(バッファ)
bluefish 1:5334e111af53 325 uint8_t MPU9250::_readBuffer( MPU9250REG addr, uint8_t len, uint8_t* buf ){
bluefish 2:c142d5a352c5 326 if( _imu_if == MPU9250_SPI ){
bluefish 2:c142d5a352c5 327 (*_cs) = 0;
bluefish 2:c142d5a352c5 328 _spi->write( addr | 0x80 ); // send address
bluefish 2:c142d5a352c5 329 while( len-- ){
bluefish 2:c142d5a352c5 330 *(buf++) = _spi->write( 0x00 ); // read data
bluefish 2:c142d5a352c5 331 }
bluefish 2:c142d5a352c5 332 (*_cs) = 1;
bluefish 2:c142d5a352c5 333 }else{
bluefish 2:c142d5a352c5 334 _i2c->write( _i2c_addr * 2, (char*)(&addr), 1 );
bluefish 2:c142d5a352c5 335 _i2c->read( _i2c_addr * 2, (char*)buf, len );
bluefish 1:5334e111af53 336 }
bluefish 1:5334e111af53 337 return 0;
bluefish 1:5334e111af53 338 }
bluefish 1:5334e111af53 339
bluefish 1:5334e111af53 340 // レジスタの書き込み(バッファ)
bluefish 1:5334e111af53 341 uint8_t MPU9250::_writeBuffer( MPU9250REG addr, uint8_t len, uint8_t* buf ){
bluefish 2:c142d5a352c5 342 if( _imu_if == MPU9250_SPI ){
bluefish 2:c142d5a352c5 343 (*_cs) = 0;
bluefish 2:c142d5a352c5 344 _spi->write( addr ); // send address
bluefish 2:c142d5a352c5 345 while( len-- ){
bluefish 2:c142d5a352c5 346 _spi->write( *(buf++) ); // send data
bluefish 2:c142d5a352c5 347 }
bluefish 2:c142d5a352c5 348 (*_cs) = 1;
bluefish 2:c142d5a352c5 349 }else{
bluefish 2:c142d5a352c5 350 _i2c->write( _i2c_addr * 2, (char*)(&addr), 1 );
bluefish 2:c142d5a352c5 351 _i2c->write( _i2c_addr * 2, (char*)buf, len );
bluefish 1:5334e111af53 352 }
bluefish 1:5334e111af53 353 return 0;
bluefish 1:5334e111af53 354 }