martes, 24 de mayo de 2016

Calculate CRC byte in a 20 byte SPI message

Hola el objetivo de este blog es dar a conocer de que forma trabaja el FIS de los coches vw del 98 al 2004, gracias a Kovo y su proyecto http://kovo-blog.blogspot.com.es/2013/11/audi-fis-3-line-protocol.html he podido comprender un poco mas acerca de como funciona, haciendo los cambios oportunos en el codigo puedo escribir el texto que yo quiera en la parte superior de la pantalla.



La forma en que la radio muestra informacion en la pantalla es sencilla utuiliza un bus de 3 lineas llamado "3LB" desconozco de donde procese ese nombre pero lo cierto es que es un bus SPI simplificado a 3 hilos ENABLE, DATA y CLOCK donde ENABLE es la señal de seleccion de esclavo SS DATA es la señal MOSI donde se enviaran los bits con el texto a mostrar y CLOCK es la señal de sincronia de reloj.

Un ejemplo de una señal generada por la radio original del coche  

el texto a mostrar es el siguiente:
  8  9  .  3  M  H  Z 
      F  M  1     1 

Y estos son los datos enviados por la radio para este mismo mensaje:
7E ED 0F DF C7 C6 D1 CC B2 B7 A5 B9 B2 CE E3 CE E3 E3 E3 F5

Los bytes en negro es el mensaje en si, con la peculiaridad que estan invertidos, donde DF invertivo=20 hexadecimal= "espacio en blanco" ASCII C7invertido=38 hexadecimal=8 ASCII y asi sucesivamente, los primeros 8 bytes representan la linea superior del display y los 8 ultimos la linea inferior.
 Los bytes en azul siempre se envian asi sea cual sea el texto a mostrar, el byte verde es la suma de verificacion y el byte rojo es parecido a los azules, siempre se envia aunque este lo hace con la señal ENABLE a nivel bajo, desconozco porque es asi pero a diferencia de los ejemplos de audi que podemos ver en el blog de Kovo el byte rojo y el primer byte azul no se envian en el cuadro audi.

El problema lo encuentro para calcular la suma de verificacion ya que segun los ejemplos de audi se calcularia de la siguiente forma:
pasamos los bytes a decimal, le restamos 255 a cada byte sumamos el resultado de todos los bytes y a ese producto sacamos la relacion de congruencia entre 256, de otra manera.

CRC=MODULO(SUM(255-DEC),256)



pero si bien esta formula casa perfectamente para audi en vw no es asi si realizamos la operacion 

si realizamos la operacion anterior con el ejemplo expuesto obtendremos como resultado 36 decimal, que es 24 hexadecimal cuando deberia ser F5 por tanto esta formula no es valida, mientras trabajo para hallar la formula adecuada para el calculo de es te byte dejo mas ejemplos por si alguien quiere aceptar el desafio.

7E ED 0F DF C7 C6 D1 CC B2 B7 A5 B9 B2 CE E3 CE E3 E3 E3 F5   
7E ED 0F B7 B0 B3 BE BE BE DF DF DF DF DF DF DF DF DF DF 97 
7E ED 0F CE CF CF CF DF DF DF DF DF DF DF DF DF DF DF DF 9E

hasta ahora he probado mediante VRC(vertical redundancy check) de la siguiente forma:

0111 1110 7E
1110 1101  ED
0000 1111  0F
1100 1110  CE
1100 1111  CF
1100 1111  CF
1100 1111  CF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1101 1111  DF
1001 1101 9D

La formqa correcta es sumando 1 al byte resultante de forma que 9D + 1 = 9E de esta manera siempre coincide

1 comentario:

  1. hola me puede dar el código de Arduino? También estoy interesado en esta información para mi golf4 vw

    ResponderEliminar