En un intento de conectar un controlador de motor, un sistema de administración de la batería y un dispositivo de seguimiento del punto de máxima potencia en un bus CAN, usé la placa de interrupción CAN MCP2515 y TJA1050. Todos estos dispositivos envían mensajes CAN a las mismas tasas de bits. Al interactuar con el controlador del motor, los mensajes fueron interpretados correctamente por Arduino. Sin embargo, con los otros dos dispositivos, hay un problema con la función de lectura SPI. Estoy usando la biblioteca Seeed, cuya documentación se puede encontrar aquí: enlace
La siguiente función devuelve el código que sugiere que no hay ningún mensaje. La condición readStatus falla.
byte MCP_CAN::checkReceive(void)
{
byte res;
res = mcp2515_readStatus() // RXnIF in Bit 1 and 0
return ((res & MCP_STAT_RXIF_MASK)?CAN_MSGAVAIL:CAN_NOMSG);
}
La función readStatus es la siguiente:
byte MCP_CAN::mcp2515_readStatus(void)
{
byte i;
#ifdef SPI_HAS_TRANSACTION
SPI_BEGIN();
#endif
MCP2515_SELECT();
spi_readwrite(MCP_READ_STATUS);
i = spi_read();
MCP2515_UNSELECT();
#ifdef SPI_HAS_TRANSACTION
SPI_END();
#endif
return i;
}
El valor i devuelve un 0. Cada uno de los dispositivos tiene una resistencia de terminación, por lo que se agregó una resistencia de 100 ohmios en el extremo del módulo CAN. Los voltajes se midieron con respecto a tierra CAN, alrededor de 2.7 y 2.1 en líneas CANH y CANL respectivamente.