146 lines
9.8 KiB
Markdown
146 lines
9.8 KiB
Markdown
# DS18B20 через DS2480B
|
|
|
|
Переносимая библиотека C99: поиск DS18B20 на общей шине, температура,
|
|
разрешение 9–12 бит, TH/TL и сохранение в EEPROM через UART-мост DS2480B.
|
|
Поддерживаются внешнее и паразитное питание: преобразование и запись EEPROM
|
|
используют strong pullup, включаемый мостом сразу после последнего бита команды.
|
|
|
|
Ядро не зависит от HAL, CMSIS, ОС или существующей GPIO-библиотеки `ds18b20`.
|
|
Динамической памяти и глобального состояния нет. Каждый UART-мост имеет свой
|
|
`ds2480`, каждый обход — свой `ds2480_search`.
|
|
|
|
```text
|
|
Приложение → 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 |
|
|
|
|
## Контракт порта
|
|
|
|
```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` предоставляет плата.
|
|
Следующий код располагается внутри функции приложения:
|
|
|
|
```c
|
|
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 и библиотеку платформы выбирает приложение. Готовый порт
|
|
для конкретной платы пока не входит в библиотеку.
|
|
|
|
```cmake
|
|
set(DS18B20_DS2480_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
|
add_subdirectory(third_party/templates/c/ds18b20-ds2480)
|
|
target_link_libraries(firmware PRIVATE ds18b20_ds2480)
|
|
```
|
|
|
|
Отдельная сборка хостовых тестов:
|
|
|
|
```sh
|
|
cmake -S . -B build
|
|
cmake --build build --config Debug
|
|
ctest --test-dir build -C Debug --output-on-failure
|
|
```
|
|
|
|
Без CMake, из каталога библиотеки:
|
|
|
|
```sh
|
|
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.
|
|
|
|
## Источники
|
|
|
|
- [DS2480B datasheet, таблицы команд и ответов](https://www.analog.com/media/en/technical-documentation/data-sheets/ds2480b.pdf)
|
|
- [DS18B20 datasheet, команды, питание и scratchpad](https://www.analog.com/media/en/technical-documentation/data-sheets/ds18b20.pdf)
|