0x7B0, la ECU responsable del ABS y del control de tracción

Iniciamos la ardua tarea de tratar de obtener información de las distintas ECUs del toyobaru.

Obtener información sobre las ECUs de un vehículo no es sencillo si no se tiene la información del fabricante. Los protocolos de diagnóstico dejan mucha libertad a los fabricantes para que usen múltiples servicios e identificadores propios y apenas normalizan nada. Y esa libertad la usan plenamente y guardan celosamente la información.

Así que solo cabe rebuscar cualquier información que se haya podido filtrar por internet y someter a la ECU a distintas técnicas de 'ingeniería inversa' para tratar de obtener algo de información.

Pese a que es una tarea complicada, me he propuesto intentar avanzar en el conocimiento de las ECUs -cosa que no se si lograré- e ir comentando los avances que realice en este blog.

Y después de buscar información sobre otros modelos de Toyota y Lexus, y realizar mis primeras pruebas, creo haber identificado la ECU que responde al CAN ID 0x7B0 como la ECU responsable del sistema ABS y del control de tracción.

Por un lado, y según la escasa información que circula por internet, el identificador 0x7B0 suele ser asignado con cierta frecuencia por Toyota (y Lexus) a dicha ECU, en otros vehículos.

Esto en si mismo no serviría más que como hipótesis. Para asegurar que la ECU gestiona el ABS y el control de tracción deberíamos obtener alguna otra evidencia.

Y resulta que la primera información que he conseguido obtener de la ECU 0x7B0 -como veremos más adelante- ha sido la velocidad de las ruedas, que es una información que maneja dicha ECU.

Eso me ha llevado a confirmar que también en nuestros GT86 y BRZ, la ECU 0x7B0 se encarga de gestionar estos sistemas.

Pero vayamos por partes. En la entrada anterior hemos visto como identificábamos las direcciones de las ECUs mediante la respuesta al servicio UDS 0x21. Así, si solicitamos el servicio 0x21 con PID 0x00.

>> 7B0: 02 21 00 00 00 00 00 00

la ECU nos devuelve

<< 7B8: 06 61 00 3D 50 00 03 00

La respuesta resulta familiar para alguien conocedor de los protocolos OBDII, pues en particular esta respuesta tiene la misma forma con la que se contesta al PID 0x00 en otros servicios normalizados (como el 0x01 o el 0x09 que hemos visto en entradas anteriores de este blog)

Decodificando esa respuesta de forma normalizada, obtenemos que la centralita dice soportar los PIDs 0x03, 0x04, 0x05, 0x06, 0x08, 0x0A, 0x0C, 0x1F y 0x20 entre los primeros 32 PIDs.

Si el PID 0x20 se comporta de la misma forma que en un servicio 0BDII, su invocación nos dirá que PIDs están soportados en los siguientes 32 PIDs.

Probamos y obtenemos:

>> 7B0: 02 21 20 00 00 00 00 00
<< 7B8: 06 61 20 80 00 00 CB 00

La decodificación de la respuesta dice que la centralita también soporta los PIDs 0x21, 0x39, 0x3A, 0x3D, 0x3F, y 0x40.

Y el procedimiento se repite para el PID 0x40. Solicitándoselo a la ECU para el servicio 0x21 obtenemos esta vez:

>> 7B0: 02 21 40 00 00 00 00 00
<< 7B8: 06 61 40 E6 00 00 C3 00

Cuya decodificación indica que los PIDs 0x41, 0x42, 0x43, 0x46, 0x47, 0x59, 0x5A, 0x5F y 0x60. Y con éste último repetimos el proceso:

>> 7B0: 02 21 60 00 00 00 00 00
<< 7B8: 06 61 60 00 00 00 01 00

La decodificación esta vez indica que solo se soporta el PID 0x80, con el que reiteramos la operación:

>> 7B0: 02 21 80 00 00 00 00 00
<< 7B8: 06 61 80 00 00 00 01 00

Devuelve el mismo valor que la invocación al PID 0x60, indicando en este caso que únicamente está soportado el PID 0xA0.

Repetimos la operación, ahora con el PID 0xA0, y obtenemos:

>> 7B0: 02 21 A0 00 00 00 00 00
<< 7B8: 06 61 A0 14 00 00 05 00

