Ayuda con la identificación del dispositivo en una cadena

Estoy trabajando en un nuevo proyecto en el que intento identificar dispositivos en una especie de "red" de protocolo cerrado.

Estoy tratando de determinar cuántos dispositivos hay y las identificaciones únicas de cada dispositivo. Probablemente tendré una EPROM o algo similar para almacenar el identificador único.

La pregunta que tendría para el foro sería: ¿es una conexión en cadena la mejor manera de identificar los dispositivos? (Como se muestra abajo)

texto alternativo

Estaba pensando que también podría intentar enrutar líneas de control individuales a los dispositivos, pero no sabré necesariamente cuántos dispositivos hay en total. Podré volver a conectar el dispositivo final a una línea de retorno (físicamente usando un puente e identificado aquí por el punto azul) .

Entonces, nuevamente, mi pregunta es: ¿hay una mejor manera de hacer esto?

Puede ser útil saber más sobre los Dispositivos 1, 2 y 3. Si ya tienen un protocolo definido, tendrá que conectarlos exactamente como lo desea el dispositivo.
Hola Chris. ¿De cuántos dispositivos estamos hablando? Sé que dices que no sabrás el total, pero ¿estamos hablando de 10, 1000 o más? Además, ¿en qué tipo de entorno estará: usuarios informados o no tanto? ¿Qué tan importante es la robustez?
¿Cuál es el PHY? ¿I2C? SPI? ¿algo más?
El phy aún no se ha determinado, esto aún es temprano en el proceso. Creo que tendrá un máximo de 4 a la vez en este momento, pero podría ser más en el futuro. La otra cosa es que existe la posibilidad de que los 4 dispositivos sean diferentes cada vez. Estos serán básicamente dispositivos intercambiables.

Respuestas (6)

Sería útil saber qué capa física está utilizando. Pero, aquí hay alguna información general:

Si está utilizando I2C, su bus debería verse así:

(tomado de societyofrobots.com)

En tiempo de ejecución, puede detectar las direcciones I2C escaneando el bus enviando una condición de INICIO a cada dirección y buscando un ACK.

Si usa SPI, necesitará una línea de selección de chip por dispositivo. Si te quedas sin pines, podrías usar algún tipo de multiplexor. Es posible que pueda escanear el bus afirmando cada línea de selección de chip por turno e intentando comunicarse.

http://kkamagui.springnote.com/pages/422905/attachments/177111
Creo que me inclinaría por la solución SPI debido a la naturaleza de los dispositivos en los que estoy trabajando. Podré conectarme a un punto, pero luego se desconocerá más allá de ese punto (los dispositivos cambiarán de vez en cuando)
Otra cosa que pensé. Como estoy tratando de hacer que los dispositivos sean intercambiables, también esperaba que fueran la misma placa (diseño con solo la identificación única programada diferente). Ese es otro problema porque las líneas CS no necesariamente solo se ejecutarían en uno de los dispositivos. Estoy realmente preocupado porque me estoy preparando para una "red autoorganizada" que es mucho más complicada de lo que quiero.
Si tiene una MCU en cada dispositivo, es posible que pueda prescindir de las selecciones de chip. Todos los dispositivos monitorean las líneas de datos+reloj y solo responden cuando se direccionan (por ejemplo, primer byte recibido). Cada dispositivo necesitaría tener una dirección única. Si está tratando de reducir los cables (a expensas de la velocidad), eche un vistazo al bus microlan de 1 cable de Maxim.

Es posible que desee ver LIN , que puede usar algo llamado SNPD para detectar y asignar direcciones a los nodos en tiempo de ejecución. Hay tres métodos presentados en el artículo de Wikipedia, y cualquiera funcionaría, pero aparentemente algunos están patentados, así que tenga cuidado.

El protocolo LIN en sí es un protocolo basado en SCI bastante simple con algunas características de confiabilidad adicionales, pero las técnicas SNPD podrían aplicarse a cualquier transferencia de datos en serie.

Envíe un comando al primer dispositivo para enviar su dirección, seguido de un contador (cero para comenzar) Cada dispositivo leerá el comando y lo emitirá.

Luego lea el contador, increméntelo y emita el contador.

Luego lea las direcciones anteriores y envíelas.

Luego envíe su dirección.

A medida que cada dispositivo recibe el comando, agrega su dirección a la respuesta.

Si los dispositivos están numerados 1, 2, 3, entonces la respuesta resultante será:

DISCOVER CMD
COUNT = 3
ADDRESS 1
ADDRESS 2
ADDRESS 3

Si no tiene que hablar demasiado rápido, busque Dallas One-Wire para su autobús.

1 cable (y una tierra implícita)

direccionable, 250 de descuento por bus, enrutable y los dispositivos de interfaz son muy baratos.

Realmente útil como bus de administración del sistema porque es muy prescindible. Tengo una familia de sistemas que usan 1 cable para la administración del sistema y el descubrimiento de dispositivos, luego algo más (como) jindi para las comunicaciones.

Recomiendo de todo corazón algo con un meta-protocolo para que puedas cambiar las cosas más tarde.

Realmente ni siquiera puede elegir aquí sin determinar la capa PHY, pero algunas ideas:

Si el sistema realmente está conectado en cadena como se ha dibujado, muestre cada dispositivo en orden. Programa de fábrica a la "dirección de transmisión" si el PHY tiene uno (como lo hace I2C). Luego, solo haga que cada dispositivo elija una dirección y envíe esa dirección al siguiente dispositivo a medida que avanza en la cadena.

Si usa UID de 8 bits, obtiene puntos de bonificación, al menos de mí, si escribe algo cómico en ASCII con las direcciones:

Maestro: "Oye dispositivo 1, elige una dirección" Dispositivo 1: "M", oye dispositivo 2 elige una dirección Dispositivo 2: "y" Dispositivo 3: "B" Dispositivo 4: "o" Dispositivo 5: "s" Dispositivo 6 : "s" Dispositivo 7: "S" Dispositivo 8: "u" Dispositivo 9: "c" Dispositivo 10: "k" Dispositivo 11: "s"

Alternativamente, si su diseño tiene una cantidad fija de dispositivos: tenía un diseño que usaba una placa posterior que permitía conectar hasta 4 tarjetas. Lo que terminé haciendo fue colocar un expansor GPIO basado en I2C en la placa posterior (en realidad era un IC de control de ventilador que necesitaba de todos modos, solo elegí uno con una interfaz I2C y algunos GPIO en él).

Enruté un GPIO a través de cada conector de borde de tarjeta al pin de reinicio del DSP en cada tarjeta enchufable. Todos los DSP se programaron de fábrica en 1 dirección. El controlador del sistema sacó las ranuras del reinicio 1 a la vez, se envió un comando I2C, si algo ACKed, se asumió que la ranura estaba poblada y se envió un comando para cambiar su dirección I2C a un UID para esa ranura. Esto se hizo para cada ranura con un tiempo de espera de respuesta razonable.

Si es un bus compartido capaz de iniciar transferencias como esclavo, también conocido como multimaestro. Simplemente haga que el dispositivo esclavo asuma el control del bus y solicite una dirección al maestro, el maestro simplemente le da la siguiente dirección en línea, piense en DHCP. Los mismos puntos de bonificación que el anterior.

Si el PHY es un solo maestro y tiene una cantidad completamente desconocida de dispositivos... ¿conectar en cadena un GPIO a través de ellos y usarlo para controlar si responden a una dirección programada de fábrica? Luego, cuando el esclavo obtiene su dirección, ¿deshabilita el siguiente dispositivo en línea? De esta manera, solo necesita 2 pines GPIO por dispositivo y 1 para el maestro y puede activar los dispositivos uno a la vez. Debería funcionar, creo.

De todos modos, honestamente, toda especulación hasta que elija un PHY y pueda contarnos más sobre cómo está conectado el sistema en general.

