Solo una vez hice algo con un bus de 1 cable, y eso fue para construir una plantilla de prueba que se conectó a un equipo existente que contenía una EEPROM de 1 cable. Esta plantilla debía, entre otras cosas, leer y escribir la EEPROM.
Todo acaba de funcionar como lo recuerdo. Por supuesto, antes de escribir cualquier código, leí cuidadosamente la especificación de 1 cable de Dallas y la hoja de datos de la parte en particular. Después de comprender el bus de 1 cable, las capas de firmware para implementar el protocolo se hacen evidentes. Nuevamente, no hubo sorpresas, y todo funcionó como se esperaba. Incluso terminé con un código de host que podía enumerar todos los dispositivos en el bus de 1 cable.
No recorrería largas distancias con 1 cable, pero parece funcionar bien para lo que está destinado. Como con la mayoría de las cosas, lea la hoja de datos , y el resto es solo una implementación.
Añadido:
En respuesta a un comentario a continuación, volví y comprobé cómo se implementó exactamente el momento en este caso. El procesador era un PIC 18 y la sincronización se realizó apagando las interrupciones temporalmente y ejecutando un número controlado de instrucciones. En este sistema en particular, había un montón de poder de procesamiento e interrupciones que se apagaban ocasionalmente durante unos pocos segundos de microsegundos era aceptable. Ese puede no ser el caso con otras implementaciones. Cada caso debe ser pensado por separado.
Aquí están las rutinas críticas para leer y escribir bits individuales. Solo estas dos rutinas y la rutina de reinicio del bus desactivaron las interrupciones e hicieron una sincronización crítica. Todo lo demás era firmware por encima de esta capa de bajo nivel, como leer y escribir bytes enteros y enumerar los dispositivos de bus.
;*******************************************************************************
;
; Subroutine WIRE1_WRBIT
;
; Write a single bit to the 1-wire bus. The bit value is taken from the low
; bit of REG0. All FSRs are preserved.
;
glbsub wire1_wrbit, noregs
intr_off ;temp disable interrupts for accurate timing
bus_low ;start the write slot
btfsc reg0, 0 ;bit value is 0 ?
jump write1 ;bit value is 1
;
; The bit value is 0.
;
wait_us 62, 3 ;hold bus low for 62 us
bus_high
intr_on ;re-enable interrupts
wait_us 2, 6 ;leave high for at least 2 us
jump write_leave
;
; The bit value is 1.
;
write1 unbank
wait_us 2, 4 ;hold low for 2 us
bus_high
intr_on ;re-enable interrupts
wait_us 60, 4 ;leave high rest of bit time
write_leave unbank ;common exit point
leaverest
;*******************************************************************************
;
; Subroutine WIRE1_RDBIT
;
; Read a single bit from the 1-wire bus. The bit value is returned in the
; high bit of REG0. The remaining bits of REG0 are not altered. All FSRs are
; preserved.
;
glbsub wire1_rdbit, noregs
intr_off ;temp disable interrupts for accurate timing
bus_low ;start the read slot
wait_us 2, 1 ;hold bus low for 2 us to indicate read slot
bus_high ;let the device drive the bus
wait_us 10, 2 ;wait for reply from device to be stable
bcf reg0, 7 ;init returned data bit to 0
dbankif wire1_reg
btfsc wire1_reg, wire1_bit ;data bit is 0 ?
bsf reg0, 7 ;no, set returned bit to 1
intr_on ;re-enable interrupts
wait_us 50, 4 ;guarantee minimum bit time of 62 us
leaverest