Files
templates/c/ds18b20-ds2480/README.md

9.8 KiB
Raw Blame History

DS18B20 через DS2480B

Переносимая библиотека C99: поиск DS18B20 на общей шине, температура, разрешение 912 бит, 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.

Источники