Error de lectura SPI con MCP2515

0

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.

    
pregunta Khalidos

1 respuesta

0

¿Sabe si su MPPT o BMS están configurados para enviar mensajes CAN periódicamente sin primero recibir alguna solicitud externa a través de CAN?

Por ejemplo, conozco al menos dos MPPT de coches solares populares que solo enviarán mensajes CAN en respuesta a la trama CAN correspondiente con la misma ID y con el bit de solicitud de transmisión remota (RTR) establecido.

Puede intentar distinguir entre un bus CAN donde todos los demás nodos se niegan a enviar mensajes y un bus CAN que no funciona al intentar enviar un mensaje CAN y verificar si está ACKed. Debería poder hacer esto en el software al verificar si el mensaje se transmite con éxito o en el hardware al sondear el pin CANRX no diferencial en el TJA1050 y al verificar el bit ACK con un analizador lógico.

Si no tiene un analizador lógico, puede usar un osciloscopio de dos canales para monitorear CANRX y CANTX del TJA1050. Cuando el MCP2515 transmite un mensaje, CANRX y CANTX serán idénticos si nadie ACK su mensaje. Si alguien ACEPTA el mensaje, debería ver un solo bit dominante (bajo) en CANRX que no está presente en CANTX.

También puede intentar cambiar su resistencia de terminación de 100 ohmios por una resistencia de terminación de 120 ohmios. Todos los dispositivos CAN que he usado personalmente han usado resistencias de terminación de 120 ohmios. No espero que haya problemas de compatibilidad, pero es trivial cambiarlo para descartar la resistencia de terminación como una posible fuente de error.

    
respondido por el Devan

Lea otras preguntas en las etiquetas