static bool _onewire_write_bit(int pin,
bool v) {
if (!_onewire_wait_for_bus(pin, 10))
return false;
if (v) {
taskENTER_CRITICAL();
gpio_write(pin,
0); // drive output low
sdk_os_delay_us(10);
gpio_write(pin,
1); // allow output high
taskEXIT_CRITICAL();
sdk_os_delay_us(55);
} else {
taskENTER_CRITICAL();
gpio_write(pin,
0); // drive output low
sdk_os_delay_us(65);
gpio_write(pin,
1); // allow output high
taskEXIT_CRITICAL();
}
sdk_os_delay_us(1);
return true;
}
static int _onewire_read_bit(int pin) {
int r;
if (!_onewire_wait_for_bus(pin, 10))
return -1;
taskENTER_CRITICAL();
gpio_write(pin, 0);
sdk_os_delay_us(2);
gpio_write(pin, 1); // let pin
float, pull up will raise
sdk_os_delay_us(11);
r = gpio_read(pin); // Must
sample within 15us of start
taskEXIT_CRITICAL();
sdk_os_delay_us(48);
return r;
}
|