# FlexRay

FlexRay es un protocolo de comunicaciones para buses de datos en el automóvil desarrollado por el consorcio FlexRay entre 2000 y 2009. Se considera más avanzado que el CAN y el MOST en lo relativo al precio y a las prestaciones.

## Características

Sus características más destacadas son:
* Una alta transmisión de datos (10 megabits por segundo)
* Un comportamiento estimulado por factores temporales
* Redundancia, seguridad y tolerancia de errores
Las especificaciones de este protocolo están siendo actualmente revisadas. El primer vehículo del mercado que contaba con este tecnología fue el BMW X5, lanzado al mercado en enero de 2007. Este vehículo se basa en esta tecnología para comunicar los sensores en los amortiguadores con una centralita electrónica central que sirve como reguladora. El objetivo de este sistema es una respuesta rápida a los asperezas de la carretera para lograr una conducción lo más suave posible. Se espera el uso de esta tecnología a gran escala en el 2008. La versión actual es la 3.0 (2009).

## Creación

El consorcio FlexRay fue fundado en septiembre de 2000 por BMW, Daimler AG (matriz de Mercedes), Philips y Motorola y actualmente está compuesto por los siguientes miembros:
* Volkswagen
* BMW
* Daimler AG
* General Motors
* Robert Bosch GmbH
* NXP Semiconductors, ahora independiente y que perteneció a Philips
* Freescale, ahora pertenece a NXP Semiconductors

## Detalles técnicos
### Reloj

El sistema FlexRay consiste de un bus y procesadores, que son los "cerebros" de las centralitas electrónicas. Cada centralita tiene un reloj independiente. La desviación del reloj no puede ser más de 0,15% del reloj de referencia, de forma que la diferencia de ticks entre el reloj más lento y el más rápido no puede ser más de 0,3%. En otras palabras, 300 ciclos de una centralita emisora pueden ser 299 o 301 de una centralita receptora. Los relojes se reajustan frecuentemente (cada 300 ciclos) para evitar problemas de desfase.

### Bits en el bus

| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
Desviación de 2 ciclos en situaciones libres de errores.
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
Los errores en las cercanías del centro en un ciclo de 8 se cancelan.
| 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
Los errores junto a los bordes de un ciclo de 8 pueden afectar al bit fronterizo.
En cada momento solo una centralita emite en el bus. Cada bit se mantiene en el bus durante 8 ciclos de reloj. Cada receptor contiene un búfer de los 5 últimos ciclos.
Errores de transmisión en un único ciclo pueden afectar los resultados de los bits fronterizos, pero no en el centro de un ciclo de 8 bits.

### Muestreo de bits

El valor del bit se muestrea en el centro de una región de 8 bits. Los errores se desplazan a los ciclos extremos, y el reloj se sincroniza frecuentemente para evitar desfases.

### Estructura

Toda la comunicación se envía en estructuras soporte (o frames). Un mensaje consiste en bytes $\{x_{0},x_{1},\dots ,x_{m-1}\}$, empaquetados de la siguiente forma:
* Señal de inicio de transmisión (Transmission Start Signal, TSS) - bit 0
* Señal de inicio de la estructura (Frame Start Signal, FSS) - bit 1
* $m$ veces:
** Señal de inicio de byte 0 (BSS0) - bit 1
** Señal de inicio de byte 1 (BSS1) - bit 0
** 0-ésimo bit del i- byte
** 1. bit del i-ésimo byte
** 2. bit del i-ésimo byte
** 7. bit del i-ésimo byte
* Señal de fin de la estructura (FES) - bit 0
* Señal de fin de la transmisión (TES) - bit 1
Si no hay ningún mensaje en el bus, el valor es igual a 1 (voltaje alto), de forma que cada receptor sabe que la comunicación comienza cuando el voltaje cambia a 0.
El receptor sabe si el mensaje es completo comprobando que o BSS0 (1) o FES (0) han sido recibidos.
Hay que destacar que un ciclo de 8 por bit no tiene nada que ver con bytes. Se necesitan 80 ciclos para transmitir un solo byte, 16 para BSS0 y BSS1 así como 64 para sus bits. Igualmetne, BSS0 siempre tiene el valor 0 y BSS1 el valor 1.

### Sincronización del reloj

Los relojes se vuelven a sincronizar cuando la señal votada cambia de 1 a 0, si el receptor estaba en el estado de espera o aguardando BSS1.
De esta forma el reloj se sincroniza cuando la transmisión comienza y entre un BSS0 y un BSS1. Como la sincronización se hace con la señal deseada, puede que pequeños errores de transmisión que afecten a los bits fronterizos distorsionen la sincronización, pero no más de un ciclo. Ya que hay, como mucho, 88 ciclos entre sincronizaciones (BSS1, 8 bits del último byte, FES y TES - 11 bits de 8 ciclos cada uno), y el desfase del reloj no es más de 1 en 300 ciclos, el desfase puede distorsionar el reloj como mucho un ciclo. Pequeños errores de transmisión durante la recepción solo pueden afectar a los bits fronterizos. De forma que, en el peor de los casos, los dos bits centrales son correctos y con ello el valor muestreado es correcto.
Aquí se muestra un ejemplo de un caso especialmente desfavorable - un error durante sincronización, un ciclo perdido debido a un desfase y un error de transmisión.
Errores que se producen en el ejemplo:
* Debido a un error de un solo bit durante la sincronización, la sincronización se demoró un ciclo.
* El reloj receptor fue más lento que el reloj emisor, de forma que el receptor no recibió un ciclo (marcado como X). Esto no pasará de nuevo hasta la próxima sincronización gracias a los límites máximos permitidos para la demora de un reloj.
* Debido a un error de un solo bit durante la transmisión, un bit se votó mal junto al resultado.
Aun así, a pesar de todos estos errores, la comunicación se recibió correctamente.
Las células verdes son puntos de muestreo. Todos, a excepción del primero, son sincronizados por el borde 1->0 mostrada en el fragmento de transmisión.
| Señal a enviar | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| Señal enviada | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| En el bus | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
| Recibido | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | X | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
| votados | | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | X | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |