Interfaces de 1 cable

1

Me pregunto sobre la experiencia de los usuarios en este sitio con la interfaz 1-Wire en cuanto a fiabilidad en las comunicaciones y facilidad de uso.

Desde mi perspectiva, el problema principal que veo es la falta de módulos nativos de 1-Wire en los microcontroladores, lo que significa que debe hacerse en software con algunos temporizadores. Incluso lo he usado un poco con los FPGA utilizando el propio módulo sintetizable FPGA de 1 cable , pero los resultados fueron bastante horrendos, ya que no funcionó y terminé usando una solución de software (que requiere una sincronización cuidadosa). Tal vez el uso de un temporizador real con captura / comparación hubiera facilitado algunas cosas.

Entonces, desde tu perspectiva:

1) ¿Ha sido confiable y útil en tus proyectos?

2) ¿Cómo implementó la interfaz de comunicaciones?

Cualquier consejo / truco que facilite su uso sería muy apreciado.

    
pregunta Gustavo Litovsky

2 respuestas

5

También he tenido una mala experiencia con 1 cable. 1 cable funciona mal en presencia de EMI **.

En mi humilde opinión, el único nicho razonable para aplicaciones de 1 cable es donde cada cable y pin de conector es muy valioso, y una velocidad de comunicación lenta es aceptable. Por lo general, estos son productos de bajo costo y alto volumen, por ejemplo: aplicadores médicos desechables, cartuchos de tinta de impresora, mallas de periféricos cableados en números no triviales.

En general, no veo un punto para elegir 1 cable sobre I 2 C, cuando los periféricos están en la misma PCB que el maestro. El cableado es asequible dentro de PCB.

Hay I 2 C to 1-wire bridge Circuitos integrados, que pueden asumir una carga de bajo nivel del controlador principal.

** I 2 C tampoco es el bus más resistente a EMI. Sin embargo, I 2 C funciona mejor que 1 cable en presencia de EMI.

    
respondido por el Nick Alexeev
4

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
    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas