¿Cómo funciona una verificación de CRC entre un microcontrolador y EEPROM?

Tengo comunicación entre una EEPROM y un microprocesador sobre SPI y quiero cuidar la integridad de los datos.

¿Podría confirmar mi comprensión a continuación?

Tengo datos que quiero escribir en la EEPROM junto con un código CRC. Antes de escribir en EEPROM, usaré un polinomio CRC16 para generar un código CRC y lo agregaré a los datos y lo enviaré a través de SPI a EEPROM.

Cuando leo la EEPROM después del reinicio del sistema o ajuste el tiempo nuevamente a través de SPI desde el microcontrolador, se leen los datos junto con el código CRC (datos + CRC) y se divide por el mismo polinomio CRC16 para verificar con el resto cero. Si cero datos es bueno, de lo contrario no.

¿Podría confirmar si mi comprensión anterior es correcta?

Solo tengo que implementar la integridad de datos para un bloque de memoria y para eso estoy haciendo una verificación de CRC dual para un solo bloque de memoria implementando un bloque redundante.

con una suma de comprobación (sumando todos los bytes) puede hacer que el resultado sea todos ceros o todos unos. Con un CRC esto no se espera, no es normal. ejecuta todos menos los bytes de crc a través del algoritmo y luego los compara con los bytes de crc en la eeprom.
@old_timer O eso, o calcular el CRC de datos + CRC y esperar tener un valor de verificación constante, que en el caso más simple se puede diseñar a cero. Ya se ha comentado más abajo.
Bueno, ciertamente no es fácil de diseñar a cero, eso requiere un CRC débil o una gran cantidad de bytes de relleno utilizados para ajustar el resultado final. En general, no desea un CRC débil, por lo que, en general, cómo funciona es verificar los bytes, la excepción sería intentar obtener un resultado fijo sin importar cuál sea la carga útil. Para una suma de verificación, es común integrar los datos de relleno para obtener un resultado fijo, más normal que una excepción.

Respuestas (1)

El resto siempre será el mismo, pero si siempre es cero o algo más depende del algoritmo CRC exacto, es decir, el "xor final".

Si tiene que escribir, por ejemplo, 10 bytes de datos y ha calculado 2 bytes de CRC a partir de esos datos, escribe 12 bytes en la memoria.

Cuando lea si retrocede, lea los 12 bytes, calcule el CRC a partir de los primeros 10 bytes y verifique que el CRC calculado coincida con los 2 bytes de CRC leídos de la memoria.

También hay otro método para calcular el CRC de los 12 bytes leídos, se sumará a un valor de verificación constante si el CRC es correcto, pero dependiendo del algoritmo CRC que use, el resultado podría ser siempre cero, pero puede ser algo. más también

Gracias, de acuerdo con mi entendimiento.
Será cero, si la última palabra es CRC. CRC(Datos+CRC)=0
@MarkoBuršič será cero, si el algoritmo para calcular el CRC sobre CRC y los datos no incluye un xor final. Por lo tanto, el valor de verificación siempre puede ser cero o alguna otra constante distinta de cero, según el algoritmo que se utilice.