feat(ds18b20-ds2480): добавь порт F407 и асинхронную подтяжку

This commit is contained in:
2026-09-15 22:32:30 +03:00
parent df02070cc4
commit 3020de7e0c
7 changed files with 223 additions and 9 deletions

View File

@@ -10,6 +10,7 @@ static ds2480_status exchange(ds2480 *bus, uint8_t command, uint8_t *reply)
{
if (!bus || !reply) return DS2480_ARGUMENT;
if (!bus->ready) return DS2480_NOT_READY;
if (bus->power_active && command != 0xF1) return DS2480_BUSY;
if (bus->port.write(bus->port.user, &command, 1, bus->timeout_ms) ||
bus->port.read(bus->port.user, reply, 1, bus->timeout_ms))
return fault(bus, DS2480_IO);
@@ -29,6 +30,7 @@ ds2480_status ds2480_init(ds2480 *bus, const ds2480_port *port, uint32_t timeout
}
copy = *port; /* Also permit reinitialization with &bus->port. */
bus->ready = 0;
bus->power_active = 0;
bus->port = copy;
bus->timeout_ms = timeout_ms;
if (copy.prepare(copy.user) ||
@@ -89,11 +91,11 @@ ds2480_status ds2480_byte(ds2480 *bus, uint8_t value, uint8_t *received)
return DS2480_OK;
}
ds2480_status ds2480_power_byte(ds2480 *bus, uint8_t value, uint32_t hold_ms)
ds2480_status ds2480_power_begin(ds2480 *bus, uint8_t value)
{
uint8_t i, bit, reply, echoed = 0;
uint8_t i, bit, echoed = 0;
ds2480_status status;
if (!bus || !hold_ms || hold_ms > 1000) return DS2480_ARGUMENT;
if (!bus) return DS2480_ARGUMENT;
for (i = 0; i < 8; ++i) {
status = slot(bus, (uint8_t)((value >> i) & 1), (uint8_t)(i == 7), &bit);
if (status != DS2480_OK) {
@@ -103,15 +105,39 @@ ds2480_status ds2480_power_byte(ds2480 *bus, uint8_t value, uint32_t hold_ms)
}
echoed |= (uint8_t)(bit << i);
}
bus->port.delay_ms(bus->port.user, hold_ms);
bus->power_active = 1;
if (echoed != value) {
status = ds2480_power_end(bus);
return status == DS2480_OK ? DS2480_DATA : status;
}
return DS2480_OK;
}
ds2480_status ds2480_power_end(ds2480 *bus)
{
uint8_t reply;
ds2480_status status;
if (!bus) return DS2480_ARGUMENT;
if (!bus->ready) return DS2480_NOT_READY;
if (!bus->power_active) return DS2480_OK;
status = exchange(bus, 0xF1, &reply);
if (status == DS2480_OK && reply != 0xEC && reply != 0xEF)
status = fault(bus, DS2480_PROTOCOL);
if (status != DS2480_OK) (void)bus->port.prepare(bus->port.user);
if (status == DS2480_OK && echoed != value) return DS2480_DATA;
bus->power_active = 0;
return status;
}
ds2480_status ds2480_power_byte(ds2480 *bus, uint8_t value, uint32_t hold_ms)
{
ds2480_status status;
if (!hold_ms || hold_ms > 1000) return DS2480_ARGUMENT;
status = ds2480_power_begin(bus, value);
if (status != DS2480_OK) return status;
bus->port.delay_ms(bus->port.user, hold_ms);
return ds2480_power_end(bus);
}
uint8_t ds2480_crc8(const uint8_t *data, uint32_t size)
{
uint8_t crc = 0, bit;