Акселегиромагнетометр 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
В официальном даташите все это прописано.