El protocolo 1-Wire es un protocolo de comunicaciones de datos en serie de larga distancia, de un solo cable, semidúplex, bidireccional, de baja velocidad y baja potencia. Aunque este protocolo está clasificado como estándar de 1 cable, se requieren al menos dos cables en el bus estándar de 1 cable: uno para la fuente de datos y/o energía y otro para el retorno a tierra. Es posible que se requiera un cable adicional según el modo de suministro de energía.
Un estándar de 1 cable tiene una configuración maestra y esclava, donde solo puede haber un dispositivo maestro, una computadora o microcontrolador y múltiples dispositivos esclavos. Es posible conectar hasta 100 dispositivos esclavos de 1 hilo, con un bus estándar de 1 hilo. Sin embargo, a medida que se agregan dispositivos esclavos al bus, la búsqueda del dispositivo maestro puede tardar más.
Este protocolo no utiliza una señal de reloj. En cambio, los dispositivos esclavos se sincronizan internamente y con una señal del dispositivo maestro. El dispositivo maestro es el único responsable de las operaciones de lectura y escritura de los dispositivos esclavos, por lo que no pueden iniciar una transferencia de datos por sí solos. Lo que pueden hacer es indicar su presencia en el bus cuando se reinicia el maestro. Cada dispositivo maestro se identifica mediante una dirección de 64 bits, almacenada en la ROM de cada dispositivo esclavo de un cable.
Se trata de un estándar de comunicación serie de baja velocidad, con una velocidad de datos típica de 15,4 kbps. El bus se puede sobrecargar hasta una velocidad de datos máxima de 125 kbps. Las velocidades de datos en el protocolo de 1 cable son bajas en comparación con otros protocolos de comunicaciones de datos en serie estándar (como UART, I2C y SPI), pero el bus de 1 cable es extremadamente económico de producir y operar. Ofrece una implementación de hardware sencilla y un consumo de energía extremadamente bajo.
Aunque el hardware es simple, la implementación del software en el lado del microcontrolador es muy compleja. Y a pesar de su bajo consumo de energía, puede comunicar datos a distancias relativamente largas.
El protocolo 1-Wire lo utilizan sensores de temperatura, relojes en tiempo real, temporizadores, EEPROM y el popular iButton. La mayoría de estos dispositivos esclavos de 1 cable son productos de (lo que ahora es) Maxim Integrated.
Analicemos con más detalle.
¿Qué es el protocolo de 1 cable?
El protocolo 1-Wire es una interfaz de un solo cable para la comunicación de datos de baja velocidad en microcontroladores y computadoras. El protocolo opera en una única línea de datos sin señal de reloj. Es un protocolo de comunicación serie maestro-esclavo donde la comunicación de datos bidireccional semidúplex con múltiples esclavos es gestionada y controlada exclusivamente por un único maestro.
El bus estándar de 1 cable
El bus estándar de 1 hilo tiene al menos dos hilos. Una es la línea de datos y la otra es el retorno a tierra. Tanto el maestro como los esclavos tienen una conexión de drenaje abierto (colector abierto) a la línea de datos. Esta es la razón por la que una resistencia de 4,7 K normalmente tira de la línea de datos. Hay dos modos de alimentación posibles para dispositivos esclavos de 1 hilo: parásita y convencional.
En modo parásito, solo se debe rastrear la línea de datos y el retorno a tierra hasta el dispositivo esclavo de 1 cable. Si se utiliza el modo de alimentación convencional, se debe tender una línea de alimentación positiva adicional por cada esclavo de 1 cable conectado al bus.
Por tanto, el bus de 1 hilo de una PCB puede tener dos o tres líneas. La energía convencional con tres líneas en el bus de 1 cable es más confiable.
Parásito vs. energía convencional
Como se mencionó, los dispositivos esclavos de 1 cable se pueden alimentar tanto en modo parásito como convencional. Todos los dispositivos esclavos de 1 cable tienen tres terminales: VDD, GND y datos. En modo parásito, los pines VDD y GND están conectados a tierra, por lo que la señal y la energía se suministran a los dispositivos esclavos en la misma línea (es decir, la línea de datos).
Los dispositivos esclavos tienen un condensador interno de 800 pF, que se carga cuando la línea de datos está en nivel ALTO. La carga almacenada mantiene al esclavo activo cuando la línea de datos está BAJA. La línea de datos normalmente pasa a través de una resistencia de 4,7 K.
La energía parásita requiere sincronización estricta y suministro según especificaciones exactas para mantener el dispositivo esclavo activo sin fallas. Por eso este modo es menos fiable. A menudo se utiliza un pull-up duro adicional para comprobar el suministro de energía.
En un modo de alimentación convencional, los dispositivos esclavos de 1 cable reciben alimentación externa. Se rastrea un cable adicional por cada esclavo de 1 cable. La fuente de alimentación externa para los esclavos garantiza un funcionamiento seguro incluso en condiciones duras y de alta temperatura.
Los dispositivos típicos de 1 cable funcionan a voltajes de – 1,71 ~ 1,89 V, 1,71 ~ 3,63 V, 2,97 ~ 6,63 V y 2,97 ~ 5,25 V. La corriente consumida varía entre 1,06 ~ 5 mA. La resistencia pull-up establece el nivel actual independientemente de si los dispositivos reciben energía parásita o convencional.
Cómo funciona el protocolo 1-Wire
Esta interfaz generalmente no se utiliza en microcontroladores o microcomputadoras. Por lo general, se implementa mediante software que utiliza bit-banging o un receptor-transmisor asíncrono universal (UART).
La comunicación a través de la línea de datos la inicia el maestro mediante un reinicio. Tira de la línea de datos a 480 nudos y luego la suelta, lo que permite que la resistencia pull-up típica lleve la línea de datos a ALTO. Si los dispositivos esclavos están conectados al bus, responden a la señal de reinicio jalando la línea de datos a BAJA durante 60 ~ 240 nudos. Si los esclavos tiran de la línea, el maestro confirma su presencia en el bus. Después de 60~240 nodos, los esclavos liberan la línea de datos para que el maestro pueda comenzar a escribir.
Después de un reinicio, el maestro puede escribir y leer datos con los dispositivos esclavos. Inicialmente, envía comandos ROM, como el comando de búsqueda de ROM (0xF0), para acceder a la dirección ROM de los dispositivos esclavos. Después de leer las direcciones ROM de todos los dispositivos esclavos de 1 cable conectados, el dispositivo maestro puede acceder a uno de ellos enviando el comando Match ROM (0x55). Los comandos ROM van seguidos de comandos de función.
Por ejemplo, si se conecta un sensor de temperatura de 1 cable al bus, el microcontrolador puede enviar los comandos de función para iniciar la conversión de temperatura, leer la temperatura, etc. La ROM y los comandos de función tienen una longitud de 8 bits.
Como el estándar 1-Wire no utiliza ninguna señal de reloj, la comunicación de los bits '0' y '1' se produce configurando el nivel lógico de la línea de datos para un intervalo de tiempo específico. Normalmente, el rango de tiempo es de 60 nudos. También hay un espacio de 1us entre cada intervalo de tiempo para que la resistencia pull-up vuelva a poner la línea de datos en ALTO. Durante cada intervalo de tiempo de 60 us, se comunica 1 bit entre el maestro y el esclavo. El intervalo de tiempo puede ser hasta 10 veces más corto si el autobús está sobrecargado.
Cuando el maestro necesita escribir bits en la línea de datos, tira de la línea de datos hacia abajo.
- Para escribir '0', el maestro extrae la línea de datos durante el intervalo de tiempo completo de 60 us y luego la vacía durante un intervalo de 1 us entre intervalos de tiempo.
- Para escribir '1', el maestro baja la línea de datos durante un período más corto de 15 us, durante todo el intervalo de tiempo, y luego la suelta durante un intervalo de 1 us entre intervalos de tiempo.
Los dispositivos esclavos pulsan aproximadamente en el intervalo de tiempo medio (es decir, 30 us en el intervalo de tiempo de 60 us). Disponen de un multivibrador monoestable básico para detectar la duración del pulso. Los comandos de función y ROM tienen una longitud de 8 bits. Los datos comunicados también están en grupos de 8 bits. La detección de errores se realiza mediante una verificación de redundancia cíclica de 8 bits.
El maestro lee desde el dispositivo esclavo después de enviar una encuesta ROM o un comando de función. La operación de lectura está controlada por el dispositivo maestro. El maestro lee el esclavo bit a bit mientras los datos se comunican al maestro en grupos de 8 bits. Cada bit se lee en un intervalo de tiempo de 60 us (o menos si el bus está sobrecargado).
El maestro lleva la línea de datos a 1 nodo y la libera. Luego muestrea los datos del bus después de 15 nodos. Si el esclavo escribe '0' en el bus, mantiene la línea desconectada durante el intervalo de tiempo de 60 us y luego vacía la línea de datos durante un intervalo de 1 us entre intervalos de tiempo. Si el esclavo escribe '1' en el bus, mantiene la línea baja durante 15 nudos y luego libera la línea de datos a la resistencia pull-up para llevar la línea de datos a ALTO.
El maestro muestrea cada bit después de 15 nodos. Si el bit enviado por el esclavo es '0', la línea pasará a BAJA en el momento del muestreo. Si el bit enviado por el esclavo es '1', la línea pasará a nivel ALTO en el momento del muestreo.
El maestro puede comunicarse con hasta 100 esclavos en un bus estándar de 1 cable. Sin embargo, cuanto mayor sea el número de esclavos de 1 cable conectados al bus, más tiempo necesitará el maestro para extraer datos de ellos. Las bibliotecas de software suelen utilizar bit banging o UART para cronometrar la duración de los pulsos. El LSB siempre se envía primero en el protocolo 1-Wire.
Implementación del protocolo
Hay cinco tipos de señales de bus en la comunicación de 1 cable, y cada una es iniciada y controlada por el maestro. Estas señales son Restablecer, Presencia, Escritura 0, Escritura 1 y Lectura.
El protocolo puede ser implementado por un microcontrolador o computadora de dos maneras: implementación de sondeo e implementación impulsada por interrupciones. Polled es una implementación solo de software. La implementación orientada a interrupciones requiere un temporizador/contador integrado.
En términos de Arduino, la implementación investigada (solo software) se puede realizar utilizando la función delayMicrosegundos. Esta función tiene este código fuente:
retraso nulo Microsegundos (sin firmar en nosotros)
{
// llamando a la función delay_us de avrlib con valores bajos (por ejemplo, 1 o
// 2 microsegundos) proporciona retrasos mayores que los deseados.
//delay_us(nosotros);
// para el reloj de 16 MHz en la mayoría de las placas Arduino
// para un retraso de un microsegundo, simplemente regrese. la sobrecarga
// de la llamada a la función produce un retraso de aproximadamente 1 1/8 us.
si (–nosotros == 0)
volver;
// el siguiente ciclo dura un cuarto de microsegundo (4 ciclos)
// por iteración, luego ejecutarlo cuatro veces por cada microsegundo de
// retraso solicitado.
nodos <<= 2;
// cuenta el tiempo dedicado a comandos anteriores.
nodos -= 2;
//espera ocupada
__asm__ __volatile__ (
“1: sbiw %0,1” “\n\t” // 2 ciclos
“brne 1b”: “=w” (nosotros): “0” (nosotros) // 2 ciclos
);
}
Para Arduino, la operación de escritura de 1 cable se puede realizar con esta función:
anular OWWrite(uint8_t bit){
si(bit){
//Escribe el bit '1'
escritura digital (NÚMERO PIN, 0x00);
retrasoMicrosegundos(6);
escritura digital (NÚMERO PIN, 0x01);
retrasoMicrosegundos(64);
}
otro{
//Escribe el bit '0'
escritura digital (NÚMERO PIN, 0x00);
retrasoMicrosegundos(60);
escritura digital (NÚMERO PIN, 0x01);
retrasoMicrosegundos(10);
}
}
Para una computadora, la misma función se puede escribir en C++, de la siguiente manera:
anular OWWrite(uint8_t bit){
si(bit==1){
//PF5 es el nombre del puerto
PORTAF &= ~(1<
retrasoMicrosegundos(6);
PORTAF = (1<
retrasoMicrosegundos(64);
}
otro{
PORTAF &= ~(1<
retrasoMicrosegundos(60);
PORTAF = (1<
retrasoMicrosegundos(10);
}
}
Para Arduino, la operación de lectura de 1 cable se puede realizar mediante esta función:
uint8_t OWRead(nulo){
resultado uint8_t;
escritura digital (NÚMERO PIN, 0x00);
retrasoMicrosegundos(6);
escritura digital (NÚMERO PIN, 0x01);
retrasoMicrosegundos(9);
pinMode(NÚMERO PIN, ENTRADA);
resultado = lectura digital (NÚMERO PIN) & 0x01;
retrasoMicrosegundos(55);
resultado de devolución;
}
Para una computadora, la misma función se puede escribir en C++ de la siguiente manera.
uint8_t OWReadBit(nulo){
resultado uint8_t = 0;
PORTAF &= ~(1<
retrasoMicrosegundos(10);
PORTAF = (1<
retrasoMicrosegundos(20);
si(PINF&(1<
resultado = ALTO;
}
retrasoMicrosegundos(30);
resultado de devolución;
}
Para Arduino, la operación de reinicio y presencia se puede realizar usando esta función:
uint8_t OWResetPresence(nulo){
resultado uint8_t;
retrasoMicrosegundos(0);
escritura digital (NÚMERO PIN, 0x00);
retrasoMicrosegundos(480);
escritura digital (NÚMERO PIN, 0x01);
retrasoMicrosegundos(70);
pinMode(NÚMERO PIN, ENTRADA);
resultado = lectura digital(NÚMERO PIN)^0x01;
retrasoMicrosegundos(410);
pinMode(NÚMERO PIN, SALIDA);
resultado de devolución;
}
Para una computadora, la misma función se puede escribir en C++:
uint8_t OWResetPresence(nulo){
resultado uint8_t = BAJO;
PORTAF &= ~(1<
retrasoMicrosegundos(480);
PORTAF = (1<
retrasoMicrosegundos(55);
si(PINF&(1<
resultado = ALTO;
}
resultado de devolución;
}
Los microcontroladores y las computadoras pueden usar UART para la implementación impulsada por interrupciones del protocolo 1-Wire. Es posible que las computadoras necesiten un chip UART externo o una placa de conexión para comunicarse con dispositivos de 1 cable.
El Tx y Rx del UART deben conectarse a la línea de datos del bus de 1 cable. El puerto UART debe tener un búfer recopilador abierto para que los esclavos puedan extraer la línea de datos. Para la señal de reinicio y presencia, la velocidad en baudios debe configurarse en 9600 y el controlador/computadora debe transmitir 0xF0.
Durante la transmisión:
- Los bits 0~3 se establecen en '0'
- El bit 4 está establecido en '1'
- Los bits 5 a 7 los escribe el esclavo.
- El bit de parada está establecido en ALTO
Si no hay ningún esclavo conectado al bus, el valor recibido es 0xF0. Si se recibe cualquier valor distinto de 0xF0, indica la presencia de esclavos de 1 cable en el bus.
Para una operación de escritura de 1 cable, la velocidad en baudios de UART debe establecerse en 115200. El bit de inicio debe establecerse en '0' y el bit de parada en '1'.
Para escribir '1', la UART debe transmitir 0xFF y recibir 0xFF a cambio. Para escribir '0', la UART debe transmitir 0x00 y recibir 0x00 a cambio.
Para una operación de lectura de 1 cable, la velocidad en baudios del UART debe establecerse en 115200. El bit de inicio debe establecerse en '0' y el bit de parada en '1'. Para leer, la UART transmite un valor 0xFF, que equivale a soltar la línea tirada en el estado ALTO. El resto de bits los escribe el esclavo. Si un esclavo escribe '1', todos los bits después del bit de inicio se establecerán en '1', por lo que la UART recibirá un valor de 0xFF. Si un esclavo escribe '0', todos los bits después del bit de inicio se establecerán en '0', por lo que la UART recibirá cualquier valor que no sea 0xFF.
Detección de secuencia
El dispositivo maestro puede buscar y detectar cualquier número arbitrario de dispositivos esclavos de 1 cable en el bus. También es posible conectar hasta 100 dispositivos esclavos a un bus estándar de 1 cable. Sin embargo, en un bus estándar de 1 cable, el maestro no tiene ningún mecanismo para detectar la secuencia física de los dispositivos esclavos en el bus. Y en algunos dispositivos de 1 cable, se proporcionan dos pines adicionales para admitir la detección de secuencia. Uno de esos dispositivos es el DS28EA00.
Dispositivos
El protocolo 1-Wire es un estándar propietario. Todos los dispositivos de 1 cable son fabricados por Maxim Integrated. Algunos de los dispositivos de 1 cable notables se enumeran en esta tabla.