Как узнать, какой из нескольких DS18B20 на линии какой?
Обновлено Редакция GAW
У DS18B20 нет адреса, который задают выводами, как у датчиков I2C. Вместо него на заводе в каждый датчик записан уникальный 64-битный код — по нему мастер и выбирает, с кем говорить на общей линии 1-Wire.
Устройство кода ROM
| Байты | Содержимое |
|---|---|
| младший байт | код семейства 28h — это DS18B20 |
| следующие 6 байт | серийный номер, 48 бит |
| старший байт | CRC от первых 56 бит |
Если CRC прочитанного кода не сходится, код прочитан с ошибкой. Посчитать CRC для проверки можно в калькуляторе 1-Wire.
Как сопоставить коды с датчиками
- По одному. Подключайте датчики к линии по очереди и читайте код командой Read ROM [33h], подписывая каждый.
- Все сразу. Командой Search ROM [F0h] найдите все коды, затем грейте датчики по очереди рукой и смотрите, у какого кода растёт температура.
- Запишите коды в программу и обращайтесь к датчику командой Match ROM [55h] с его кодом.
Цена адресации
Обращение по коду длиннее, чем ко всем сразу. Наш расчёт по минимальному тайм-слоту 60 мкс:
| Как обращаться | Бит после сброса | Время, не меньше |
|---|---|---|
| Skip ROM [CCh] — ко всем | 8 | около 0,5 мс |
| Match ROM [55h] + код | 8 + 64 = 72 | около 4,3 мс |
На фоне 750 мс преобразования при 12 битах это несущественно. Удобный приём — запустить преобразование у всех датчиков сразу через Skip ROM, а читать каждый по Match ROM. Если датчик вообще не находится, сначала проверьте импульс присутствия. Параметры и схемы подключения — в карточке DS18B20.
Похожие вопросы
Почему Read ROM возвращает мусор, когда датчиков несколько?
Read ROM рассчитана на одно устройство: по даташиту при нескольких датчиках они отвечают одновременно, и на линии получается их монтажное И. Прочитанный код, как правило, не проходит проверку CRC — так обычно и видно, что на линии больше одного устройства.
Изменится ли порядок датчиков после перезагрузки?
Порядок поиска определяется самими кодами, а не тем, где датчик стоит на линии, поэтому без изменений на линии он повторяется. Но если добавить или заменить датчик, номера в списке сдвинутся — поэтому в программе хранят коды, а не порядковые номера.
Можно ли записать в датчик свою метку?
Код ROM не меняется, но регистры TH и TL хранятся в EEPROM датчика и записываются командами Write Scratchpad [4Eh] и Copy Scratchpad [48h]. Если тревоги по температуре не используются, в эти два байта можно записать номер места установки.
Источники
- Maxim Integrated (Analog Devices). DS18B20 Programmable Resolution 1-Wire Digital Thermometer (19-7487, Rev 6, 7/19) — уникальный 64-битный код в ROM: младшие 8 бит — код семейства 28h, затем 48 бит серийного номера, старшие 8 бит — CRC от первых 56 бит (рис. 8); Search ROM [F0h] — поиск кодов всех устройств методом исключения, повторяется столько раз, сколько нужно; Read ROM [33h] — только при одном устройстве на линии, иначе ответы столкнутся; Match ROM [55h] с 64-битным кодом — отвечает только совпавший датчик; Skip ROM [CCh] — обращение ко всем сразу; TH и TL хранятся в EEPROM, запись через Write Scratchpad [4Eh] и Copy Scratchpad [48h]; длительность тайм-слота 60–120 мкс
- Microchip. AN1199: 1-Wire Communication with PIC Microcontroller (DS01199A, 2008) — протокол 1-Wire: обмен тайм-слотами, сброс и импульс присутствия; пример чтения 64-битного регистрационного номера — 8 бит CRC, 48 бит серийного номера и 8 бит кода семейства
Нашли ошибку?
Смотрите также
- DS18B20Датчик температуры 1-Wire: выводы, точность, 9–12 бит, паразитное питание
- 1-WireТайм-слоты, ROM-команды, поиск, CRC8, DS18B20, паразитное питание
- CRCЦиклический избыточный код для обнаружения ошибок
- Калькулятор 1-WireCRC ROM-кода, резистор подтяжки и длина линии, время обмена
- Импульс присутствия 1-WireОтвет устройств 1-Wire на импульс сброса