Ayuda con la identificación del dispositivo en una cadena

5

Así que estoy trabajando en un nuevo proyecto en el que estoy tratando de identificar dispositivos en una "red" de protocolo cerrada. Estoy tratando de determinar cuántos dispositivos hay y los ID únicos de cada dispositivo. Probablemente tendré un eprom o algo similar para almacenar el identificador único. La pregunta que tendría para el foro sería: ¿es una cadena de margaritas la mejor manera de identificar los dispositivos? (como se muestra abajo)

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

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

¡Gracias!

    
pregunta Chris Gammell

6 respuestas

4

Ayudaría saber qué capa phy estás usando. Pero, aquí hay información general:

Si está utilizando I2C, su bus debería tener un aspecto similar al siguiente:

(tomado de societyofrobots.com)

Eneltiempodeejecución,puededetectarlasdireccionesI2C escaneando el bus enviando una condición de INICIO en cada dirección y verificación de un ACK.

Si está utilizando 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 y tratando de comunicarse.

enlace

    
respondido por el Toby Jaffey
3

Es posible que desee ver LIN ( enlace ) 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 algunos están aparentemente patentados, así que ten cuidado.

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

    
respondido por el AdamShiemke
2

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

Luego lea en el contador, auméntelo y haga salir el contador.

Luego lea las direcciones anteriores y envíelas.

Luego envía 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
    
respondido por el Robert
2

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

1 cable (y una conexión a tierra implícita)

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

Realmente útil como un 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, y luego algo más (como) jindi para las comunicaciones.

Recomiendo de todo corazón algo con un metaprotocolo para que puedas cambiar las cosas más adelante.

    
respondido por el Tim Williscroft
2

Realmente no puedes hacer una elección aquí sin determinar la capa PHY pero algunas ideas:

Si el sistema realmente está encadenado como se dibuja, entonces active cada dispositivo en orden. Programa de fábrica a la "dirección de transmisión" si la PHY tiene una (como I2C). Luego, simplemente haga que cada dispositivo elija una dirección y envíe esa dirección al siguiente dispositivo a medida que se desplaza por la cadena.

Si usa los UID de 8 bits, obtendrá puntos de bonificación, al menos de mi parte, si escribe algo cómico en ASCII con las direcciones:

Maestro: "Oye, dispositivo 1, elige una dirección" Dispositivo 1: "M", hey 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 un número fijo de dispositivos: tenía un diseño que usaba un backplane que permitía la conexión de hasta 4 tarjetas. Lo que terminé haciendo fue colocar un expansor GPIO basado en I2C en el backplane (en realidad era un IC de control de ventilador que necesitaba de todos modos, simplemente elegí uno con una interfaz I2C y algunos GPIOs 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 DSPs fueron programados de fábrica a 1 dirección. El controlador del sistema hizo que las ranuras salieran del reinicio 1 a la vez, se envió un comando I2C, si algo ACKed se asumió, se llenó la ranura y se envió un comando para que cambie su dirección I2C a un UID para esa ranura. Esto se hizo para cada espacio con un tiempo de respuesta razonable.

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

Si la PHY es maestra única y usted tiene un número de dispositivos completamente desconocido ... ¿conecte un GPIO en serie a través de ellos y úselo para controlar si responden a una dirección programada de fábrica? Entonces, cuando el esclavo obtiene su dirección, ¿anula 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 por uno. Debería trabajar, creo.

De todos modos, honestamente, toda la especulación hasta que elija un PHY y nos puede decir más acerca de cómo está conectado el sistema en general.

    
respondido por el Mark
1

Las formas en que la CPU principal puede descubrir cuántos dispositivos están conectados a ella, y el ID de cada uno, incluyen:

  • los sistemas de cadena de margaritas no requieren una "dirección" única: cada dispositivo está direccionado implícitamente por su distancia (conteo de saltos) desde la CPU principal. Una vez que haya descubierto que hay 7 dispositivos, puede abordar 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 margarita: la CPU principal cambia en un patrón único seguido de muchos "0" bits, y cuenta cuántos relojes se necesitan antes de que ese patrón regrese a la CPU principal: si marcó 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 de token-ring: cada mensaje desde 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 increíblemente grande, ninguno de los dispositivos lo reclama, y la CPU principal puede decir cuántos dispositivos hay en el bus la cantidad de veces que se redujo esa dirección dando la vuelta al bucle (el conteo de saltos).
  • los sistemas de selección de dispositivos no requieren una "dirección" única: cada dispositivo se direcciona implícitamente por cuál de las líneas de selección de dispositivos de la CPU principal 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 vea si hay algún dispositivo al final de esa línea para dar una respuesta.
  • sistemas de bus que solo tienen señales "globales" ("comunes") donde cada dispositivo tiene una única dirección cableada.
    • Algunos sistemas, como CANbus y algunos protocolos RFID, permiten que la CPU principal detecte que hay cientos de dispositivos conectados y la ID única de cada uno, después de unos pocos cientos de comandos, incluso cuando hay millones de posibles direcciones - protocolos de aislamiento . Esto permite que cada dispositivo periférico tenga una dirección única, incluso cuando se hayan fabricado millones de ellos, y aún así permite que la CPU principal descubra rápidamente los relativamente pocos dispositivos que realmente están hablando con él.
    • Algunos protocolos, como I2C, no admiten un protocolo de singulación rápida, pero permiten el escaneo: la CPU principal puede enviar un "Hola, ¿me oyes?" a todas las direcciones posibles. (Esto puede llevar mucho tiempo si hay millones de direcciones posibles).
  • sistemas de bus donde a cada dispositivo se le asigna (eventualmente) una dirección, que puede ser diferente cada vez que lo encienda: 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, entonces ¿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 de cadena de margaritas" ?

En lugar de reinventar otra rueda cuadrada, es posible que desee revisar la lista de protocolos comunes de sistemas integrados por lo que evita la mayoría de los errores que a menudo pican a las personas que diseñan protocolos desde cero. Quizás tenga suerte y pueda usar uno de esos protocolos tal como está, o con ajustes relativamente menores.

    
respondido por el davidcary

Lea otras preguntas en las etiquetas