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.