0hmX/dual-usb-peltier-assembly
A complete USB‑C PD Peltier controller assembly featuring an RP2040, adjustable TPS55289 buck‑boost TEC driver, 12 V fan supply, temperature-sensor inputs, USB programming, protection, status LEDs, and supporting passives/connectors.
- Version
- 0.4.7
- License
- unset
- Stars
- 0
firmware/src/onewire.c
#include "temperature.h"
#include "pico/stdlib.h"
#include "hardware/sync.h"
/* GPIO output latch is always LOW: direction controls the open-drain bus.
* External 4.7 k pull-ups supply HIGH; never drive a probe line HIGH. */
static void low(unsigned pin) { gpio_set_dir(pin, GPIO_OUT); }
static void release(unsigned pin) { gpio_set_dir(pin, GPIO_IN); }
void pd_onewire_init(unsigned pin) {
gpio_init(pin); gpio_put(pin, false); release(pin); gpio_disable_pulls(pin);
}
static pd_temp_status reset(unsigned pin) {
release(pin); busy_wait_us_32(5);
if (!gpio_get(pin)) return PD_TEMP_BUS;
low(pin); busy_wait_us_32(500); /* IRQs remain enabled during reset LOW. */
uint32_t interrupts = save_and_disable_interrupts();
release(pin); busy_wait_us_32(70);
bool presence = !gpio_get(pin);
restore_interrupts(interrupts);
busy_wait_us_32(410); /* At least 480 us HIGH before the next slot. */
if (!gpio_get(pin)) return PD_TEMP_BUS;
return presence ? PD_TEMP_OK : PD_TEMP_MISSING;
}
static void write_bit(unsigned pin, bool bit) {
uint32_t interrupts = save_and_disable_interrupts();
low(pin); busy_wait_us_32(bit ? 6u : 65u); release(pin);
restore_interrupts(interrupts);
busy_wait_us_32(bit ? 64u : 5u);
}
static bool read_bit(unsigned pin) {
uint32_t interrupts = save_and_disable_interrupts();
low(pin); busy_wait_us_32(2); release(pin); busy_wait_us_32(10);
bool bit = gpio_get(pin);
restore_interrupts(interrupts);
busy_wait_us_32(58);
return bit;
}
static void write(unsigned pin, uint8_t byte) {
for (unsigned bit = 0; bit < 8; ++bit) { write_bit(pin, byte & 1u); byte >>= 1; }
}
static uint8_t read(unsigned pin) {
uint8_t byte = 0;
for (unsigned bit = 0; bit < 8; ++bit) if (read_bit(pin)) byte |= (uint8_t)(1u << bit);
return byte;
}
const pd_temp_bus pd_onewire_bus = {.reset = reset, .write = write, .read = read, .read_bit = read_bit};