Red de área del controlador recibido mecanismo de filtrado de mensajes

3

Estoy trabajando en un proyecto de comunicación CAN que nos permite controlar algún dispositivo externo conectado a un nodo desde otro nodo. El bus CAN es una red de transmisión y, por lo tanto, un nodo CAN en el bus recibirá un mensaje enviado por un nodo.

Mi requisito es que necesito implementar un mecanismo de filtrado para los nodos para que un nodo solo actúe sobre los mensajes recibidos para los que está configurado (usando alguna utilidad GUI). Así que necesito implementar este mecanismo de filtro en mi código. Estoy usando un microcontrolador STM8SAF52Ax con IAR Embedded Workbench como mi entorno de desarrollo.

¿Cómo podría implementar este proceso de filtro de mensajes CAN? También realicé búsquedas en la web y leí muchos otros tutoriales, pero todavía no puedo entender lo que se debe hacer. Se utiliza el ID de filtro CAN y la máscara de filtro, pero no puedo decidir qué valor cargar en estos y cómo calcula estos valores.

    
pregunta amit kr

2 respuestas

5

Es muy sencillo: solo actúe cuando reciba el mensaje que desea e ignore todo lo demás. Simplemente mantenga una lista de identificadores CAN y luego actúe basándose en ellos. Es un problema de software puro.

Los controladores CAN siempre tienen registros de filtro integrados, pero estos casi siempre son demasiado toscos para ser usados en aplicaciones semi-avanzadas, porque usan enmascaramiento de bits. El único uso de estos filtros en la práctica es cuando tiene un nodo CAN que solo debe escuchar uno o quizás dos mensajes CAN.

EDITAR: tenga en cuenta que estos filtros suelen utilizar un NOR a nivel de bits de todos los identificadores CAN existentes. Es por eso que los filtros tienen cada vez menos sentido, cuantos más identificadores CAN necesite admitir. Es un error de diseño fundamental en el mecanismo de filtro CAN en la mayoría de los controladores CAN.

La razón por la que querría usar tales filtros es para reducir la carga de trabajo de la CPU. Sin embargo, algunos de los controladores Dumber CAN aún producirán una interrupción por el mensaje recibido, incluso cuando el mensaje no pasó el filtro.

Por lo tanto, mi consejo para este caso es que se olvide de todos los filtros de hardware y haga todas las comprobaciones de CAN ID en el software.

Para una gran cantidad de ID de CAN diferentes, deberá usar una tabla ordenada y buscar de forma eficiente (búsqueda binaria) a través de ella para ver si recibieron la ID de CAN que era válida.

La pregunta real aquí es si tiene un controlador CAN para la MCU dada o no. Codificar un controlador CAN por sí mismo no es trivial, por lo general toma de 1 a 2 meses desarrollar un controlador CAN completamente funcional, dado que ya conoce la programación CAN y C.

    
respondido por el Lundin
4

Como usted dice, cada nodo recibe cada mensaje. En CAN, los mensajes se etiquetan según los datos que contienen. Esto se hace usando el campo ID para ese propósito. Esto puede ser de 11 o 29 bits, decidido por el remitente.

La respuesta básica es, entonces, examinar la ID y descartar el mensaje que no sean relevantes. Muchas implementaciones de hardware CAN tienen máscaras y filtros para este propósito exacto. Consulte la documentación de su receptor CAN para ver qué puede hacer exactamente el hardware por usted.

Sin embargo, no necesitas hardware para esto. Normalmente no me molesto con las máscaras y filtros de hardware, ya que están arquitectónicamente en el lugar equivocado y, por lo tanto, son difíciles de usar para firmware generalizado. Por lo general, la tarea de recepción de CAN a nivel de la aplicación examina la ID y envía a la rutina en particular para manejar el mensaje. Al ignorar los mensajes CAN con ID, el código no está equipado para interpretar esto de forma natural, y realmente no requiere ningún código adicional.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas