SixSigmatas

Como Funciona a Rede CAN Automotiva por em

Funcionamento da CAN

Visão Geral: Mensagens

Como vimos no artigo anterior , a utlização da rede CAN torna possível a comunicação entre os módulos através de informação distribuída por um par de fios trançados. Essa solução é bastante vantajosa tanto do ponto de vista de custo como na disponibilização da informação. Para este artigo vamos nos referir às informações que circulam na rede por 'mensagens'.

As mensagens enviadas ao barramento CAN, pelos módulos, recebem um número de identificação (ID) que define a sua prioridade no sistema e independe totalmente por qual módulo está sendo enviada. A mensagem é recebida por todos os módulos presentes na rede, mas, somente os módulos que necessitam daquela informação em particular, é que irão processá-la.

A atribuição da prioridade para cada mensagem depende de implementações de bibiotecas de dados por parte do aplicador, que relaciona um índice (prioridade) à um conteúdo (mensagem). A biblioteca de dados tem que estar presente em todos os módulos do sistema, gravada em sua memória interna (‘firmware’).

Essa flexibilidade no protocolo CAN permite a sua utilização por outros protocolos que usufruem de sua constituição robusta, formas de sincronização, detecção e correção de erros. Podemos citar as normas J1939, CanOPEN e KWP2000, como exemplos. A rede CAN também opera com o protocolo OBD-2 em diagnósticos automotivos e controle de emissões, que serão tratados em um próximo artigo sobre diagnóstico e monitoramento.

A codificação de mensagens que veremos a seguir obedecem à especificação BOSCH CAN2.0 A. Particularidades do uso da CAN por outros protocolos devem ser consultadas diretamente, por exemplo, Google: J1939. Os dois exemplos fornecidos no artigo irão ajudar à tirar possíveis dúvidas sobre o funcionamento na troca e verificação das mensagens e o entendimento da base explanada neste artigo é fundamental para a compreensão do uso da CAN em qualquer protocolo.

Níveis Elétricos no Barramento

Tensões na rede CAN

Figura 1 - Tensão diferencial entre CAN_H e CAN_L e tensões individuais em relação ao aterramento

As mensagens na rede CAN são transmitidas por pulsos elétricos. O barramento tem dois estados antagônicos:

  • ‘Recessivo’
    quando está sem atividade, ou seja, transmitindo sinais elétricos com baixo diferencial entre CAN_H e CAN_L;
  • ‘Dominante’
    quando está transmitindo sinais elétricos com alto diferencial entre CAN_H e CAN_L.

A tensão considerada pelos módulos instalados na CAN não é a diferença de potencial em cada cabo em relação ao terra, mas sim, a diferença entre as tensões entre eles (CAN_H e CAN_L) em um dado instante. Baseando-nos na ISO 11898-2 [#13], podemos caracterizar a diferença de tensão (Vdif), da seguinte forma:

Dominante
NL=0: Vdif = VCAN_H – VCAN_L >= 0,9 V, nominalmente Vdif = 3,5 – 1,5 = 2,0 V

Recessivo
NL=1: Vdif = VCAN_H – VCAN_L < 0,5 V, nominalmente Vdif = 2,5 – 2,5 = 0,0 V

Observações:
  • Mes­mo es­tan­do Re­ces­si­vo, na au­sên­cia de men­sa­gens, e­xis­te uma ten­são em torno de 2,5 V em ambos os cabos, com Vdif pró­xi­mo de zero.
  • Qual­quer mó­du­lo ins­ta­la­do na CAN tem a ca­pa­ci­da­de de al­te­rar o es­ta­do da re­de, de Re­ces­si­vo para Do­mi­nan­te. Bas­ta um mó­du­lo en­viar um sinal Do­mi­nan­te para que toda a rede as­su­ma es­sa con­fi­gu­ra­ção [#11], in­de­pen­den­te­men­te do nú­me­ro de mó­du­los que es­te­jam en­vi­an­do sinais e­lé­tri­cos Re­ces­si­vos.
Tensões e níveis lógicos na rede CAN
Figura 2 - Representação incomum adotada na CAN: nível lógico alto na presença de sinal elétrico baixo
  • So­men­te uma men­sa­gem por vez po­de es­tar pre­sen­te no bar­ra­men­to, já que a in­ter­fe­rên­cia de ou­tros mó­du­los al­te­ra­ri­a o seu con­te­ú­do.

Níveis Lógicos do Barramento

Os níveis de tensão no cabeamento são recebidos pelo transceiver [#1] [#8] presente nos módulos, que faz a conversão dos sinais elétricos para dígitos binários através da diferença de potencial entre CAN_H e CAN_L.

Observe a utilização da lógica invertida entre o barramento CAN e a mensagem codificada pelo transceiver, contrariando a atribuição mais comum de nível lógico 1 dado à um sinal elétrico mais alto e do nível lógico 0, dado à um sinal elétrico mais baixo [#4]. Após a conversão, os sinais Dominantes são transformados em zeros e os sinais Recessivos, em uns.


Formato das Mensagens

Cada sinal lógico, ou ‘bit’, recebido é agrupado de acordo com um conjunto de regras que formam pacotes denominados ‘frames’. Esses frames constituem as mensagens que circulam no barramento.
Para o CAN padrão [#12] [#16], a formação deste pacote obedece ao seguinte esquema:

Formato do frame em redes CAN padrão

Figura 3 - Esquema da composição de um frame em rede CAN 2.0A

Ciclo de uma Mensagem

Para efeitos didáticos, vamos separar o ciclo das mensagens em duas partes:

  • Formato, contemplando o início da transmissão, arbitração, e composição;
  • Tratamento de erros, contemplando a verificação, o reconhecimento e finalização.

Início da Transmissão

Inicio da transmissão de uma mensagem pela CAN

Figura 4 - Barramento incialmente em Idle recebendo uma mensagem
  • Pa­ra um mó­du­lo po­der en­vi­ar uma men­sa­gem é ne­ces­sá­rio que o bar­ra­men­to es­te­ja em es­ta­do re­ces­si­vo, ou idle, sig­ni­fi­can­do que não e­xis­te, no mo­men­to, men­sa­gens sen­do trans­mi­ti­das.
  • Se um de­ter­mi­na­do mó­du­lo ne­ces­si­ta en­vi­ar um fra­me, a in­for­ma­ção pas­sa­da pelo trans­ceiver ao co­man­do da CAN con­fir­ma que a trans­mis­são po­de ser i­ni­ci­a­da. O mó­du­lo en­vi­a, então, um bit do­mi­nan­te, NL= 0, no­ti­fi­can­do o i­ní­cio da men­sa­gem, a par­tir do qual é fe­i­to o sin­cro­nis­mo com os ou­tros mó­du­los.

Arbitração

Verificação da mensagem transmitida pelo próprio módulo transmissor

Figura 5 - Verificação da validade da mensagem enviada pelo módulo transmissor
  • Em se­gui­da, o con­tro­le da CAN ini­cia o en­vio dos onze bits do ID, um de cada vez, com­pa­ran­do o nível ló­gi­co do bit en­vi­a­do com o ní­vel ló­gi­co do bar­ra­men­to.
  • Ess­a ve­ri­fi­ca­ção, de­no­mi­na­da ar­bi­tra­ção, é ne­ces­sá­ia por­que ou­tro mó­du­lo po­de­ria ter i­ni­ci­a­do si­mul­ta­ne­a­men­te, o en­vio de uma men­sa­gem. Nes­sa si­tu­a­ção, ao fazer a com­pa­ra­ção do bit en­vi­a­do com o ní­vel ló­gi­co do bar­ra­men­to, ha­ve­rá co­in­ci­dên­cia a­pe­nas no mó­du­lo cuja men­sa­gem tem maior pri­o­ri­da­de. O mó­du­lo cujo nível ló­gi­co di­fe­re irá in­ter­rom­per o en­vio e o mó­du­lo com nível ló­gi­co co­in­ci­den­te con­ti­nu­a­rá a trans­mis­são.

Processo de Arbitração entre mensagens

Figura 6 - Processo de Arbitração

O processo é bastante interessante do ponto de vista elétrico. Uma vez que o estado dominante sempre irá sobrepor um estado recessivo; quando da comparação entre as duas mensagens tudo ocorre como se somente a mensagem de maior prioridade estivesse sendo transmitida. O barramento simplesmente não toma conhecimento da mensagem com a prioridade menor, como ilustrado na figura 6.

Tipo de Mensagem

Definida a mensagem de maior prioridade, o próximo bit, denominado RTR, irá identificar se a mensagem é uma informação ao barramento (data frame), ou se é uma requisição de dados (remote frame):

  • bit Recessivo, 1: a mensagem contém uma informação para o barramento;
  • bit Dominante, 0: algum módulo necessita uma informação de outro módulo.

Independentemente do tipo de mensagem, dado ou requisição, os 2 bits seguintes, IDE e RSV, não tem influência alguma quando consideramos apenas a CAN padrão 2.0 A. O primeiro deles, neste caso é sempre um (recessivo). O segundo bit na sequencia é um bit reservado, sem utilização especificada até o momento, portanto, também um.

Os próximos 4 bits, DLC, indicam o tamanho em bytes (1 byte = 8 bits) da mensagem.

Independentemente de ser uma informação ou uma requisição, DLC irá ter o mesmo comprimento, já que a mensagem que irá retornar no caso de requisição, irá ser sobre-escrita, ocupando o mesmo tamanho da informação enviada ao barramento.

Composição da Mensagem

Os dados, que podem ter até 8 bytes, obedecem à regras da norma J1979 (OBD)[#5] [#6], que define os modos de teste de diagnósticos. Seu formato depende do tipo de unidade que está sendo considerada, por exemplo, a rotação do motor é definida por 2 bytes, enquanto que a velocidade do veículo é informada por 1 byte apenas.

Neste método de codificação, o primeiro byte é denominado de MSB (Most Significant Byte, ou byte mais significativo) e o segundo byte é denominado de LSB (Less Significant Byte, ou byte menos significativo). A conversão para o valor decimal da representação consiste em se multiplicar o MSB por 256 e somar o LSB, podendo em função da mensagem, sofrer alguma operação matemática complementar.

arbitração

Exemplo de Arbitração e Parametrização de Uma Mensagem

Arbitração entre três ECUs

Figura 6.1 - Arbitração entre 3 Módulos

Pa­ra sa­ber co­mo cal­cu­lar ca­da in­for­ma­ção em par­ti­cu­lar, te­mos que re­cor­rer a nor­ma J1979.

Va­mos a um e­xem­plo, do que foi vis­to, con­si­de­ran­do três men­sa­gens que es­tão sendo en­vi­a­das si­mul­tâ­ne­a­men­te ao bar­ra­men­to:

  • ECU 1: Men­sa­gem ID 34, in­for­man­do a ro­ta­ção de 3500 rpm;
  • Men­sa­gem ID 35, in­for­man­do a ve­lo­ci­da­de do ve­í­cu­lo, em 80 km/h;
  • Men­sa­gem ID 36, in­for­man­do a quan­ti­da­de de ¼ de com­bus­tí­vel no tan­que.

Em t0, as três ECUs iniciam a transmissão simultâneamente. Em t1, a ECU 3 deixa de transmitir por ter enviado um bit recessivo e ter recebido um bit dominante como resposta. Finalmente, em t2, a ECU 2 deixa de transmitir pelo mesmo motivo, permanecendo apenas a ECU 1, de maior prioridade.

Nota: os IDs dependem da implementação da montadora. Os identificadores mostrados são somente exemplos.


Após a arbitração pelo ID da mensagem, o módulo1 por ter maior prioridade, continua a enviar informações a respeito da rotação do motor:

  • RTR ajustado como zero, portanto trata-se de uma informação fornecida ao barramento;
  • IDE e RSV, como vimos, na CAN 2.0A são sempre zeros;
  • DLC informando que a mensagem tem 2 bytes de comprimento;
  • MSB e LSB são os dados informados ao barramento.
Mensagem informando rotação do motor ao barramento

Figura 6.2 - Composição de mensagem com ID 34 informando 3500 rpm no motor

Através da norma J1979 (referência 6, ao final) encontramos o cálculo da rpm que consiste em se multiplicar o primeiro byte (MSB) por 256 e somar o valor do segundo byte (LSB), dividindo o resultado por 4:

rpm = [ (MSB x 256) + LSB ] / 4 => [ (13 x 256) + 172 ] / 4 = 3500 rpm.

Após o envio da mensagem pela ECU1, as ECUs 2 e 3 reiniciam o envio das mensagens pendentes. Supondo ainda que o envio seja simultâneo, a ECU 2 vence a arbitração no tempo t1 (figura x). O processo de análise é o mesmo que utilizamos para a ECU 1, com diferença apenas na forma de cálculo para o parâmetro da ECU2:

Mensagem informando velocidade do veículo ao barramento

Figura 6.3 - Composição de mensagem com ID 35 informando 80 km/h

Neste caso, a fórmula para o cálculo da velocidade é dado por:

km/h = [ (MSB * 256) + LSB ] / 100 => [ (31 * 256) + 64 ] / 100 = 80 km/hr

Note que para a rpm o divisor foi 4 e para a velocidade o divisor é 100 (tabela 1).

Da mesma forma, considerando finalmente a ECU 3, temos:

Mensagem informando quantidade de combustível ao barramento

Figura 6.4 - Composição de mensagem com ID 36 informando quantidade de combustível

Para o cálculo da reserva de combustível, existe apenas um byte e a fórmula de cálculos é:

% do tanque = (LSB * (100/255)) => % = 64 * (100/255) = 25 %


Tratamento de Erros

A CAN é muito robusta e um dos motivos é que todos os módulos instalados no barramento estão o tempo todo à procura de erros. Existem 5 tipos de erros definidos na especificação da CAN [#12]:

  • Bit error – todo transmissor faz o monitoramento simultâneo do que envia, lendo o barramento. Se ao enviar um bit obter como resposta um bit de nível lógico diferente, irá registrar um bit error. Note que o bit-error não ocorre na arbitração e no acknowledgement, onde a troca do nível lógico indica prioridade mais baixa ou a identificação da mensagem por outro módulo.
  • Stuff error – se no corpo de uma mensagem forem detectados mais do que 5 bits consecutivos com o mesmo nível lógico, irá ocorrer o stuff error.
  • CRC error – se o CRC enviado pelo transmissor não for compatível com a verificação nos módulos receptores, irá ocorrer um crc-error.
  • Form error – se um dos bits com valores fixos (crc delimiter, acknowledgement delimiter, end of frame) for identificado com nível lógico diferente do que deveria ter, um form-error é registrado.
  • Acknowledgement error – se ao menos um dos módulos enviar um bit dominante sobre o acknowledgement, será registrado um Ack-erro.

Assim que um módulo detecta um erro, ele inicia o envio de uma mensagem ao barramento de forma imediata, ou seja, sobrescrevendo qualquer mensagem que esteja sendo transmitida. A mensagem de erro é constituida por seis bits de mesmo nível lógico consecutivos, os quais irão violar a regra do stuff-error. Ao final do envio, o módulo passa a enviar sucessivos bits recessivos. Outros módulos também irão detectar o erro e fazer o envio dos bits de sinalização que irão se sobrepor. Quando todos os módulos presentes terminarem de fazer o envio da mensagem de erro e transmitirem apenas os bits recessivos, o barramento volta ao estado de espera e as mensagens podem ser enviadas novamente.

Vamos verificar, com mais detalhes, como essa sinalização é feita.

Sinalização de erros

Os campos utilizados são:

  • CRC – Cyclical Redundancy Check, cálculo numérico de verificação;
  • ACK – Acknowledgement, reconhecimento de uma mensagem pelo barramento;
  • End of Frame, finalização da mensagem.
  • Interframe, destinado a proporcionar tempo extra para oprocessamento entre mensagens.
Partes da mensagem relativas à verificação de erros

Figura 7 - Campos utilizados na verificação de erros

CRC - Cyclic Redundancy Check

O CRC é uma verificação baseada no conteúdo da mensagem. O módulo emissor calcula o CRC com 15 bits de comprimento, acrescenta um bit de sinalização, e os incorpora ao frame.

Os módulos receptores verificam se o CRC informado está correto e ações correspondentes são disparadas:

  • O cálculo do CRC está correto, a mensagem é aceita;
  • O cálculo do CRC resulta erro. Neste caso é gerada uma informação pelo(s) módulo(s) fazendo com que a mensagem seja retransmitida.
CAN

Os campos a partir de SOF até o LSB da mensagem, inclusives, são considerados como se fossem um único número, cujo comprimento varia em função do conteúdo da mensagem que pode ter entre 0 e 8 bytes, portanto, o comprimento total a ser considerado no cálculo irá variar entre 19 e 83 bits.

Tomando a mensagem de 2 bytes sobre a rpm vista acima, o comprimento é de 35 bits, temos:

Campos considerados no cálculo do CRC

Figura 7.1 - Campos considerados no cálculo do CRC


Chave ou Polinômio Gerador do CRC

A especificação da BOSCH para CAN 2.0A, assim como a norma ISO 11898-1, estabelece uma chave de geração de 15 bits, denominada polinômio, definida por:

X15 + X14 + X10 + X8 + X7 + X4 + X3 +1

A representação binária da chave é obtida traçando uma escala em ordem decrescente, à partir do maior expoente (15) até 0, colocando 1 debaixo dos expoentes presentes no polinômio e 0 nos outros expoentes. Como o polinômio tem que ser sempre ímpar, o expoente zero recebe 1, definido pela soma na fórmula acima.

Composição do Polinômio gerador do CRC

Figura 7.2 - O número binário resultante é composto dos 15 bits + 1, para garantir que seja ímpar.


(215) + (214) + (210) + (28) + (27) + (24) + (23) + 1 = 1100010110011001


A soma (+1) faz com que apareça mais um bit no comprimento do polinômio, que passa a 16 bits. Nominalmente, porém, o polinômio é dito de 15 bits, batizado pelo maior expoente.

Forma de Cálculo

O controle da CAN presente no módulo do transmissor, calcula o CRC aplicando a operação XOR entre o conteúdo da mensagem e o polinômio sucessivamente, até que ao final resulte um número de 15 bits de comprimento. A esse número é acrescentado um finalizador, sempre recessivo (NL=1).

Constituido o CRC, o mesmo é incorporado à mensagem e transmitido para o barramento.

Geração do CRC

Figura 7.3 - A operação XOR é feita até que resulte um resto de 15 bits, formando o CRC


Os módulos conectados, ao receberem a mensagem, através do controle da CAN refazem o cálculo utilizando o CRC informado. Nessa situação, o resultado ao final do cálculo terá que ser ZERO. Comprovado o resultado, a mensagem é aceita, caso contrário, será gerado uma sinalização de erro e a mensagem terá que ser reenviada.



Verificação do CRC

Figura 7.4 - A operação XOR é feita nos módulos receptores. O resultado deverá ser zero.


O passo a passo detalhado deste cálculo pode ser visto na planilha ‘Demonstração do Cálculo do CRC’, disponível para download aqui.



Bit Stuffing

Como o formato da mensagem é do tipo contínuo, ou seja, os níveis lógicos são determinados não somente pela tensão no barramento, mas também pelo tempo em que a tensão permanece em um determinado nível, existem mecanismos que auxiliam os módulos à verificarem se estão lendo as mensagens corretamente. Desta maneira, à cada cinco bits com um mesmo nível lógico entre o SOF e o terminador do CRC, o controle da CAN insere um bit com estado lógico inverso. Esse bit recebe o nome de bit stuffing e é eliminado de forma automática pelos controladores da CAN dos outros módulos durante a leitura.

O transmissor insere um bit com valor contrário sempre que o número de bits de mesmo valor for maior que 5

Figura 8 - Após cinco bits de mesmo nível, o transmissor insere um de nível oposto.


Indicação de Erro

Se ao menos um dos módulos presentes no barramento verificar um erro no CRC ou a existência de bits dominantes nos campos onde deveriam estar recessivos (ACK, interframe e final da mensagem), imediatamente esse módulo irá transmitir 6 bits consecutivos com o mesmo nível lógico, violando a regra do Bit-Stuffing.

Error frame viola, intencionalmente, a regra do bit-stuffing

Figura 9 - A forma de comunicar um erro em uma mensagem consiste em forçar a violação da regra do bit-stuffing.


Ao final do envio, o módulo passa a enviar sucessivos bits recessivos. Outros módulos também irão detectar o erro e fazer o envio dos bits de sinalização que irão se sobrepor aos recessivos que estão sendo transmitidos pelo primeiro módulo a detectar o problema. Ao todo serão transmitidos entre 6 e 12 bits com mesmo nível lógico.

Quando todos os módulos presentes terminarem de fazer o envio da mensagem de erro e transmitirem apenas os bits recessivos, o barramento volta ao estado de espera e as mensagens podem ser enviadas novamente.

Retorno ao estado recessivo

Figura 10 - Quando o barramento estiver em estado recessivo, as transmissões reiniciam.

Referências

SixSigmata