Mi CRC8 es disfuncional y no estoy seguro de por qué!

2

Así que estoy conectando un arduino con un sensor de temperatura Melexis, y todo va bien, aparte del hecho de que parece que no puedo hacer que el control CRC funcione.

He conseguido que las operaciones de lectura se completen correctamente (aunque mi software ignora el código de error del paquete), pero he intentado muchas implementaciones de CRC8 para verificar el byte PEC en vano. El bloque de código que estoy usando ahora vino de OneWire:

uint8_t OneWire::crc8(const uint8_t *addr, uint8_t len)
{
    uint8_t crc = 0;

    while (len--) {
        uint8_t inbyte = *addr++;
        for (uint8_t i = 8; i; i--) {
            uint8_t mix = (crc ^ inbyte) & 0x01;
            crc >>= 1;
            if (mix) crc ^= 0x8C;
            inbyte >>= 1;
        }
    }
    return crc;
}

Lo reescribí para considerar solo el byte:

int smbCRC(int message) {

    uint8_t crc = 0;

  uint8_t inbyte = message & 0xFF;
  for (uint8_t i = 8; i; i--) {
    uint8_t mix = (crc ^ inbyte) & 0x01;
    crc >>= 1;
    if (mix) crc ^= 0x8C;
    inbyte >>= 1;
  }

    return crc;
}

Pero su CRC no coincide con el de la hoja de datos MLX (Figura 8 de aquí por ejemplo). Cuando imprimo un int con su CRC8 así:

int message = 0x3aD2;
lcd.print(String(message,HEX) + " " + String(smbCRC(message),HEX));

Recupero "3ad2 eb", aunque la hoja de datos dice que el PEC correcto es 0x30. ¿A dónde me voy mal? Parece que esto podría ser causado por una mala implementación de CRC o por suposiciones erróneas de mi parte acerca de la entrada de CRC, y no estoy seguro de dónde comenzar la solución de problemas.

    
pregunta Noah

2 respuestas

2

El código que tienes arriba es un polinomio de x8 + x5 + x4 + 1. Pensé que me parecía familiar y simplemente revisé algunos códigos y es lo que usan los dispositivos de 1 cable de Dallas, así que supongo que has encontrado algunos código escrito para esos dispositivos (como también se indica en el nombre de la clase).

El x8 + x2 + x1 + 1 que requiere este dispositivo también se conoce como CRC-8-CCITT. Hay un problema con su código modificado, pero vuelva a la primera versión e intente cambiar de 0x8C a 0xE0 . Hay una tabla de ellos en Wikipedia bajo representaciones polinómicas de las verificaciones de redundancia cíclica .

    
respondido por el PeterJ
0

Me ha quedado claro en este punto que todo lo que podría salir mal, tiene.

Usé una calculadora para averiguar exactamente qué estaban considerando los ejemplos de CRC en las figuras de la hoja de datos, y descubrí que el comando, la dirección y los datos eran parte del cálculo. El primer problema fue que no estaba suministrando suficientes datos al algoritmo.

Para la Figura 8, el paquete completo fue 0xb407b5d23a - > 0x30

Para la Figura 9, el paquete completo fue 0xb42207c8 - > 0x48

Actualmente me distraigo con un proyecto diferente en el trabajo, ¡pero actualizaré esta respuesta pronto!

    
respondido por el Noah

Lea otras preguntas en las etiquetas