Перейти к содержанию

Как подключить два MLX90614 к одной шине I²C?

Обновлено Редакция GAW

С завода у всех MLX90614 одинаковый адрес на шине SMBus — 0x5A. Melexis хранит адрес в EEPROM, в ячейке 0x0E, и разрешает его менять, так что на двух проводах можно держать до 127 датчиков. Схема смены адреса та же, что и у любой ячейки EEPROM в разделе 4.1.3.3.1 даташита.

Порядок смены адреса

  1. Подключить к шине только тот датчик, адрес которого меняем, и включить питание.
  2. Прочитать ячейку командой 0x2E (префикс доступа к EEPROM 001x xxxx плюс адрес ячейки 0x0E) — пригодится для проверки.
  3. Записать 0x0000 — это стирание ячейки, — подождать не меньше 5 мс, надёжнее 10, и прочитать ячейку: там должен быть 0x0000.
  4. Записать новое значение: младший байт — новый адрес, например 0x5B, старший — как был прочитан, потому что по таблице EEPROM значим только младший. Снова подождать 10 мс.
  5. Прочитать ячейку и сравнить, затем выключить и включить питание: по даташиту изменения вступают в силу после перезапуска.

Каждая запись — слово SMBus с контрольной суммой PEC: CRC-8 с полиномом x⁸ + x² + x + 1 (0x07) по байтам адреса с битом записи, команды и двух байтов данных. Неверный PEC датчик отвергает. Сумму можно проверить в калькуляторе CRC.

// SMBus PEC for MLX90614: CRC-8, polynomial x^8 + x^2 + x + 1 (0x07), init 0
uint8_t pec(const uint8_t *d, uint8_t n) {
  uint8_t crc = 0;
  for (uint8_t i = 0; i < n; i++) {
    crc ^= d[i];
    for (uint8_t b = 0; b < 8; b++) crc = (crc & 0x80) ? (crc << 1) ^ 0x07 : crc << 1;
  }
  return crc;
}
// Write word: SA<<1 | 0, command 0x2E, data LSB, data MSB, then PEC over those four bytes

Ограничения общей шины

Ограничение по даташитуЧто сделать
Частота SMBus — 10–100 кГцшину с MLX90614 не разгонять до 400 кГц
У 5-вольтовых версий стабилитрон на SCL даёт провал (undershoot) около 15 мксна шине с другими ведомыми брать версии на 3 В
Адрес хранится в EEPROM, ресурс 100 000 записейменять адрес один раз, а не при каждом старте

Подтяжки для двух датчиков и проводов подбирают по ёмкости шины; как устроены отличия SMBus от I²C, разобрано в словаре. Если у датчика адрес не меняется вовсе, помогают решения из ответа «Два одинаковых датчика I²C». Остальное о подключении MLX90614 — в статье «ИК-термометр MLX90614 и тепловизор MLX90640».

Похожие вопросы

Что будет, если подключить оба датчика сразу и записать адрес?

Оба ответят на 0x5A и оба запишут новый адрес — снова получится два одинаковых. Поэтому на время смены адреса на шине должен быть только один MLX90614: второй либо отключают, либо не подают ему питание, но тогда его выводы надо отсоединить от шины — обесточенный датчик через свои диоды нагружает SDA и SCL.

Почему новый адрес не работает сразу после записи?

Melexis в порядке записи EEPROM последним шагом указывает выключение питания: изменения вступают в силу при следующем включении. Пока датчик не перезапущен, он продолжает отвечать на старый адрес.

Можно ли так поставить на шину MLX90614 и датчик на 400 кГц?

Можно, но частоту шины придётся снизить до 100 кГц — предела SMBus MLX90614. Если другому датчику важна скорость, проще развести их по разным шинам: у ESP32 и STM32 обычно не одна шина I²C.

Источники

  1. Melexis. MLX90614 Family Single and Dual Zone Infra Red Thermometer in TO-39, Datasheet Rev 021 (02-Jun-2026) — табл. 5 и 7: адрес SA по умолчанию 5Ah; ресурс EEPROM 100 000 циклов при 25 °C, стирание и запись ячейки — по 5 мс; табл. 8: ячейка EEPROM 0x0E — адрес SMBus (значим только младший байт), доступна для записи; разд. 4.1.3.3.1: порядок записи — включить, записать 0x0000 (стереть), подождать не меньше 5 мс (надёжнее 10), прочитать и сравнить, записать новое значение, подождать, прочитать, выключить питание, чтобы изменения вступили в силу при следующем включении; разд. 4.1.4: SMBus 10–100 кГц, адрес 7-битный, до 127 устройств, 0x00 — общий вызов; запись доступна в 9 ячеек EEPROM, в том числе 0x0E; PEC — CRC-8 с полиномом x⁸ + x² + x + 1 по всем битам, кроме START, STOP, ACK и NACK; табл. 15: код команды 001x xxxx — доступ к EEPROM; разд. 4.1.4.3.13: у 5-вольтовых версий встроенный стабилитрон на SCL даёт провал (undershoot) около 15 мкс, который может мешать другим ведомым на шине; разд. 5.1: у MLX90614 диоды между SDA, SCL и VDD, поэтому обесточенный датчик на шине с другими устройствами нагружает её; разд. 5.2: до 127 датчиков на двух проводах
  2. NXP. UM10204 I2C-bus specification and user manual (Rev. 7.0, 1 October 2021) — 7-битный адрес ведомого передаётся первым байтом вместе с битом направления R/W; режимы Standard-mode до 100 кбит/с и Fast-mode до 400 кбит/с

Нашли ошибку?