9.8 KiB
DS18B20 через DS2480B
Переносимая библиотека C99: поиск DS18B20 на общей шине, температура, разрешение 9–12 бит, TH/TL и сохранение в EEPROM через UART-мост DS2480B. Поддерживаются внешнее и паразитное питание: преобразование и запись EEPROM используют strong pullup, включаемый мостом сразу после последнего бита команды.
Ядро не зависит от HAL, CMSIS, ОС или существующей GPIO-библиотеки ds18b20.
Динамической памяти и глобального состояния нет. Каждый UART-мост имеет свой
ds2480, каждый обход — свой ds2480_search.
Приложение → ds18b20_ds2480 → ds2480 → callbacks UART/задержки → платформа
Файлы
| Файл | Назначение | Зависимости |
|---|---|---|
ds2480.h, ds2480.c |
Калибровка, reset, обмен битами/байтами, поиск ROM, CRC, strong pullup | stdint.h, callbacks |
ds18b20_ds2480.h, ds18b20_ds2480.c |
Команды термометра, проверка scratchpad, знаковая температура | ds2480, string.h |
examples/read_first.c |
Полный цикл для первого найденного DS18B20 | ядро, порт приложения |
tests/test_ds18b20_ds2480.c |
Модель UART-моста и нескольких устройств 1-Wire | ядро, стандартная библиотека C |
Контракт порта
int prepare(void *user);
int write(void *user, const uint8_t *data, uint32_t size, uint32_t timeout_ms);
int read(void *user, uint8_t *data, uint32_t size, uint32_t timeout_ms);
void delay_ms(void *user, uint32_t ms);
Первые три callbacks возвращают 0 при успехе, иначе ошибку.
prepare аппаратно сбрасывает DS2480B или формирует UART BREAK не короче 2 мс,
настраивает 9600 бод, 8N1, выдерживает минимум 2 мс после сброса и очищает RX
и ошибки UART. Эта функция должна иметь собственный конечный таймаут.
Нельзя просто посылать C1 работающему мосту вместо сброса.
write передаёт ровно size байтов и ждёт окончания передачи; read получает
ровно size байтов. Обе операции ограничены timeout_ms; при частичном обмене
возвращается ошибка. Приём должен работать уже во время передачи: ответ может
появиться до вызова read. delay_ms не должна возвращаться раньше заданного
времени (учтите округление системного тика).
Управлять одним UART извне одновременно с библиотекой нельзя. В RTOS блокировка нужна на всю операцию верхнего уровня, включая поиск и ожидание преобразования. Тайминги 1-Wire формирует мост, запрещать прерывания на время слотов не требуется.
Быстрый старт
Функции prepare, write, read, delay_ms и uart_context предоставляет плата.
Следующий код располагается внутри функции приложения:
ds2480 bus;
ds2480_search search = {{0}, 0, 0};
ds2480_port port = {uart_context, prepare, write, read, delay_ms};
int16_t raw;
ds2480_status status = ds2480_init(&bus, &port, 20);
if (status != DS2480_OK) return;
status = ds18b20_ds2480_next(&bus, &search);
if (status != DS2480_OK) return;
status = ds18b20_ds2480_convert(&bus, search.rom);
if (status != DS2480_OK) return;
status = ds18b20_ds2480_temperature(&bus, search.rom, &raw);
if (status != DS2480_OK) return;
float celsius = raw / 16.0f;
(void)celsius;
Вызывайте next повторно с тем же курсором до DS2480_DONE, сохраняя каждый
найденный ROM в памяти приложения. Лимита количества датчиков в ядре нет.
Пустая шина возвращает DS2480_NO_PRESENCE; обрыв поиска и ошибки CRC не
маскируются под успешное завершение. Для нового обхода обнулите курсор.
convert(bus, NULL) одновременно запускает все устройства — допустимо только
на шине исключительно с DS18B20. Затем читайте каждое по ROM. Для паразитного
питания суммарный ток должен укладываться в возможности моста; при необходимости
преобразуйте по одному датчику. Преобразование блокирует вызов на 750 мс плюс
UART-обмен. EEPROM использует выдержку 12 мс, её содержимое после перезапуска
этой функцией не проверяется. Чтение температуры само преобразование не запускает.
Значение 85 °C после включения нельзя отличить от настоящих 85 °C без завершённого
преобразования; не считайте его заведомой ошибкой.
Ошибки и ограничения
IO— таймаут/ошибка порта,PROTOCOL— неожиданный ответ DS2480B. После них экземпляр не готов к работе: повторитеds2480_init.SHORT— короткое замыкание,NO_PRESENCE— нет presence.CRC— неверная контрольная сумма,DATA— недопустимые данные или неподтверждённая запись. Выход температуры/scratchpad при ошибке не меняется.- При ошибке во время strong pullup ядро вызывает
prepare, чтобы прекратить импульс, и остаётся неготовым. При отказе самого порта снятие питания гарантировать невозможно; восстановление UART/моста остаётся задачей приложения.
Используется стандартная скорость 1-Wire и только Command Mode: байт передаётся
восьмью командами Single Bit. Поэтому любые значения, включая E3, передаются
без экранирования. Это простая реализация для опроса температуры; повышенные
скорости UART, Overdrive и Search Accelerator пока не реализованы. Параметры
таймингов длинной линии остаются заводскими. Аппаратная проверка обязательна
для выбранной топологии/нагрузки. Протокол проверен по документации DS2480B;
старые ревизии DS2480 без суффикса B отдельно не проверялись.
Подключение и тесты
Добавьте ds2480.c, ds18b20_ds2480.c и путь к заголовкам в сборку прошивки.
Номер UART, GPIO и библиотеку платформы выбирает приложение. Готовый порт
для конкретной платы пока не входит в библиотеку.
set(DS18B20_DS2480_BUILD_TESTS OFF CACHE BOOL "" FORCE)
add_subdirectory(third_party/templates/c/ds18b20-ds2480)
target_link_libraries(firmware PRIVATE ds18b20_ds2480)
Отдельная сборка хостовых тестов:
cmake -S . -B build
cmake --build build --config Debug
ctest --test-dir build -C Debug --output-on-failure
Без CMake, из каталога библиотеки:
clang -std=c99 -Wall -Wextra -Wpedantic -Werror -I . ds2480.c ds18b20_ds2480.c tests/test_ds18b20_ds2480.c -o build/test.exe
./build/test.exe
Тесты моделируют калибровку без ответа, несколько ROM с развилками, другие семейства, адресацию, все разрешения, отрицательную температуру, CRC, пустую и замкнутую шину, ошибки транспорта, strong pullup и восстановление после ошибок. Это программная модель; испытания на физическом DS2480B пока не проводились.
Использование
Добавлена в сабмодуль templates проекта john103C6T6NewVer, ветка ds2480.
В рабочую прошивку ещё не включена: для этого требуется порт выбранного UART.