Esta vez la decodificación señala a los PIDs 0xA4, 0xA6, 0xBE y 0xC0 como PIDs soportados.

Solicitamos ahora el PID 0xC0

>> 7B0: 02 21 C0 00 00 00 00 00
<< 7B8: 06 61 C0 00 00 00 01 00

obteniendo como respuesta el mismo valor que obtuvimos a la consulta al PID 0x60 y 0x80 y que indica que sólo el último PID de la serie (el 0xE0 en este caso) está soportado.

Solicitamos el PID 0xE0 y obtenemos

>> 7B0: 02 21 E0 00 00 00 00 00
<< 7B8: 06 61 E0 C0 00 C0 00 00

cuya decodificación confirma a 0xE1, 0xE2, 0xF1 y 0xF2 como PIDs soportados.

Con esta última invocación a la ECU hemos finalizado el proceso de identificación de los PIDs que esta ECU soporta bajo el servicio 0x21.

A continuación paso a solicitar a la ECU todos y cada uno de los PIDs que ha dicho soportar. No tengo ni idea de lo que va a devolver, pero quiero averiguar cuantos datos devuelve cada PID y confirmar que las respuestas, por lo menos, están dentro del protocolo de transporte ISO 15765-2 tal y como ocurre para los servicios OBDII.

Y así es también para este servicio, tanto en las tramas cortas (de 5 bytes de datos o menos) que requieren solo un mensaje CAN

>> 7B0: 02 21 03 00 00 00 00 00
<< 7B8: 06 61 03 00 00 00 00 00

como para las tramas de datos largas, que requieren varias tramas y un diálogo con la ECU.

>> 7B0: 02 21 05 00 00 00 00 00
<< 7B8: 10 09 61 05 7F 82 02 B3
>> 7B0: 30 00 00 00 00 00 00 00
<< 7B8: 21 00 01 60 00 00 00 00

Esto nos permite averiguar cuantos datos va a devolver cada PID y empezar a elaborar la siguiente tabla

ECU 0x7B0. Servicio 0x21

PID Longitud
(bytes)
Unidades Cálculo Descripción Status
0x00 4 - Evaluación de bits PIDs soportados [0x01...0x20] Confirmado
0x03 4


Desconocido
0x04 1


Desconocido
0x05 7


Desconocido
0x06 3


Desconocido
0x08 1


Desconocido
0x0A 1


Desconocido
0x0C 1


Desconocido
0x1F 1


Desconocido
0x20 4 - Evaluación de bits PIDs soportados [0x21...0x40] Confirmado
0x21 1


Desconocido
0x39 1


Desconocido
0x3A 1


Desconocido
0x3D 2


Desconocido
0x3F 2


Desconocido
0x40 4 - Evaluación de bits PIDs soportados [0x41...0x60] Confirmado
0x41 2


Desconocido
0x42 4


Desconocido
0x43 2


Desconocido
0x46 3


Desconocido
0x47 5


Desconocido
0x59 1


Desconocido
0x5A 2


Desconocido
0x5F 1


Desconocido
0x60 4 - Evaluación de bits PIDs soportados [0x61...0x80] Confirmado
0x80 4 - Evaluación de bits PIDs soportados [0x81...0xA0] Confirmado
0xA0 4 - Evaluación de bits PIDs soportados [0xA1...0xC0] Confirmado
0xA4 8


Desconocido
0xA6 2


Desconocido
0xBE 1


Desconocido
0xC0 4 - Evaluación de bits PIDs soportados [0xC1...0xE0] Confirmado
0xE0 4 - Evaluación de bits PIDs soportados [0xE1...0x100] Confirmado
0xE1 7


Desconocido
0xE2 5


Desconocido
0xF1 3


Desconocido
0xF2 6


Desconocido

El siguiente reto es completar la tabla y tratar de entender que representa cada PID.

Para ello he empezado solicitando a la ECU 0x7B0 el PID 0x03 bajo el servicio UDS 0x21, con una frecuencia de 20 veces por segundo y me he dado un paseo de un par de kilómetros circulando con el coche.

Una vez recabados los datos hay que analizarlos para tratar de descubrir de que se trata. En la mayoría de las ocasiones puede ser misión imposible, pero esta vez ha resultado relativamente sencillo.

