5 votos

Descubrimiento de dispositivos en un bus simple

Actualmente me encuentro con el siguiente problema: hay un sistema, que consiste en un dispositivo maestro y un cierto número de dispositivos esclavos (todos esos dispositivos tienen pequeños MCUs). Se comunican con algún protocolo personalizado basado en el cable de serie (se parece bastante a Modbus). Todos los dispositivos esclavos deben tener IDs únicos dentro de un bus, para que el dispositivo maestro pueda dirigirse a cada uno de esos esclavos. Actualmente me veo obligado a codificar esos IDs en cada dispositivo esclavo. Mi objetivo es flashear todos esos dispositivos con el mismo firmware, por lo que no se deben utilizar IDs codificados para que esto sea posible. Estoy pensando en un dispositivo maestro, que sea capaz de asignar direcciones únicas a todos esos dispositivos, pero no puedo averiguar cómo hacerlo. ¿Puede alguien darme alguna idea o concepto de cómo extender mi protocolo de comunicación para que esto sea posible? ¿Quizás alguien pueda darme un ejemplo?

1 votos

Este es, por supuesto, un problema de diseño muy común. Si existe una solución "sagrada", no estoy seguro de que haya muchos CI de identificación única en el mercado. Sin embargo, me gustaría ver una solución.

3 votos

Podrías añadir una EEPROM preserializada si tienes una pequeña cantidad de área de PCB disponible y un puerto I2C o SPI. Algo así como un 24AA02E48 .

2 votos

¿Sus MCUs manejan el protocolo ModBus-ish en software? Si lo hacen, entonces en el encendido no podrías usar ModBus hasta pasar por una fase de enumeración de su propio protocolo. Los esclavos necesitan una identificación única, así que pon un CI de número de serie de 48 bits DS2401 en cada uno. Entonces implementas un protocolo simple con esclavos de drenaje abierto usando lectura fallida (sobre 48 lecturas seriales, los esclavos pasan de vuelta un 0 como bajo, 1 como hi-Z, entonces comprueban la línea de lectura y sientan esta ronda si es diferente a lo que enviaron). Sigue leyendo números de 48 bits del bus y asignando direcciones hasta que todo esté hecho. Puedo ampliar esto, pero primero, ¿lo permitirá tu hw/sw?

3voto

Para hacer este tipo de direccionamiento dinámico en un bus común se necesita, en última instancia, una de estas dos cosas:

  • un espacio de direcciones muy pequeño para poder realizar búsquedas de fuerza bruta de forma eficiente
  • algún tipo de sistema de detección/gestión de colisiones

Si no tienes ninguna de estas dos cosas, tendrás que codificar las direcciones en los dispositivos maestro y esclavo.

La razón de esto es que si tienes un espacio de direcciones (de tamaño N) que es demasiado grande para buscar eficientemente recorriendo cada N direcciones, entonces cualquier algoritmo de búsqueda optimizado que pueda encontrar la dirección en menos de N pasos debe incluir la posibilidad de que más de un esclavo transmita una respuesta al mismo tiempo. Si la capa física no puede manejar esta situación, entonces desafortunadamente no tienes suerte. Si la capa física puede detectar colisiones, entonces hay muchas opciones, como tener un retardo de reintento aleatorio cuando se produce una colisión (Ethernet), o utilizar algo como el bus CAN donde las colisiones se gestionan de forma cooperativa.

0 votos

Las colisiones se detectan mediante la suma de comprobación de cada mensaje. ¿O se refiere a algo como los métodos CSMA?

1 votos

@vadimchik Siempre que el bus físico (controladores, etc) pueda manejar las colisiones, entonces se podría implementar un sistema como ethernet. Sin embargo, muchos buses no están diseñados para manejar colisiones, y puede dañar los controladores.

0 votos

Físicamente todos los pines TX esclavos son pines de drenaje abierto, por lo que las colisiones no deberían dañar el hardware

3voto

Callum Rogers Puntos 6769

Hace unos años diseñé un sistema para ello.

Funcionaba como el esquema de abajo. Se estableció un anillo de comunicación común.

Cada esclavo tiene un circuito de conmutación lógica que inicialmente, o en el reinicio del sistema, bloquea el anillo.

schematic

simular este circuito - Esquema creado con CircuitLab

En el momento de la puesta en marcha, el dispositivo maestro, en la parte superior, envía un comando "Who_Is_There".

Estructura de mando [CODE][(ID1,ID1)][END]

Como los interruptores están inicialmente abiertos, sólo el primer esclavo recibió esa orden.

El esclavo copia el paquete de comandos y añade el ID de su tipo de función a la lista y luego envía el comando. El esclavo recuerda el índice de la ubicación a la que añadió su id de tipo como su dirección de anillo. Una vez enviado, el esclavo cierra su interruptor de anillo. A continuación, ignora cualquier otro comando "Who_Is_There" hasta el siguiente reinicio.

El siguiente esclavo en la secuencia hace lo mismo y así sucesivamente en la cadena.

Finalmente, el maestro recibe el comando de vuelta con una lista de tipos de dispositivos en el orden en que fueron encontrados en el anillo, por lo que conoce el ID de cada esclavo.

Después, el maestro sólo dirige los paquetes al esclavo correspondiente. Como todos los interruptores están cerrados en ese momento. Todos oyen la orden, pero sólo responde el que está dirigido.

Además: En mi aplicación particular, el sistema estaba basado en el backplane, donde las tarjetas pueden o no estar pobladas para una configuración de producto particular. Por ello, los elementos de conmutación se diseñaron en la placa base, de modo que la ranura se omitiera si el dispositivo no estaba equipado.

Una alternativa es pasar cada comando a través de cada micro, sin embargo eso introduce una latencia significativa y un poco de sobrecarga en cada micro.

0 votos

Interesante solución, pero lamentablemente no hay posibilidad de cambiar el esquema de conexión del bus para esos dispositivos.

1 votos

@Vadimchik, sí, lo entiendo, es algo que hay que diseñar desde el principio. Más bien añadí esta respuesta como una indicación para los que empiezan.

2voto

ams Puntos 101

Si, en lugar de un verdadero bus, tuvieras una disposición en cadena, entonces podrías hacer que el maestro hablara con el esclavo, le asignara una dirección y luego le enviara un comando para habilitar el puerto de salida al siguiente esclavo. Repite la operación hasta que todos los esclavos tengan direcciones. Así es básicamente como funciona la enumeración USB con hubs apilados.

Además, ¿qué tipo de disposición de hardware está utilizando? ¿Son los esclavos de la placa que se conectan a un backplane? Si es así, podrías añadir pines extra en el conector con diferentes arreglos de pines conectados a tierra en cada ranura para actuar como una identificación, leída por GPIOs en el esclavo, para generar la dirección del esclavo.

0 votos

Mi hardware está conectado con un cable de 4 hilos: gnd, vcc y dos hilos que actúan como miso y mosi. No hay manera de apagar los esclavos en consecuencia: en cada momento de tiempo pueden ser o encendido o apagado.

1voto

Callum Rogers Puntos 6769

Si no tienes una identificación fija, y no puedes cambiar el hardware para romper las conexiones, entonces prácticamente necesitas un generador de números aleatorios.

El sistema que se presenta a continuación puede hacer lo que usted desea si tiene una forma de generar un número aleatorio en cada micro independientemente del otro.

enter image description here

Sin embargo, la parte de generar el número aleatorio es casi tan difícil como la de encontrar su identificación si los micros no están conectados a algún tipo de señal analógica que pueda utilizar para sembrar su generador de números aleatorios.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X