3 votos

¿Puedo conectar varios STM32 a un solo transceptor CAN?

TL;DR: Esta pregunta es sobre el ahorro de transceptores CAN innecesarios compartiendo uno entre 3-4 MCUs iguales en una pequeña placa única.

Situación imaginaria: Una placa con múltiples STM32-MCUs iguales y con capacidad CAN necesita chatear con otras placas iguales a través del bus CAN. Hay un transceptor en cada placa (probablemente un MCP2562FD), destinado a ser conectado a todas las MCUs en paralelo, compartiendo el acceso al bus. Por favor, vea el siguiente pseudo-esquema para aclararlo:

Pseudoschematic of two multi-MCU-boards connected via CAN

Las "MCUs secundarias" de la mitad izquierda "sólo escucharán pasivamente" y utilizarán filtros de identificación individuales para obtener sólo los datos relevantes para su tarea.

La respectiva "MCU principal" será el único comunicador activo en cada placa, oficialmente hablará / responderá / ACK en el bus.

El objetivo es reducir el número de circuitos integrados del transceptor por placa. Normalmente, pondría un transceptor dedicado para cada MCU. Para mí, sin embargo, un transceptor CAN (no: controlador) parece un "punto de acceso activo" / "traductor de medios" que no está necesariamente obligado a estar conectado a una sola MCU cliente. Además, asumo que si la MCU principal fue capaz de entender un mensaje (y lo "ACKó"), los µCs secundarios también deberían haberlo recibido correctamente, ya que todas las líneas se mantienen cortas y alejadas del ruido, y lo más probable es que las interferencias se produzcan al otro lado del transmisor. Las líneas tx de los secundarios se omitirán, muy probablemente, para reforzar la pasividad.

Para mí, este concepto parece factible, electrónica y lógicamente. Sin embargo, no soy capaz de encontrar ningún recurso que describa que podría funcionar o que no lo haría en absoluto. Si algún profesional de CAN / STM32 pudiera arrojar algo de luz sobre esto, indicarme la dirección correcta (*), nombrar los escollos, confirmar o refutar mis ideas, ¡se lo agradecería mucho!

Gracias por su tiempo y atención.

(*) sin discutir el enfoque multi-MCU en su conjunto o cambiar a / introducir otros medios de comunicación multiprocesador - I amor y quiere el alto nivel de abstracción por el filtrado de ID y los buzones de correo todo en el hardware bondad ;)

3voto

Loïc d'Anterroches Puntos 148

Ahora, quiero que los "µCs secundarios" de cada placa "sólo escuchen pasivamente escuchen" y utilicen filtros de ID individuales para ver sólo los datos relevantes (cada ciclo de CPU libre cuenta).

Sí, si estás haciendo esto, no hay problema en tener varios microcontroladores con sus respectivos pines CAN_TX y CAN_RX unidos. Como has mencionado, debes asegurarte de que están configurados en modo pasivo si es posible (lo que hace el STM32).

Tenga en cuenta que incluso si no tuvieran un modo pasivo, debería estar bien conectar las líneas juntas (aunque algunas resistencias en serie en CAN_TX serían prudentes) ya que cada controlador CAN ACK cada mensaje o generar tramas de error en el mismo punto de todos modos. También tenga en cuenta que la mayoría de los controladores CAN ACK cualquier trama válida que ven, independientemente de si se filtra posteriormente o no. El filtrado es una operación de alto nivel, mientras que el bit ACK está ahí para proporcionar una comprobación básica de conectividad para el nodo transmisor (y no mucho más en la práctica).

2voto

Neil Foley Puntos 1313

Hay dos circunstancias en las que el controlador CAN de un nodo enviará cosas en el bus incluso si no se le ha dicho que envíe ninguna trama de datos:

  • Para establecer los bits ACK en cualquier trama entrante.
  • Para enviar tramas de error en caso de que detecte errores (relleno, errores de bits, etc.).

Así que si todos tus MCUs comparten las líneas Tx y Rx, debes asegurarte de que los nodos pasivos no hagan nada de lo anterior. Suponiendo que el controlador ST BxCAN, entonces aparentemente tiene un "modo silencioso" donde cualquier transmisión desde el nodo "silencioso" es internamente bucle a Rx y la salida CAN Tx se mantiene recesiva.

Esto asumiendo que el nodo "silencioso" no se vuelva loco si alguien externo empieza a tirar de su línea de Tx a nivel dominante. En caso de que esto afecte al contador de errores del nodo "silencioso", este diseño podría ser inviable, por lo que yo dejaría el pin Tx de cada nodo "silencioso" sin conectar.

Y sí, debería funcionar que tu nodo activo sólo haga el ACK. Los nodos silenciosos recogerán el ACK desde el lado CANH/CANL.

2voto

Kuba Ober Puntos 1474

Buenas noticias: tengo una solución que resuelve brillantemente el problema de la CAN compartida, y hará que su diseño general sea mucho más sencillo.

Utilizar una única MCU más potente.

Si no puedes, tendrás que explicar con algún detalle por qué, porque veo tu pregunta como un problema XY más: buscas una solución a algún detalle sin examinar (en la pregunta) por qué ese detalle tiene siquiera sentido para empezar. Usar una sola MCU en lugar de 4 resuelve ese problema, y resuelve un montón de otros problemas que ni siquiera sabes que tienes (todavía).

cada ciclo de CPU libre cuenta

Eso me dice que estás usando una MCU poco potente para el trabajo. Es probable que también obtengas una mayor eficiencia energética por MIPS con una MCU más potente, así que si te preocupa el consumo de energía, un chip más potente es mejor que varios menos potentes (suponiendo que se utilicen por completo).

He tenido un diseño "simple" con 4 MCUs, conectados en red vía SPI. Resultó ser más problemático de lo que merecía la pena: un único chip más potente lo hacía todo más fácil. Ese diseño nunca salió de la etapa de un prototipo limitado, y me alegro.

Quiero que los "µCs secundarios" de cada placa "sólo escuchen pasivamente"

La escucha pasiva es prácticamente el modo de funcionamiento por defecto de CAN, ya que el cambio de bits de reconocimiento no es necesario a menos que el software del transmisor lo requiera. En muchos diseños, CAN se puede utilizar como un medio de "difusión", en el que cada nodo transmite cuando es necesario, y los nodos interesados lo escuchan. Dado que, presumiblemente, todos los nodos están ahí por una razón, no será típico que algún nodo prolongue los periodos de inter-transmisión ("retroceda") si no hay "oyentes", como se determina por la falta de acuses de recibo.

Con una estructura de red fija y una función fija del sistema global, cada nodo enviaría informes siguiendo algún presupuesto de utilización de enlaces que se le asigne, y no se echaría atrás sólo porque ningún oyente proporcione ACKs. Muchas implementaciones de CAN señalan la falta de ACK como un "error", pero ese es un nombre totalmente arbitrario sin ninguna otra consecuencia, y sólo es un "error" si el código que envía los mensajes lo trata así. El adaptador CAN se asegura de informar de la falta de ACK, ya que la especificación requiere que lo detecte y lo señale a las capas superiores. Las capas superiores son libres de ignorarlo en sistemas puramente de difusión en los que los nodos no necesitan establecer conexiones por encima de CAN (y, por tanto, establecer el estado que rastrea la presencia del receptor o receptores). Los ACKs de muchos nodos son uno de los peores casos para la integridad de la señal CAN, ya que reducen drásticamente la impedancia del bus.

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