#pragma once #ifndef DS2482_HAL_H #define DS2482_HAL_H #define DS2482_TIMEOUT_1W 100 //timeout in ms for 1-wire operations #define DS2482_TIMEOUT_I2C 100 //timeout in ms for I2C operations #ifdef STM32F3 #include "stm32f3xx_hal.h" #elifdef STM32F4 #include "stm32f4xx_hal.h" #elifdef STM32H7 #include "stm32h7xx_hal.h" #else #error "No target defined" #endif static_assert (DS2482_TIMEOUT_1W < UINT16_MAX, "DS2482_TIMEOUT_1W must be less than 65535"); static_assert (DS2482_TIMEOUT_I2C < UINT32_MAX, "DS2482_TIMEOUT_I2C must be less than 4294967295"); static_assert (DS2482_TIMEOUT_1W > 0, "DS2482_TIMEOUT_1W cannot be negative"); static_assert (DS2482_TIMEOUT_I2C > 0, "DS2482_TIMEOUT_I2C cannot be negative"); #define nag_attr [[nodiscard("Check status for errors!")]] typedef struct { I2C_HandleTypeDef* hi2c; uint16_t address; } ds2482_t; #define ds2482_create(hi2c, address) ((constexpr ds2482_t){.hi2c = hi2c, .address = address}) nag_attr HAL_StatusTypeDef ds2482_init(ds2482_t * const ds2482); nag_attr HAL_StatusTypeDef ds2482_reset(ds2482_t * const ds2482); nag_attr HAL_StatusTypeDef ds2482_write_config(ds2482_t * const ds2482, uint8_t config); nag_attr HAL_StatusTypeDef ds2482_set_read_ptr(ds2482_t * const ds2482, uint8_t read_ptr); nag_attr HAL_StatusTypeDef ds2482_1w_reset(ds2482_t * const ds2482, bool * const presence); nag_attr HAL_StatusTypeDef ds2482_1w_write_byte(ds2482_t * const ds2482, uint8_t byte); nag_attr HAL_StatusTypeDef ds2482_1w_read_byte(ds2482_t * const ds2482, uint8_t * const byte); nag_attr HAL_StatusTypeDef ds2482_1w_read_bit(ds2482_t * const ds2482, bool * const bit); nag_attr HAL_StatusTypeDef ds2482_1w_write_bit(ds2482_t * const ds2482, bool bit); nag_attr HAL_StatusTypeDef ds2482_1w_triplet(ds2482_t * const ds2482, uint8_t dir); nag_attr HAL_StatusTypeDef ds2482_1w_search(ds2482_t * const ds2482, uint16_t max_devices, uint64_t devices[static max_devices]); nag_attr HAL_StatusTypeDef ds2482_1w_verify_device(ds2482_t * const ds2482, uint64_t device, bool * const present); //helper functions #define DS2482_1W_ROM_MATCH 0x55 #define DS2482_1W_ROM_SKIP 0xCC nag_attr static inline HAL_StatusTypeDef ds2482_1w_select_device(ds2482_t * const ds2482, uint64_t device) { bool present; HAL_StatusTypeDef status = ds2482_1w_reset(ds2482, &present); if (status != HAL_OK) return status; if (!present) return HAL_ERROR; status = ds2482_1w_write_byte(ds2482, DS2482_1W_ROM_MATCH); if (status != HAL_OK) return status; for (int i = 0; i < 8; i++) { status = ds2482_1w_write_byte(ds2482, (device >> (i * 8)) & 0xFF); if (status != HAL_OK) return status; } return HAL_OK; } nag_attr static inline HAL_StatusTypeDef ds2482_1w_select_all(ds2482_t * const ds2482) { bool present; HAL_StatusTypeDef status = ds2482_1w_reset(ds2482, &present); if (status != HAL_OK) return status; if (!present) return HAL_ERROR; return ds2482_1w_write_byte(ds2482, DS2482_1W_ROM_SKIP); } nag_attr static inline HAL_StatusTypeDef ds2482_1w_send_command(ds2482_t * const ds2482, uint64_t device, uint8_t command) { HAL_StatusTypeDef status = ds2482_1w_select_device(ds2482, device); if (status != HAL_OK) return status; return ds2482_1w_write_byte(ds2482, command); } nag_attr static inline HAL_StatusTypeDef ds2482_1w_send_command_all(ds2482_t * const ds2482, uint8_t command) { HAL_StatusTypeDef status = ds2482_1w_select_all(ds2482); if (status != HAL_OK) return status; return ds2482_1w_write_byte(ds2482, command); } #undef nag_attr #undef DS2482_1W_ROM_MATCH #undef DS2482_1W_ROM_SKIP #endif // DS2482_HAL_H