STM32-DS2482-HAL/DS2482_HAL.h

91 lines
3.6 KiB
C

#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