проблемы с доступом к данным магнитометра от MPU9150

Вывод: -Я получаю 0xFF при чтении каждого регистра (соответствующего магнитометру). С другой стороны, я могу отлично получить доступ к регистрам акселерометра и гироскопа. Я инициализировал систему с отключенным главным режимом i2c и включенным режимом обхода i2c. Ниже приведен код, который я использовал для инициализации системы:

single_byte_write(0x6B,0x01);
single_byte_write(0x19,0x01);
single_byte_write(0x1A,0x02);
single_byte_write(0x1B,0x11);
single_byte_write(0x1C,0x10);
single_byte_write(0x6A,0x00);
single_byte_write(0x37,0x02);

(‘single_byte_write(address,data) записывает байт данных в регистр с ‘address’ на подчиненный адрес как 0x69’)

Я получил доступ к регистрам ускорения. и гироскоп. следующим образом: single_byte_read(0x75,wia_mpu); который возвращает 0x68, что соответствует регистру who_i_am. Но когда я попытался получить доступ к регистрам магнитометра как: single_byte_read_compass(0x00,wia_compass); он возвращает 0xFF, а должен возвращать 0x48.

Чтобы обеспечить правильную работу single_byte_read_compass()/single_byte_write_compass(), я использовал эти функции с изменением адреса подчиненного устройства (с «0x0C» на «0x69») для доступа к регистрам ускорения. и гироскоп. и он работал правильно.

(Разница между «single_byte_read()» и «single_byte_read_compass()» заключается только в том, что первый использует адрес подчиненного устройства как «0x69», а последний использует «0x0C» в качестве адреса подчиненного устройства. Я также пробовал «0x0D», «0x0E». ' и '0x0F' в качестве адреса подчиненного устройства, но вывод остался прежним.)

Я также проверил, находится ли MPU9150 в сквозном режиме. Я проверил выход на контактах «ES_DA», то есть контакт 6, и SDA, то есть контакт 24, с помощью осциллографа, который оказался точно таким же, с включенным режимом обхода. При отключенном ведущем режиме и отключенном режиме байпаса выход на «ES_DA» всегда равен нулю.

Я также пробовал ту же процедуру, что и выше, не только с одним, но и со многими MPU9150, но результат остался прежним, поэтому, скорее всего, есть какая-то проблема с кодом.


person user3825537    schedule 10.07.2014    source источник


Ответы (1)


Это код, который я использую для инициализации MPU9150, и он работает для меня (это модифицированная версия Arduino, которую я нашел в Интернете):

void MPU9150::initialize(){
   write(MPU9150_PWR_MGMT_1, 0); //Wake up

   initializeCompass();
}

void MPU9150::initializeCompass(){
  this->i2cDevice.address = this->i2cDevice.compass; // 0x0C or 0x0D

  write(0x0A, 0x00); //PowerDownMode
  write(0x0A, 0x0F); //SelfTest
  write(0x0A, 0x00); //PowerDownMode

  this->i2cDevice.address = this->i2cDevice.mpu; //0x68 or 0x69

  write(0x24, 0x40); //Wait for Data at Slave0
  write(0x25, 0x8C); //Set i2c address at slave0 at 0x0C
  write(0x26, 0x02); //Set where reading at slave 0 starts
  write(0x27, 0x88); //set offset at start reading and enable
  write(0x28, 0x0C); //set i2c address at slv1 at 0x0C
  write(0x29, 0x0A); //Set where reading at slave 1 starts
  write(0x2A, 0x81); //Enable at set length to 1
  write(0x64, 0x01); //overvride register
  write(0x67, 0x03); //set delay rate
  write(0x01, 0x80);

  write(0x34, 0x04); //set i2c slv4 delay
  write(0x64, 0x00); //override register
  write(0x6A, 0x00); //clear usr setting
  write(0x64, 0x01); //override register
  write(0x6A, 0x20); //enable master i2c mode
  write(0x34, 0x13); //disable slv4
}

А затем прочитать магнитометр:

void MPU9150::readCompass()
{
    data.compass.x = read(MPU9150_CMPS_XOUT_L,MPU9150_CMPS_XOUT_H);
    data.compass.y = read(MPU9150_CMPS_YOUT_L,MPU9150_CMPS_YOUT_H);
    data.compass.z = read(MPU9150_CMPS_ZOUT_L,MPU9150_CMPS_ZOUT_H);
}

Где:

//MPU9150 Compass
#define MPU9150_CMPS_XOUT_L        0x4A   // R
#define MPU9150_CMPS_XOUT_H        0x4B   // R
#define MPU9150_CMPS_YOUT_L        0x4C   // R
#define MPU9150_CMPS_YOUT_H        0x4D   // R
#define MPU9150_CMPS_ZOUT_L        0x4E   // R
#define MPU9150_CMPS_ZOUT_H        0x4F   // R
person Tomas Stibrany    schedule 21.09.2014