Por un lado, partía de la sospecha de que estaba analizando la ECU responsable del ABS y el control de tracción, así que si eso era cierto me estaba enfrentando a datos relacionados con la dinámica del vehículo. Debía encontrarme con velocidades, aceleraciones, giros y cosas así.

Por otro lado, el análisis de las respuesta muestra que devuelven 4 valores que normalmente coinciden entre si, así que rápidamente uno se hace la idea de que puede estar en frente de las 4 velocidades de las ruedas.

Eso es fácil de comprobar, por que como vimos en una entrada pasada del blog, las velocidades de las ruedas las tenemos disponibles en el bus CAN, en el CAN ID 0x0D4.

Así que si comparamos los dos primeros bytes del mensaje 0x0D4 (con D1 más significativo que D0 y escala en el eje izquierdo) con el tercer byte que manda la ECU (primer byte de datos, con escala en el eje derecho) obtenemos:

Comparativa 0x7B0 Servicio 0x21 PID 0x03 D3 versus CAN ID 0x0D4 D1D0

La gráfica parece encajar bastante bien (escalas a parte) pero se aprecian momentos puntuales donde aparecen ligeras diferencias y las líneas se separan entre si.

Viendo el resto de graficas comparativas, vemos que esas diferencias se producen también en los otros gráficos, pero en sentido contrario. Es decir, parece que estemos analizando las ruedas de forma cruzadas.

Para corroborarlo, comparamos ahora los dos primeros bytes del mensaje 0x0D4 (con D1 más significativo que D0 y escala en el eje izquierdo) con el cuarto byte que manda la ECU (primer byte de datos, con escala en el eje derecho) y obtenemos:

Comparativa 0x7B0 Servicio 0x21 PID 0x03 D4 versus CAN ID 0x0D4 D1D0

donde vemos que las diferencias anteriores ya no aparecen y todo encaja mucho mejor. Y lo mismo ocurre con el resto de datos.

Los bytes D3D2 del mensaje 0x0D4 encajan con el primer dato enviado por la ECU 0x7B0 en el servicio 0x21 PID 0x03

Comparativa 0x7B0 Servicio 0x21 PID 0x03 D3 versus CAN ID 0x0D4 D3D2

y lo mismo ocurre con los bytes D5D4 del mensaje 0x0D4 y el cuarto dato enviado por la ECU

Comparativa 0x7B0 Servicio 0x21 PID 0x03 D6 versus CAN ID 0x0D4 D5D4

y los bytes D7D6 del mensaje 0x0D4 y el tercer dato enviado por la ECU.

Comparativa 0x7B0 Servicio 0x21 PID 0x03 D5 versus CAN ID 0x0D4 D7D6

Se confirma ... salvo las diferencias de escala y precisión (motivadas por que en un caso usamos 8 bits para representar la información y en el otro caso tenemos hasta 16 bits) estamos en frente de las velocidades de las ruedas.

Queda por encontrar el factor de escala. Si recordamos, la información obtenida en 0x0D4 había que multiplicarla por el factor 0,05747 para obtener la velocidad de las ruedas en km/h.

Podemos, por tanto, deducir por que valor hay que multiplicar la serie de datos que manda la ECU, para aproximar a la velocidad a km/h. El factor corrector que resulta de los cálculos con los datos obtenidos es de 1,3474, es decir, el valor que envía la ECU hay que multiplicarlo por este valor para tener la velocidad de la rueda en km/h.

No se muy bien que interés puede tener que la ECU ofrezca esta información bajo este servicio cuando la misma información está disponible, con mayor resolución (2 bytes vs. 1 byte) y con una elevada frecuencia de 50 Hz. en el bus CAN, pero por lo menos nos sirve para confirmar que la ECU 0x7B0 es la ECU responsable del ABS y del control de velocidad.

Y podemos rellenar una entrada de la tabla

ECU 0x7B0. Servicio 0x21
 
PID Longitud
(bytes)
Unidades Cálculo Descripción Status
0x03 4
A,B,C,D
km/h * 1,3474 A -> Velocidad rueda delantera derecha
B -> Velocidad rueda delantera izquierda
C -> Velocidad rueda trasera derecha
D -> Velocidad rueda trasera izquierda
Confirmado

Ahora solo queda ir preparando las distintas pruebas y analizar los datos obtenidos para ir completando la tabla.

Añadir un comentario

El código HTML se muestra como texto y las direcciones web se transforman automáticamente.

Page top