SENT CRC cálculo

1

Estoy usando el protocolo SENT en mi proyecto.

En mi implementación de SENT, los datos de los nibbles son 3. Por lo tanto, los datos de 12 bits, incluido un nibble de estado y el nibble CRC.

Necesito calcular el CRC para 3 nibbles de datos.

El valor semilla para el cálculo de CRC es 5 y el polinomio es

  

\ $ x ^ {4} + x ^ {3} + x ^ 2 + 1 \ $

He hecho lo siguiente para el cálculo de CRC:

char CheckSum, i;
char CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5};
CheckSum= 5; // initialize checksum with seed "0101"
for (i=0; i<3; i++) {
CheckSum = CheckSum ^ Data[i];
CheckSum = CrcLookup[CheckSum];
}

En el analizador SENT, pude ver un error de CRC. El registro es el siguiente

¿Alguien puede decirme cómo calcular el CRC para el protocolo SENT?

Nota: Tengo 0XABC como datos de datos y 3 es el estado de elementos.

    
pregunta Abdul Gafoor

2 respuestas

1

Después de una gran cantidad de búsquedas, que incluían ir a la norma SAE J2716 para ver exactamente cómo era la implementación, descubrí que el código era incorrecto. El orden de las operaciones se invirtió y, por supuesto, debe asegurarse de no estar accediendo a elementos fuera de los límites, como lo haría con su código.

La implementación correcta debe ser:

uint8_t calculatedCRC, i;
const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5};
calculatedCRC = 5; // initialize checksum with seed "0101"

for (i = 0; i < 6; i++)
{
    calculatedCRC = CrcLookup[calculatedCRC];
    calculatedCRC = (calculatedCRC ^ Data[i]) & 0x0F;
}
// One more round with 0 as input
calculatedCRC = CrcLookup[calculatedCRC];

Si tiene, como en mi caso, la carga útil completa en una variable de 32 bits en el formato SDDDDDDC (S es el nibble de estado, C el CRC que debe verificar), entonces el código se puede modificar en de esta manera:

uint32_t crcData = YourOriginal32BitSentFrame;

uint8_t calculatedCRC, i;
const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11, 15, 2, 8, 5};
calculatedCRC = 5; // initialize checksum with seed "0101"

for (i = 0; i < 6; i++)
{
    uint8_t crcDatum = (crcData >> 24) & 0x0F;

    calculatedCRC = CrcLookup[calculatedCRC];
    calculatedCRC = calculatedCRC ^ crcDatum;
    crcData <<= 4;
}
// One more round with 0 as input
calculatedCRC = CrcLookup[calculatedCRC];

Saludos cordiales

    
respondido por el frarugi87
0

Según el documento aquí: enlace

Por lo tanto, si tiene el nibble de estado en los datos [0], debería intentar simplemente calcular el CRC sobre los datos [1], los datos [2] y los datos [3].

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas