Files
templates/c/ds18b20/include/onewire.h
Andrey Kruchinkin 873ac438f3 feat(ds18b20): термометры DS18B20 поверх программной 1-Wire
Перенесён из репозитория ds18b20, который подключался сабмодулем в
KONOR_ds18b20. История библиотеки осталась там; сюда пришло состояние
на момент переезда.

Ядро на C99 без stm32f10x.h и динамической памяти. Порт — пять функций
(Init, DelayUs, Reset, WriteBit, ReadBit); реализация для STM32F1 идёт
в комплекте в ports/stm32f1. Хостовые тесты на модели шины с виртуальными
датчиками проходят: tests/test_ds18b20.c.
2026-08-23 01:15:34 +03:00

150 lines
5.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file onewire.h
* @brief Программная шина 1-Wire на выводе с открытым стоком.
*
* Драйвер не зависит от типа датчика: он выдаёт тайминги, ищет ROM и считает
* CRC8. Работа с DS18B20 вынесена в ds18b20.c.
*
* Реализация разделена надвое:
* src/onewire.c переносимая часть - побайтовый обмен, CRC8, поиск ROM,
* MATCH ROM и SKIP ROM; ни регистров, ни задержек;
* ports/<платформа> пять функций, зависящих от железа: OneWire_Init,
* OneWire_DelayUs, OneWire_Reset, OneWire_WriteBit
* и OneWire_ReadBit.
*
* Чтобы перенести библиотеку на другой микроконтроллер, достаточно написать
* эти пять функций - остальное собирается как есть.
*/
#ifndef ONEWIRE_H
#define ONEWIRE_H
#include <stdint.h>
/** Размер идентификатора устройства 1-Wire в байтах. */
#define ONEWIRE_ROM_SIZE 8U
/**
* @brief Состояние обхода шины алгоритмом SEARCH ROM.
*
* Структура принадлежит вызывающему коду; параллельные обходы должны
* использовать разные экземпляры.
*/
typedef struct {
uint8_t rom[ONEWIRE_ROM_SIZE]; /**< Текущий найденный идентификатор. */
uint8_t last_discrepancy; /**< Позиция последней развилки, 1..64. */
uint8_t last_family_discrepancy; /**< Развилка внутри кода семейства. */
uint8_t last_device; /**< Признак завершённого обхода. */
} OneWire_Search;
/**
* @brief Настраивает вывод шины и счётчик циклов для микросекундных задержек.
*
* Вызывается один раз после инициализации тактирования системы.
*/
void OneWire_Init(void);
/**
* @brief Формирует импульс сброса и проверяет ответ устройств.
*
* @note На время выборки presence прерывания запрещаются примерно на 75 мкс;
* длительность самого импульса сброса на точность не влияет.
*
* @return 1, если хотя бы одно устройство выдало presence-импульс, иначе 0.
*/
uint8_t OneWire_Reset(void);
/**
* @brief Передаёт один бит в тайм-слоте записи.
*
* @param bit Передаваемое значение, отличное от нуля означает единицу.
*/
void OneWire_WriteBit(uint8_t bit);
/**
* @brief Считывает один бит в тайм-слоте чтения.
*
* @return Принятое значение бита: 0 или 1.
*/
uint8_t OneWire_ReadBit(void);
/**
* @brief Передаёт байт младшим битом вперёд.
*
* @param value Передаваемый байт.
*/
void OneWire_WriteByte(uint8_t value);
/**
* @brief Принимает байт младшим битом вперёд.
*
* @return Принятый байт.
*/
uint8_t OneWire_ReadByte(void);
/**
* @brief Передаёт блок байтов подряд без промежуточных сбросов.
*
* @param data Указатель на передаваемые байты.
* @param size Количество байтов.
*/
void OneWire_WriteBytes(const uint8_t *data, uint32_t size);
/**
* @brief Принимает блок байтов подряд.
*
* @param data Буфер приёмника.
* @param size Количество байтов.
*/
void OneWire_ReadBytes(uint8_t *data, uint32_t size);
/**
* @brief Считает CRC8 Dallas/Maxim с полиномом 0x8C.
*
* @param data Проверяемые байты.
* @param size Количество байтов.
* @return Значение CRC8; для блока вместе с контрольным байтом равно нулю.
*/
uint8_t OneWire_Crc8(const uint8_t *data, uint32_t size);
/**
* @brief Подготавливает состояние к новому полному обходу шины.
*
* @param search Состояние обхода, принадлежащее вызывающему коду.
*/
void OneWire_SearchInit(OneWire_Search *search);
/**
* @brief Находит следующий идентификатор на шине.
*
* @param search Состояние обхода, ранее подготовленное OneWire_SearchInit.
* @return 1, если поле rom содержит новый проверенный ROM, иначе 0.
*/
uint8_t OneWire_SearchNext(OneWire_Search *search);
/**
* @brief Адресует конкретное устройство командой MATCH ROM.
*
* @param rom Восьмибайтовый идентификатор устройства.
* @return 1 при наличии presence-импульса, иначе 0.
*/
uint8_t OneWire_SelectRom(const uint8_t *rom);
/**
* @brief Адресует все устройства шины командой SKIP ROM.
*
* @return 1 при наличии presence-импульса, иначе 0.
*/
uint8_t OneWire_SkipRom(void);
/**
* @brief Задерживает выполнение на заданное число микросекунд.
*
* Используется драйверами шины и модулем DS18B20 при ожидании EEPROM.
*
* @param microseconds Длительность задержки.
*/
void OneWire_DelayUs(uint32_t microseconds);
#endif /* ONEWIRE_H */