Problema con CAN Bus

Estoy utilizando arduino DUE y soy capaz de leer todo el tráfico de la línia CAN, pero cuando intento enviar un mensaje no pasa nada. Estoy utilizando el CAN0. Agradeceria si alguien me podria indicar como debo enviar el mensaje. Ninguno de los ejemplos me funciona para hacer el envio. Gracias.

Has probado los ejemplos de tu librería CAN?

Hola Surbyte y gracias por contestar. Si, los ejemplos los he mirado y todo OK, me comunico conmigo mismo (entre los dos puertos del DUE) y no hay problema en leer los mensajes CAN. Lo único que no consigo es enviar un mensaje del Due a los demás dispositivos. De la librería de can_due no soy capaz de encontrar la documentación para ver exacto como se hace el empaquetado del mensaje.

Tengo experiencia en arquitecturas CAN (me dedico profesionalmente a eso). Suelo trabajar con controladores industriales donde no tocas tan bajo nivel e hice algún proyecto utilizando Raspberry's Pi pero las librerías son más amigables. Estamos mirando de utilizar el DUE para una solución de bajo coste en un cuadro de mando.

Agradeceria que me dijera donde puedo encontrar la documentación de la librería can_due (lo unico que encuentro son los ejemplos) o alguna otra librería que funciona con el DUE.

Como transceiver utilizo el MCP2551.

Gracias y saludos.

#include <variant.h>
#include <due_can.h>

void setup()
{
Serial.begin(115200);
Can0.begin(CAN_BPS_250K);
//Can0.watchFor();
}

void CANBUSTX()
{
CAN_FRAME CANBus_TX;
CANBus_TX.id = 0x090;
CANBus_TX.extended = false;
CANBus_TX.priority = 4;
CANBus_TX.length = 8;
CANBus_TX.rtr = 0;
CANBus_TX.data.byte[0] = 24;
CANBus_TX.data.byte[1] = 33;
CANBus_TX.data.byte[2] = 23;
CANBus_TX.data.byte[3] = 11;
CANBus_TX.data.byte[4] = 0;
CANBus_TX.data.byte[5] = 0;
CANBus_TX.data.byte[6] = 0;
CANBus_TX.data.byte[7] = 10;
Can0.sendFrame(CANBus_TX);
}

/*void CANBUSRX()
{
CAN_FRAME CANBus_RX;
if (Can0.available() > 0)
{
Can0.read(CANBus_RX);
Serial.print(F(">>>>>>>>>> Received CANBUS!!! "));
Serial.println(CANBus_RX.id,HEX);
}
}*/

void loop()
{
CANBUSTX();
//CANBUSRX();
}

Ya está solucionado. El error era del MCP2551. Parece ser que hay una remesa que está defectuosa (probé 50) y ya los devolví. Al probar con un MCP2551 que tenía por aquí de de otro proyecto todo funcionó a la primera.

El codigo funciona perfectamente, por lo que si a alguien le falla es el transceiver.

Hola. Excelente sktech, gracias por compartir. No sé si encontraste al fin la documentación de can_due, Yo la encontré en Github. Busco el link y Te lo paso si aún requieres, aunque veo que solucionaste el problema

Hola @saluma29.

Acabé cogiendo directamente la librería y me la mire directamente. Lo tengo ya funcionando. Si lo tienes a mano si, te lo agradeceria.

No la tengo a mano. Voy a buscarla ... Es que alguna vez estuve trabajando con due y también la necesité. Tu has trabajado con CanBus pero con el protocolo j1939? De vehículos pesados?

Si. Principalmente trabajo con ISOBUS y CANOPEN por lo que el J1939 está siempre presente. Utilizo DUE ahora mismo mas que nada porque buscaba una solución que lleve directamente la parte del CAN incluida para reducir la electrónica de la PCB. El ambiente donde se utilizara es un ambiente industrial de maquinaria pesada por lo que como menos componentes mejor y si son de quita y pon (como el DUE) más fácil para los operarios trabajar (reparaciones, montaje, etc).

Prefiero trabajar con controladores industriales en este tema ya que son más robustos.

Si necesitas cualquier cosa tu pregunta, intentare ayudar.

Genial muchas gracias. Cualquier cosa Te estaré molestando.

Pues yo creo que el problema es otro y te vas a sorprender. Ahora esto es especulación de mi parte.
Tenemos un hilo donde anotamos todos los integrados y transistores FAKE y tal vez hayas sido objeto de una estafa en ese sentido. Las cosas funcionan cuando son originales pero hoy en dia hay mucho elemento pirata.
Tal vez si comparas el consumo del MCP2551 en idle con el que no funciona te sorprendas de ver una diferencia importante de consumo. Ese es el único detalle encontrable en los ICs fakes.
Son otra cosa aunque lucen igual.
Como dije... solo es especulación de mi parte.
Ve a Documentación donde he iniciado un hilo sobre este tema para ir documentándolo si es que compruebas lo que digo.

Buenos días Surbyte, es posible pero es poco probable.

Compramos todos los componentes únicamente a proveedores industriales conocidos (RS, Farnell, DigiKey, Arrow, etc), nada de Aliexpress o páginas raras, son políticas de empresa. Puede ser que el problema se deba más a cómo se guardó el producto o a la manipulación que no a que sea una copia del original, pero todo es posible. Hoy llegó el reemplazo y todo perfecto. El consumo y todo estaba dentro de las características del datasheet pero el pin the tx parecía que no hacía nada (comprobé con el osciloscopio y la información llegaba a la patita). Internamente no sabemos cómo está hecho exactamente por lo que solamente podemos especular en el fallo que tuvieron. Los devolví todos por lo que no puedo seguir investigando (necesito el producto funcional para que en línea se puedan acabar las PCBs). Cualquier cosa que descubra os mantendré informados ya que es la primera vez que me pasa esto con un MCP2551.

Saludos.

Bueno, entonces por tu comentario me queda claro que no se ajusta mi especulación sobre el posible fallo.
Como tu has dicho: "Partida defectuosa y punto".

EDITO 11/11/22:
Resulta que ahora comprendo mejor el tema CAN.
El MPC2515 solo es una interfaz SPI a TX y RX CAN que no es un Tx y Rx Serial asi que a no confundir.


Es la primer capa o layout entre un micro sin capacidad CAN y un controlador CAN com el MCP2561 o 62 que difieren en el manejo del VBIAS.