И в ответ тишина, при этом данный код на других датчиках работает исправно.
Проверял логическим анализатором, адреса идут корректные, как в даташите 0xC0 - для записи, 0xC1 - при чтение.
Сначала подумал, что может адрес не верный. Сделал цикл в котором перебираются все варианты адресов и только по правильному адресу 0xC0 получаю в логическом анализаторе строку вида "Setup Write to [0xC0] + ACK" по всем другим адресам я получаю NAK.
И вот когда я встаю на чтение регистров, то всегда получаю ответ 0x00+ NAK
Подскажите пожалуйста в чем может проблема? Датчика у меня 2 и оба ведут себя одинаково
Последний раз редактировалось The Rock Вс май 01, 2022 09:45:44, всего редактировалось 1 раз.
Добавлено after 6 minutes 6 seconds: И что-то Вы не всё показали. В даташите попытка чтения регистра врое несколько более запуутанна, например, сначала получить статус состояния, перед этим вообще инициализировать и активировать датчик...
И что-то Вы не всё показали. В даташите попытка чтения регистра врое несколько более запуутанна, например, сначала получить статус состояния, перед этим вообще инициализировать и активировать датчик...
Да, чтение основных регистров с давление и температуры идет через проверку готовности новых данных. Но на сколько я имел опыт работы с датчиками 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;
Возможно, что на плате вместо MPL3115A2 установленa старая модель MPL115A2. У неё чтение по адресу 0х0С действительно возвращает 0. В этом случае маркировка датчика должна быть M2PR. Но даже если у Вас на датчике написано M3PR, это не гарантия если куплено на Али. В любом случае, при чтении всех регистров должны не всегда возвращаться нули. У меня есть в наличии только MPL115A2, и у неё при чтении 8 калибровочных коэффициентов, начиная с адреса 0х04 возвращаются не нули, см. картинку. Если у Вас есть логический анализатор, выложите сюда его осциллограмму. Возможно проблема в инициализации I2C модуля МК либо выводов под интерфейс. Выше Вы упомянули Arduinо - а она читает ID датчика правильно?
Разобрался с проблемой, оказывается данному датчику не подходит обращение через 2 функции передача и прием. Так как они разделяются сигналом STOP, а данному датчику подавай REPEATED START. Благодаря этому датчику нашел ещё более удобный способ читать данные из датчиков по I2CСпойлер
Ну, вообще-то, это обычная практика - смена направления запись/чтение через состояние Restart. То есть, чтобы прочитать какой-то конкретный регистр, вы передаете адрес этого регистра, затем Restart и читаете указанный регистр. Суть в том, что нужно сменить бит направления передачи по интерфейсу, а сделать это можно только через restart, передав адрес устройства.
Да, скорее всего это распространенная практика. Однако, я только начинаю работать с датчиками и через меня прошло всего 5 разных датчика. И все они корректно работали через STOP, а вот этот оказался привередливым ) Дня 3 потратил на то чтобы разобраться в таком простом вопросе)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения