Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Не отвечает датчик MPL3115A2

Сб апр 30, 2022 22:55:23

У меня есть модуль с микросхемйо MPL3115A2 ( https://www.nxp.com/docs/en/data-sheet/MPL3115A2.pdf ) покупал данный модуль на али ( https://aliexpress.ru/item/400113915144 ... 439367hG2x )

Пытюась прочитать регистр WHO I AM через STM32 вот таким кодом
Спойлер
Код:
uint8_t I2Cx_ReadData(uint8_t DeviceAddr, uint8_t RegisterAddr) {
   uint8_t value = 0;
   HAL_I2C_Master_Transmit(&hi2c1, (DeviceAddr << 1), &RegisterAddr, 1, 10);
   HAL_I2C_Master_Receive(&hi2c1, (DeviceAddr << 1), &value, 1, 10);
   return value;
}
И в ответ тишина, при этом данный код на других датчиках работает исправно.

Проверял логическим анализатором, адреса идут корректные, как в даташите 0xC0 - для записи, 0xC1 - при чтение.

Сначала подумал, что может адрес не верный. Сделал цикл в котором перебираются все варианты адресов и только по правильному адресу 0xC0 получаю в логическом анализаторе строку вида "Setup Write to [0xC0] + ACK" по всем другим адресам я получаю NAK.

И вот когда я встаю на чтение регистров, то всегда получаю ответ 0x00+ NAK

Подскажите пожалуйста в чем может проблема?
Датчика у меня 2 и оба ведут себя одинаково
Последний раз редактировалось The Rock Вс май 01, 2022 09:45:44, всего редактировалось 1 раз.

Re: Не отвечает датчик MPL3115A2

Вс май 01, 2022 02:07:33

таймаут не слишком мал?

Добавлено after 6 minutes 6 seconds:
И что-то Вы не всё показали. В даташите попытка чтения регистра врое несколько более запуутанна, например, сначала получить статус состояния, перед этим вообще инициализировать и активировать датчик...

Re: Не отвечает датчик MPL3115A2

Вс май 01, 2022 09:52:09

Martian писал(а):таймаут не слишком мал?


Поднял таймаут до 100 не помогло=(

Martian писал(а):И что-то Вы не всё показали. В даташите попытка чтения регистра врое несколько более запуутанна, например, сначала получить статус состояния, перед этим вообще инициализировать и активировать датчик...

Да, чтение основных регистров с давление и температуры идет через проверку готовности новых данных. Но на сколько я имел опыт работы с датчиками I2C , то на WHO I AM они отвечают напрямую. Да и у меня есть библиотека от Adafruit для этого датчика там тоже чтение WHO I AM идет на прямую.
Спойлер
Код:
boolean Adafruit_MPL3115A2::begin(TwoWire *twoWire) {
  if (i2c_dev)
    delete i2c_dev;
  i2c_dev = new Adafruit_I2CDevice(MPL3115A2_ADDRESS, twoWire);
  if (!i2c_dev->begin())
    return false;

  // sanity check
  uint8_t whoami = read8(MPL3115A2_WHOAMI);
  if (whoami != 0xC4) {
    return false;
  }
  }
Делал ещё такую проверку, проходил в цикле на чтение по регистрам от 1 до 255 и во всех случаях был ответ 0x00 + NAK

Re: Не отвечает датчик MPL3115A2

Вс май 01, 2022 21:10:33

Возможно, что на плате вместо MPL3115A2 установленa старая модель MPL115A2. У неё чтение по адресу 0х0С действительно возвращает 0. В этом случае маркировка датчика должна быть M2PR. Но даже если у Вас на датчике написано M3PR, это не гарантия если куплено на Али. В любом случае, при чтении всех регистров должны не всегда возвращаться нули. У меня есть в наличии только MPL115A2, и у неё при чтении 8 калибровочных коэффициентов, начиная с адреса 0х04 возвращаются не нули, см. картинку. Если у Вас есть логический анализатор, выложите сюда его осциллограмму. Возможно проблема в инициализации I2C модуля МК либо выводов под интерфейс. Выше Вы упомянули Arduinо - а она читает ID датчика правильно?
mpl115.png
(48.34 KiB) Скачиваний: 47

Re: Не отвечает датчик MPL3115A2

Сб май 07, 2022 12:35:50

Всем спасибо за участие!

Разобрался с проблемой, оказывается данному датчику не подходит обращение через 2 функции передача и прием. Так как они разделяются сигналом STOP, а данному датчику подавай REPEATED START. Благодаря этому датчику нашел ещё более удобный способ читать данные из датчиков по I2C
Спойлер
Код:
void I2Cx_ReadDataRepeatedStart(uint8_t DeviceAddr, uint8_t RegisterAddr, uint8_t i2cRxBuff[], uint8_t size){
   HAL_I2C_Mem_Read(&hi2c1, DeviceAddr, RegisterAddr, 1, i2cRxBuff, size, 100);
}

Re: Не отвечает датчик MPL3115A2

Сб май 07, 2022 12:59:55

Ну, вообще-то, это обычная практика - смена направления запись/чтение через состояние Restart. То есть, чтобы прочитать какой-то конкретный регистр, вы передаете адрес этого регистра, затем Restart и читаете указанный регистр. Суть в том, что нужно сменить бит направления передачи по интерфейсу, а сделать это можно только через restart, передав адрес устройства.

Re: Не отвечает датчик MPL3115A2

Сб май 07, 2022 13:11:42

Да, скорее всего это распространенная практика. Однако, я только начинаю работать с датчиками и через меня прошло всего 5 разных датчика. И все они корректно работали через STOP, а вот этот оказался привередливым ) Дня 3 потратил на то чтобы разобраться в таком простом вопросе)
Ответить