Las formas para que la CPU principal descubra cuántos dispositivos están conectados a ella, y la ID de cada uno, incluyen:

  • Los sistemas de conexión en cadena no requieren una "dirección" única: cada dispositivo se direcciona implícitamente por su distancia (conteo de saltos) desde la CPU principal. Una vez que haya averiguado que hay 7 dispositivos, puede dirigirse a cada uno en las ubicaciones 1, 2, 3, 4, 5, 6 y 7.
    • Sistemas con una línea de reloj global, como SPI en cadena: la CPU principal cambia en un patrón único seguido de muchos bits "0", y cuenta cuántos relojes se necesitan antes de que ese patrón regrese a la CPU principal: si marcó saca N bits de reloj, y cada dispositivo tiene un registro de 16 bits, entonces debe haber N/16 dispositivos en la cadena.
    • Sistemas sin línea de reloj global, solo buses locales, como redes token-ring: cada mensaje de la CPU principal a un dispositivo periférico incluye una dirección de destino. Cuando un dispositivo recibe un mensaje dirigido a "1", opera en ese mensaje. De lo contrario, pasa el mensaje al siguiente dispositivo sin cambios, excepto que disminuye la dirección. Cuando la CPU principal envía un mensaje con una dirección de destino imposiblemente grande, ninguno de los dispositivos lo reclama, y ​​la CPU principal puede decir cuántos dispositivos hay en el bus por cuántas veces esa dirección se redujo en todo el ciclo. (el número de saltos).
  • Los sistemas de selección de dispositivos no requieren una "dirección" única: cada dispositivo está implícitamente direccionado por las líneas de selección de dispositivos de la CPU principal que lo activan. Para cada línea de selección de dispositivo, active la línea de selección de dispositivo y envíe un simple "¿quién es usted?" mensaje, y ver si hay algún dispositivo al final de esa línea para dar una respuesta.
  • sistemas de bus que tienen solo señales "globales" ("comunes") donde cada dispositivo tiene una dirección cableada única.
    • Algunos sistemas, como CANbus y algunos protocolos RFID, permiten que la CPU principal detecte que hay cien dispositivos conectados y la identificación única de cada uno, después de solo unos cientos de comandos, incluso cuando hay millones de direcciones posibles. -- protocolos de singularización . Esto permite que cada dispositivo periférico tenga una dirección única, incluso cuando se han fabricado millones de ellos, y aún permite que la CPU principal descubra rápidamente los relativamente pocos dispositivos que realmente se comunican con ella.
    • Algunos protocolos, como I2C, no admiten un protocolo de singulación rápida, pero permiten el escaneo: la CPU principal puede enviar un "Hola, ¿puedes oírme?" a todas las direcciones posibles. (Esto puede llevar mucho tiempo si hay millones de direcciones posibles).
  • sistemas de bus donde a cada dispositivo (eventualmente) se le asigna una dirección, que puede ser diferente cada vez que lo enciende: como DHCP. Esta es probablemente una complejidad innecesaria para su aplicación.

Muchas personas afirman que "si está utilizando SPI, necesitará una línea de selección de chip por dispositivo". Si eso es cierto, ¿cuál es un buen nombre para ese otro protocolo que no requiere una línea de selección de chip por dispositivo, solo 4 pines fijos en la CPU principal, incluso con docenas de dispositivos periféricos, es decir, el protocolo utilizado por los dispositivos? que Wikipedia llama "SPI en cadena de margaritas" ?

En lugar de reinventar otra rueda cuadrada, es posible que desee consultar la lista de protocolos de sistemas integrados comunes , para evitar la mayoría de los errores que a menudo molestan a las personas que diseñan protocolos desde cero. Tal vez tenga suerte y pueda usar uno de esos protocolos tal como está, o con ajustes relativamente menores.

El término "SPI" ha llegado a abarcar casi cualquier interfaz serial sincronizada donde un solo dispositivo maestro tiene el control exclusivo del reloj, y donde el estado de una línea de datos es irrelevante excepto en un borde de reloj particular (para algunos dispositivos, el el borde relevante es ascendente; para otros, descendente). La mayoría de las cosas que se denominan dispositivos SPI requieren selecciones de chips individuales, pero hay muchos dispositivos que se pueden adaptar para comunicarse con un bus SPI (por ejemplo, chips 74HC595 o 74HC165) que se pueden conectar en cadena. Consideraría una cadena de seis 74HC595 con una señal de bloqueo común como un único periférico SPI-ish.