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.
As mensagens na rede CAN são transmitidas por pulsos elétricos. O barramento tem dois estados antagônicos:
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
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.
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:
Para efeitos didáticos, vamos separar o ciclo das mensagens em duas partes:
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.
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):
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.
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.
Para saber como calcular cada informação em particular, temos que recorrer a norma J1979.
Vamos a um exemplo, do que foi visto, considerando três mensagens que estão sendo enviadas simultâneamente ao barramento:
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:
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:
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:
Neste caso, a fórmula para o cálculo da velocidade é dado por:
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:
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 %
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]:
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.
Os campos utilizados são:
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:
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:
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:
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.
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.
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.
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.
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.
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.
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.
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.