calculo suma CRC8

hola mi proyecto se basa en enviar una cadena de bytes a traves de bus SPI a un display de un cuadro de instrumentos, he conseguido mostrar algunos digitos en el display con el byte de verificacion correcto por pura casualidad pero cuando cambio estos digitos por otros no funciona porque la suma no es la correcta. la cuestion es saber como calcular este byte desde las "capturas" que he hecho.

por ejemplo.

7E ED 0F CE CF CF CF DF DF DF DF DF DF DF DF DF DF DF DF 9E

los bytes en rojo siempre son iguales nunca cambian los verdes es el mensaje en si, en este caso "1000" estan invertidos o negados CE=31=1 ASCII CF=30=0 ASCII, DF son espacios en blanco y el byte en azul es la suma de verificacion.

seria posible calcular el polinomio a partir de varias capturas?

he aqui algunas de ellas

7E ED 0F CE CF CF CF DF DF DF DF DF DF DF DF DF DF DF DF 9E

7E ED 0F AC BE B9 BA DF DF DF DF DF DF DF DF DF DF DF DF 8E

7E ED 0F DF C7 C6 D1 CC B2 B7 A5 B9 B2 CE E3 CE E3 E3 E3 F5

Hola. ¿Seguro que los bits van invertidos? ¿No será que el modo spi no es el modo por defecto? Existen 4 modos (SPI_MODE0, SPI_MODE1, SPI_MODE2 y SPI_MODE3) dependiendo de la fase y polaridad del reloj. Tal vez el trabajar en otro modo esté produciendo esa inversión de bits, a no ser que hayas leído alguna documentación sobre el protocolo y realmente se inviertan los datos por alguna razón. Pero entiendo que andas intentando hacer ingeniería inversa ¿no?

noter: Hola. ¿Seguro que los bits van invertidos? ¿No será que el modo spi no es el modo por defecto? Existen 4 modos (SPI_MODE0, SPI_MODE1, SPI_MODE2 y SPI_MODE3) dependiendo de la fase y polaridad del reloj. Tal vez el trabajar en otro modo esté produciendo esa inversión de bits, a no ser que hayas leído alguna documentación sobre el protocolo y realmente se inviertan los datos por alguna razón. Pero entiendo que andas intentando hacer ingeniería inversa ¿no?

hola noter el modo SPI es el correcto ya que estoy haciendo capturas desde un dispositivo que muestra informacion en el display el porque invertir los bytes no lo se pero es asi seguro si te das cuenta en las cpaturas que he puesto se puede sacar los mensajes enviados al display, por ejemplo

7E ED 0F CE CF CF CF DF DF DF DF DF DF DF DF DF DF DF DF 9E CE!=31=1 ASCII, CF!=30=0 ASCII 1 0 0 0

7E ED 0F B7 B0 B3 BE BE BE DF DF DF DF DF DF DF DF DF DF 97 0F!=48=H ASCII, B0!=4F=O ASCII H O L A A A

7E ED 0F DF C7 C6 D1 CC B2 B7 A5 B9 B2 CE E3 CE E3 E3 E3 F5 C7!=38=8 ASCII, C6!=39=9 ASCII 8 9 . 3 M H Z F M 1 1

efectivamente estoy tratando de hacer ingenieria inversa, hasta donde he investigado no se trata de un polinomio crc8 si no de una relacion de congruencia, CRC=MODULO(SUM(255-DEC),256) por el momento no consigo resolver la operacion correctamente ya que no se interpretar bien la expresion aritmetica anterior.

La expresión que dices lo único que hace es un checksum sobre los datos (en este caso sobre los datos invertidos). En arduino sería fácil de implementar: sería definir un dato tipo byte, e ir sumando en él los datos a calcular, sin contar con los desbordamientos que se van a producir. Sin embargo, si bien la fórmula casa perfectamente con los ejemplos de la página a la que hacías referencia, con los datos que pones aquí no hay forma. Tal vez no sea checksum, sino CRC (habría que ver con qué polinomio) o tal vez se nos escapa algo más. Por de pronto, las tramas que muestras tú tienen algo más de encabezamiento, pues en las otras veo que empieza directamente con el 0F.

exacto! tiene un par de bytes mas, el primero lo envia con la señal ss a nivel bajo(inactivo) despues cambia a nivel alto para los 19 bytes restantes, es lo que me despista ya que no se si hay que contar con el o no para el calculo de la suma, pero he probado de todo con y sin el, empece probando con las calculadoras crc online que son muchas y variadas y no consigo dar con un polinomio valido, ya que los que eran validos para un mensaje en concreto no lo eran si cambiaba uno o varios bytes del mensaje, si no consigo dar con el podria escribir los mensajes con el crc predefinido pero limitaria mucho la capacidad del proyecto. ¿¿alguna idea??

Hola ya se como calcularlo se trata simplemente de una suma de redundancia vertical (VRC) y al byte resultante solo hay que sumarle 1 asi de simple!!! Pero el problema es como implementarlo en mi codigo....

7E ED 0F AC BE B9 BA DF DF DF DF DF DF DF DF DF DF DF DF 8E

arriba captura original del mensaje, los 3 primeros bytes el encabezado, y el ultimo el byte a calcular de esta manera aplicando una XOR y sumando uno al byte resultante bingo!!!

7E^ED^0F^AC^BE^B9^BA^DF^DF^DF^DF^DF^DF^DF^DF^DF^DF^DF^DF=8D+1= 8E

Y cual es el problema, la trama como la tienes, en un vector o es lo que vas leyendo?
creas un suma xor en una variable byte

// supongo que trama es un vector de 20 valores
// 7E ED 0F AC BE B9 BA DF DF DF DF DF DF DF DF DF DF DF DF 8E
// trama[0] = 7E etc etc 
// trama[1] = ED
// no son asignaciones ya supongo que el vector esta cargado 
for (i=0; i<20; i++) {
     byte calculo ^= trama[i]; 
}
calculo |= 1;