Акселегиромагнетометр MPU9250 подключаю к STM32F103C8T6.
Использую вот эту статью: https://www.programmersought.com/article/249311230684/
Код взял из статьи.
Заработало, но как-то криво. Я не уверен в правильности показаний акслерометра и гироскопа, т.к. при чтении регистра mpu9250(mpu6500) WHO_AM_I получаю значение 0х70, а в коде прямо написано: expected to be 0x48.
Магнетометр вообще выдает 0 данные. При чтении регистра ak8963 WHO_AM_I получаю значение 0х00, хотя в коде написано expected to be 0x48
Наверное на этапе инициализации что-то не то. Вот код инициализации:
uint8_t MPU9250_Init(MPU9250 *mpu) {
int Rez = -1;
MPU9250_StructInit(mpu);
mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x80); // reset MPU9250, reg107
HAL_Delay(10);
mpu_w_reg(USER_CTRL, (uint8_t) 0x20); // enable I2C master mode, reg106
mpu_w_reg(I2C_MST_CTRL, (uint8_t) 0x0D); // set I2C clock speed to 400kHz, reg36
mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x00); // set AK8963 to power down
mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x80); // reset MPU9250, Bit[7] will auto clear
HAL_Delay(10);
mpu_w_ak8963_reg(AK8963_CNTL2_REG, AK8963_CNTL2_SRST); // reset AK8963
mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x01); // select clock source
mpu_w_reg(PWR_MGMT_2, (uint8_t) 0x00); // enable accel and gyro
/* init GYRO and ACCEL */
mpu_w_reg(SMPLRT_DIV, (uint8_t) 0x00); // SAMPLE_RATE= Internal_Sample_Rate / (1 + SMPLRT_DIV), Internal_Sample_Rate==8K
mpu_w_reg(GYRO_CONFIG, (uint8_t) MPU9250_Gyro_Range_2000dps); // gyro full scale select
mpu_w_reg(ACCEL_CONFIG, (uint8_t) MPU9250_Accel_Range_16G); // accel full scale select
mpu_w_reg(ACCEL_CONFIG_2, (uint8_t) MPU9250_Accel_DLPFBandwidth_460);
mpu_w_reg(CONFIG, (uint8_t) MPU9250_Gyro_DLPFBandwidth_250);
/* init MAG */
mpu_w_reg(USER_CTRL, (uint8_t) 0x20); // enable I2C master mode
mpu_w_reg(I2C_MST_CTRL, (uint8_t) 0x0D); // set I2C clock speed to 400kHz, reg36
mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x00); // set AK8963 to power down
//mpu_w_reg(INT_PIN_CFG, (uint8_t) 0x02);
//mpu_w_ak8963_reg(INT_PIN_CFG, (uint8_t) 0x02);
HAL_Delay(100);
mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x0f); // set AK8963 to Fuse ROM access mode
HAL_Delay(100);
mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x00); // set AK8963 to power down
HAL_Delay(100);
mpu_w_ak8963_reg(AK8963_CNTL1_REG, (uint8_t) 0x16); // AK8963 working on Continuous measurement mode 2 & 16-bit output
HAL_Delay(100);
mpu_w_reg(PWR_MGMT_1, (uint8_t) 0x01); // select clock source
mpu_r_ak8963_regs(MAG_XOUT_L, 7);
Rez = 0;
return Rez;
}
Кто знает в чем загвоздка? Подключаю по интерфейсу SPI
т.к. при чтении регистра mpu9250(mpu6500) WHO_AM_I получаю значение 0х70, а в коде прямо написано: expected to be 0x48.
Если это не работает, то дальше нет смысла смотреть показания итд итп. Может проблема в физическом подключении, может настройки SPI, первичная цель - добиться правильного коннекта, это как раз можно отследить по значению регистра, в котором заведомо фиксированное значение должно быть.
В проекте, который я использую в качестве шпаргалки, зачем-то наряду с High Speed Clock подключили Low Speed Clock и не объяснили зачем? Мысль такая, что MPU может работать с LSE. Если это так, то как SPI переключить на LSE? Может глупость говорю, но что-то надо делать?
@mihayk не, LSE для другого в принципе. Тут получается, что коммуникация то работает, видимо проблема исключительно с магнетометром... И первая мысль, что в самой библиотеке проблема.
Заработало, но как-то криво. Я не уверен в правильности показаний акслерометра и гироскопа, т.к. при чтении регистра mpu9250(mpu6500) WHO_AM_I получаю значение 0х70, а в коде прямо написано: expected to be 0x48.
Магнетометр вообще выдает 0 данные. При чтении регистра ak8963 WHO_AM_I получаю значение 0х00, хотя в коде написано expected to be 0x48
Кто знает в чем загвоздка? Подключаю по интерфейсу SPI
Хоть и слишком поздно, но у вас все правильно приходило на тот момент.
Акселерометр+гироскоп должен выдавать 0x70
Магнетометр 0x00
В официальном даташите все это прописано.