#ifndef DS2480_H #define DS2480_H #include #ifdef __cplusplus extern "C" { #endif typedef enum { DS2480_OK = 0, DS2480_DONE, DS2480_NO_PRESENCE, DS2480_SHORT, DS2480_IO, DS2480_PROTOCOL, DS2480_CRC, DS2480_ARGUMENT, DS2480_NOT_READY, DS2480_DATA } ds2480_status; /** Blocking UART callbacks: 0 = success, nonzero = error/timeout. * prepare resets the bridge (BREAK >= 2 ms or hardware reset), sets UART * to 9600 8N1, waits >= 2 ms after reset, clears RX/errors before returning. * write waits for physical TX completion; read receives exactly size bytes. * Both enforce timeout_ms. RX must remain enabled while transmitting. * delay_ms waits AT LEAST the requested duration. No callback may reenter. */ typedef struct { void *user; 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); } ds2480_port; /** One instance per UART/bridge; serialize access for the whole operation. */ typedef struct { ds2480_port port; uint32_t timeout_ms; uint8_t ready; } ds2480; /** Independent ROM search cursor. Zero-initialize before each enumeration. */ typedef struct { uint8_t rom[8]; uint8_t discrepancy; uint8_t done; } ds2480_search; /** Reset/calibrate DS2480B and verify configuration. Empty bus is allowed. * On IO/protocol errors call init again before further transactions. */ ds2480_status ds2480_init(ds2480 *bus, const ds2480_port *port, uint32_t timeout_ms); /** Standard-speed reset; distinguish short, empty bus and transport failure. */ ds2480_status ds2480_reset(ds2480 *bus); /** Exchange one slot (write 1 to read); received must be non-NULL. */ ds2480_status ds2480_bit(ds2480 *bus, uint8_t bit, uint8_t *received); /** Exchange a byte, LSB first, in command mode (eight UART transactions). */ ds2480_status ds2480_byte(ds2480 *bus, uint8_t value, uint8_t *received); /** Write a byte and start strong pullup immediately after its last slot. * Blocks for hold_ms (1..1000), then terminates the pulse and consumes reply. */ ds2480_status ds2480_power_byte(ds2480 *bus, uint8_t value, uint32_t hold_ms); /** CRC8 Dallas/Maxim. data must address size bytes (NULL allowed for size=0). */ uint8_t ds2480_crc8(const uint8_t *data, uint32_t size); /** Search ALL families. OK yields ROM with valid CRC; DONE ends enumeration. * Cursor changes only on success. After an error retry or zero it to restart. */ ds2480_status ds2480_search_next(ds2480 *bus, ds2480_search *search); #ifdef __cplusplus } #endif #endif