Kinetis KE06 CAN TX datos son incorrectos

1

Quiero transmitir tramas CAN en un Kinetis KE06. Cuando envío el marco, su carga útil es basura total. He confirmado los datos incorrectos en modo de bucle invertido y con un analizador lógico (conectado al pin TX del tranceiver). El identificador (tanto estándar como extendido) siempre es correcto y la longitud siempre es correcta. La carga útil de la chatarra permanece siempre igual, pero difiere entre los ciclos de energía.

Este es mi código de transmisión:

static void can_transmit(uint32_t identifier, bool identifier_is_extended,
    const uint8_t *payload, uint8_t payload_length) {

uint8_t empty_buffer_mask = MSCAN->CANTFLG & MSCAN_CANTFLG_TXE_MASK;
if (!empty_buffer_mask) {
    debugf("TX busy, dropping frame");
    return;
}

//select transmit buffer
MSCAN->CANTBSEL = MSCAN_CANTBSEL_TX(empty_buffer_mask);
debugf("Buffers available %02X selected %02X, payload length %d", empty_buffer_mask, MSCAN->CANTBSEL, payload_length);

if (identifier_is_extended) {
    MSCAN->TEIDR0 = identifier >> 21;
    MSCAN->TEIDR1 = ((identifier >> (20/*source bit position*/- 7/*destination bit position*/))
            & MSCAN_TEIDR1_TEID20_TEID18_MASK)
                    | ((identifier >> (17 - 2)) & MSCAN_TEIDR1_TEID17_TEID15_MASK)
                    | MSCAN_TEIDR1_TEIDE_MASK;
    MSCAN->TEIDR2 = identifier >> 7;
    MSCAN->TEIDR3 = identifier << 1; //TODO: check the RTR flag
} else {
    MSCAN->TSIDR0 = (uint8_t) (identifier >> 3); //this register holds bits 10-3 of the ID
    MSCAN->TSIDR1 = (identifier & 0x7) << MSCAN_TSIDR1_TSID2_TSID0_SHIFT;
    MSCAN->TSIDR1 |= MSCAN_TSIDR1_TSRTR_MASK; //set remote transmit request flag
 // ^^^^^^^^^ THIS IS WRONG - see answer ^^^^^^^^^^^^
}

for (uint8_t i = 0; i < 8; i++){
    MSCAN->TEDSR[i] = i; //transmit fixed data
    debugf("TEDSR[%ld] = %02X", i, MSCAN->TEDSR[i]);
}

MSCAN->TDLR = 8;//payload_length;
MSCAN->TBPR = 0; //priority of this buffer

_rx_busy = false;

//enable transmission of this buffer
uint8_t transmit_flag = MSCAN->CANTBSEL & MSCAN_CANTFLG_TXE_MASK;
debugf("transmit flag = %02X", transmit_flag);
MSCAN->CANTFLG = transmit_flag;
}

Parece que la escritura en TEDSR no tiene efecto. ¿Qué estoy haciendo mal?

    
pregunta filo

2 respuestas

2

Hice un proyecto ficticio utilizando Processor Expert con un controlador CAN, luego descendí a través de todas las capas de lasaña de abstracción hasta el abismo. Copié partes de mi controlador pieza por pieza en el controlador de PE hasta que comenzó a enviar basura.

Descubrí que estaba configurando el bit RTR innecesariamente (solicitud de transmisión remota / marco remoto). Ni siquiera quería enviar un marco remoto en primer lugar ...

Un marco remoto CAN no tiene carga y cuando se envía dicho registro, el registro de longitud MSCAN debe ser cero. Si se establece el bit RTR y la longitud no es cero, se está enviando basura.

    
respondido por el filo
0

No estoy familiarizado con esta parte, pero hay un par de sugerencias en el RM:

  • la lectura / escritura en TDSER está bloqueada a menos que el búfer esté marcado como vacío
  • normalmente el hardware marca TXE después de la transmisión

Una suposición, pero ¿quizás necesita cebar la bomba escribiendo 1 en TXE? Puede haber un valor oculto (sombra) de TXE detrás del que lee para identificar el búfer; Me encontré con problemas similares con otras partes de esta familia (pero no con el controlador CAN).

Espero que ayude, Saludos cordiales, Dave

    
respondido por el Dave Nadler

Lea otras preguntas en las etiquetas