2023-07-08 19:29:07 +03:00

75 lines
1.2 KiB
C

#include "onewire.h"
uint8_t OneWire_Presence(void) {
uint8_t is_detected = 0;
cli();
ow_pull();
_delay_us(480);
ow_release();
_delay_us(70);
if (bit_is_clear(OW_PIN, OW_LINE)) is_detected = 1;
_delay_us(410);
sei();
return is_detected;
}
void OneWire_WriteByte(uint8_t byte) {
uint8_t i = 8;
while (i--) {
cli();
if (byte & 0x01) {
ow_pull();
_delay_us(6);
ow_release();
_delay_us(64);
} else {
ow_pull();
_delay_us(60);
ow_release();
_delay_us(10);
}
sei();
byte >>= 1;
}
}
uint8_t OneWire_ReadByte() {
uint8_t byte = 0;
uint8_t i = 8;
while (i--) {
cli();
byte >>= 1;
ow_pull();
_delay_us(6);
ow_release();
_delay_us(9);
if (bit_is_set(OW_PIN, OW_LINE)) byte |= (1<<7);
_delay_us(55);
sei();
}
return byte;
}
uint8_t OneWire_SkipROM() {
if (!OneWire_Presence()) return 0;
OneWire_WriteByte(ONE_WIRE_SKIPROM);
return 1;
}
uint8_t OneWire_ReadROM(uint8_t *buffer) {
if (!OneWire_Presence()) return 0;
uint8_t p = 0;
OneWire_WriteByte(ONE_WIRE_READROM);
while (p < 8) {
*(buffer++) = OneWire_ReadByte();
p++;
}
return 1;
}