Как подключить два MLX90614 к одной шине I²C?
Обновлено Редакция GAW
С завода у всех MLX90614 одинаковый адрес на шине SMBus — 0x5A. Melexis хранит адрес в EEPROM, в ячейке 0x0E, и разрешает его менять, так что на двух проводах можно держать до 127 датчиков. Схема смены адреса та же, что и у любой ячейки EEPROM в разделе 4.1.3.3.1 даташита.
Порядок смены адреса
- Подключить к шине только тот датчик, адрес которого меняем, и включить питание.
- Прочитать ячейку командой 0x2E (префикс доступа к EEPROM 001x xxxx плюс адрес ячейки 0x0E) — пригодится для проверки.
- Записать 0x0000 — это стирание ячейки, — подождать не меньше 5 мс, надёжнее 10, и прочитать ячейку: там должен быть 0x0000.
- Записать новое значение: младший байт — новый адрес, например 0x5B, старший — как был прочитан, потому что по таблице EEPROM значим только младший. Снова подождать 10 мс.
- Прочитать ячейку и сравнить, затем выключить и включить питание: по даташиту изменения вступают в силу после перезапуска.
Каждая запись — слово 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.
Источники
- 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 датчиков на двух проводах
- NXP. UM10204 I2C-bus specification and user manual (Rev. 7.0, 1 October 2021) — 7-битный адрес ведомого передаётся первым байтом вместе с битом направления R/W; режимы Standard-mode до 100 кбит/с и Fast-mode до 400 кбит/с
Нашли ошибку?
Смотрите также
- ИК-термометры MLX90614 и MLX90640Излучательная способность, поле зрения и пятно, MLX90614 по SMBus, матрица MLX90640 32 × 24
- SMBusШина на основе I²C: таймаут, пороги, PEC
- Калькулятор CRCCRC-8, CRC-16, CRC-32, Modbus, блок CRC STM32, код на C
- Как подключить два одинаковых датчика I2C к одной шине?Вывод выбора адреса, коммутатор TCA9548A или вторая шина I2C
- Какую версию MLX90614 выбрать?Буквы кода: питание (A, B, D), зоны и компенсация (A, B, C), поле зрения (A, C, F, H, I, K)