No, no necesita una biblioteca propietaria para bitbanging onewire. El siguiente código es de una aplicación para AVR µC Lo hice hace algunos años . Si utilizó otra familia µC, es posible que tenga que implementar las funciones especiales de Onewire / iButton crc usted mismo.
No necesitas mucho más para comunicarte con un chip esclavo onewire. La función OwReadROM () es la única que necesitaba para mi aplicación, pero puedes escribir fácilmente funciones para activar una conversión de temperatura y leer el resultado en función de eso.
Para la parte de USB, use V-USB como lo hice (solo USB1.1 de baja velocidad) o un µC habilitado para USB.
#include <avr/io.h>
#include <util/delay.h> /* for _delay_ms() */
#include <util/crc16.h> /* for _crc_ibutton_update() */
/*
* Onewire host functions.
*/
static inline void owClear(void) {
DDRB |= (1 << PB0);
PORTB &= ~(1 << PB0);
}
static inline void owSet(void) {
PORTB |= (1 << PB0);
DDRB &= ~(1 << PB0);
}
static inline uchar owGet(void) {
return ((PINB & (1 << PB0)) == 0);
}
/* Onewire idle load function. */
void owIdleLoad(void) {
/* Release OW line from master. */
owSet();
/* Wait 20ms to allow slaves load their power capacitor. */
_delay_ms(20);
}
/* Onewire transfer reset */
uchar owReset(void) {
uchar sample;
/* Reset all slaves. */
owClear();
_delay_ms(0.7);
/* Release OW line from master. */
owSet();
_delay_ms(0.04);
/* Check presence pulse from slave(s). */
sample = owGet();
/* Wait until slaves release OW line, max. 240µs. */
_delay_ms(0.24);
/* Return whether some device was present on onewire. */
return sample;
}
/* Read a single bit from onewire. */
static uchar owReadBit(void) {
uchar sample;
/* Send bit marker. */
owClear();
_delay_us(1);
owSet();
_delay_us(10);
/* Check if a slave keeps pulled the OW line low. */
sample = owGet();
/* Wait until slaves release OW line, max. 120µs. */
_delay_us(120);
/* Return bit from slave. */
return (sample?0:0x80);
}
/* Read a byte from onewire. */
uchar owReadByte(void) {
uchar data;
data=owReadBit();
data>>=1;
data|=owReadBit();
data>>=1;
data|=owReadBit();
data>>=1;
data|=owReadBit();
data>>=1;
data|=owReadBit();
data>>=1;
data|=owReadBit();
data>>=1;
data|=owReadBit();
data>>=1;
data|=owReadBit();
return data;
}
/* Write a bit to onewire. */
static void owWriteBit(uchar bit) {
/* Start bit marker. */
owClear();
_delay_us(1);
/* If bit should be 1, immediately release OW line. */
if (bit & 0x01) {
/* Release OW line. */
owSet();
/* Wait 60µs. */
_delay_us(60);
} else {
/* Wait 60µs. */
_delay_us(60);
/* Release OW line. */
owSet();
}
}
/* Write a byte to onewire. */
void owWriteByte(uchar data) {
owWriteBit(data);
data>>=1;
owWriteBit(data);
data>>=1;
owWriteBit(data);
data>>=1;
owWriteBit(data);
data>>=1;
owWriteBit(data);
data>>=1;
owWriteBit(data);
data>>=1;
owWriteBit(data);
data>>=1;
owWriteBit(data);
}
/* Read ROM onewire command. */
uchar owReadROM(void) {
uchar i, crc;
/* Onewire reset. */
if (owReset() == 0) {
/* No slave present. Fail. */
return 0;
}
/* Read ROM for DS2400 and DS2401. Other slaves will ignore this command. */
//owWriteByte(0x0f);
owWriteByte(0x33);
/* Read 8 bytes answer from OW slave. */
crc = 0;
for (i = 0; i < 8; i++) {
iButtonBuffer[i] = owReadByte();
crc = _crc_ibutton_update(crc,iButtonBuffer[i]);
}
/* Remember the iButton ID is valid. */
iButtonBufferValid = (crc == 0);
/* Success if crc is 0. */
return iButtonBufferValid;
}