3.25. Fundamentos do barramento CAN

O CAN (Controller Area Network) foi originalmente concebido pela Bosch nos anos 1980 para ligar todas as unidades de controlo eletrónicas de um automóvel num único barramento partilhado de curta extensão. Continua a dominar a cablagem automóvel, mas a mesma robustez, comportamento em tempo real e arquitetura multi-master tornam-no o barramento de campo predefinido em automação, robótica, equipamento agrícola e industrial de todo o tipo.

O CAN não tem um «controlador» único e um conjunto de «periféricos» à maneira do SPI e do I2C. Cada nó no barramento é um par, e qualquer nó pode transmitir sempre que o barramento esteja inativo. O que permite essa escala é a conceção de difusão com arbitragem do barramento.

3.25.1. Difusão com arbitragem de prioridade

Cada mensagem num barramento CAN transporta um identificador – 11 bits para a trama padrão clássica, 29 bits para a variante estendida. O identificador não é um endereço; identifica o assunto da mensagem (rotações do motor, posição do pedal de travão, tensão da bateria, etc.). Quando um nó quer enviar um valor, difunde-o marcado com o identificador apropriado, e todos os nós no barramento veem a difusão. Cada recetor filtra o barramento em hardware para selecionar apenas os IDs que lhe interessam.

Se dois nós tentarem transmitir ao mesmo tempo, a conceção elétrica do barramento permite que a mensagem com o identificador numérico mais baixo vença sem perder nenhum bit.

O truque está nos dois estados elétricos do barramento: dominante (logicamente 0) e recessivo (logicamente 1). Os fios CAN são mantidos altos (recessivos) pelos resistores de terminação quando nenhum nó está a falar; qualquer nó pode puxar os fios para baixo (dominante) ao fornecer corrente através do seu transcetor. O resultado é um E-ligado: se algum nó colocar o barramento em estado dominante, a linha lê dominante, e só lê recessivo quando todos os nós o libertaram. O dominante ganha sempre. (Algumas referências chamam ao mesmo arranjo um OU-ligado, tratando «dominante» como o sinal afirmado em vez do E dos bits recessivos – o comportamento físico é idêntico de qualquer forma.)

A single bus line held high by a termination resistor to Vcc. Three nodes (A, B, C) hang off the bus. Each node's output stage is a diode in series with a switch to ground -- the diode points from the bus down to the switch, so closing the switch pulls the bus low through the diode but no node can drive the bus high.

O E-ligado em forma conceptual. O CAN real executa a mesma lógica sobre um par diferencial (CAN_H / CAN_L) com os transcetores e resistores de terminação distribuídos pelos dois fios, mas a regra no barramento é a mesma: qualquer nó pode puxar para dominante, só quando todos os nós o libertam é que lê recessivo.

A arbitragem utiliza esta assimetria diretamente. Cada nó transmissor envia o seu ID um bit de cada vez, MSB primeiro, e observa o barramento enquanto transmite. Um nó que coloca um bit recessivo no fio mas lê de volta dominante sabe que outro nó com um ID mais baixo está a transmitir ao mesmo momento e ganhou essa posição de bit. Para imediatamente de conduzir o barramento e escuta. O nó vencedor, entretanto, vê os seus próprios bits a sair inalterados – do seu ponto de vista nada de invulgar aconteceu. O ID de número mais baixo ganha porque os seus bits dominantes anulam os bits recessivos que os IDs de número mais alto teriam enviado nas mesmas posições.

O perdedor aguarda então que o barramento fique inativo e tenta novamente de forma automática. Não há colisões, nem mensagens perdidas – apenas ordenação de prioridade determinística.

Este é o estilo publicar/subscrever que faz o CAN funcionar à escala: qualquer um pode falar, qualquer um pode ouvir, e os IDs tornam o despacho implícito.

3.25.2. O barramento físico

O controlador CAN do MCU não conduz o barramento diretamente. Expõe apenas dois pinos CMOS de 3,3 V – TX (o bit que quer enviar) e RX (o bit que vê no barramento) – e esses pinos vão para um chip separado chamado transcetor ou PHY CAN. O transcetor situa-se entre o controlador e os fios CAN reais; é ele que sabe como comunicar com o barramento.

O barramento em si é um par diferencial de 5 V:

  • CAN_H – o fio «alto» do par.

  • CAN_L – o fio «baixo».

No estado recessivo ambos os fios ficam em aproximadamente 2,5 V (o ponto médio da alimentação de 5 V do barramento). No estado dominante o transcetor puxa CAN_H para cerca de 3,5 V e CAN_L para cerca de 1,5 V, produzindo um diferencial de cerca de 2 V entre o par. Os recetores amostram a diferença entre os dois fios, o que torna o sinal imune ao ruído de modo comum captado ao longo de longas extensões de cabo.

A função bidirecional do transcetor:

  • No lado TX, lê o pino TX de extremidade simples de 3,3 V do controlador e ou afasta CAN_H e CAN_L para dominante ou liberta ambos para recessivo.

  • No lado RX, lê o par diferencial CAN_H / CAN_L e reporta um nível de extremidade simples de 3,3 V no seu pino RX de volta ao controlador.

Dois resistores de terminação de 120 ohm, um em cada extremidade física do cabo, mantêm o barramento no ponto médio recessivo quando nenhum nó está a conduzir e amortizam reflexões que de outra forma corromperiam o sinal diferencial em extensões longas.

3.25.3. A trama de dados

Uma trama de dados CAN padrão tem este aspeto no fio:

Eight fields drawn in sequence: SOF (1 bit), ID (11 bits), RTR (1 bit), control (6 bits), data (0 -- 8 bytes), CRC (16 bits), ACK (2 bits), and EOF (7 bits).

Uma trama de dados CAN padrão: campos SOF, ID, RTR, controlo, dados, CRC, ACK e EOF.

Cada campo tem uma função específica:

  • SOF (início de trama). Um bit dominante que indica que uma nova trama está a começar e sincroniza o relógio de bits de cada nó.

  • ID (identificador). O identificador de 11 bits sobre o qual o barramento arbitra. Número mais baixo = prioridade mais alta.

  • RTR (pedido de transmissão remota). Definido num pedido de dados em vez de uma entrega de dados; os recetores com um ID correspondente respondem enviando os dados eles próprios.

  • Controlo. Um campo de 6 bits que codifica o comprimento dos dados (DLC) e alguns bits de controlo.

  • Dados. De 0 a 8 bytes de carga útil (CAN Clássico; CAN FD estende isto para 64 bytes).

  • CRC. 16 bits no total: um CRC de 15 bits sobre os campos anteriores mais um delimitador de CRC de 1 bit.

  • ACK. 2 bits no total. No primeiro bit – o slot ACK – o transmissor liberta a linha e qualquer nó que recebeu a trama corretamente puxa-a para baixo; o segundo bit é um delimitador recessivo. A ausência de ACK indica ao transmissor que nenhum nó ouviu a trama e deve tentar novamente.

  • EOF (fim de trama). Sete bits recessivos a fechar a trama.

Tudo isto é gerado e descodificado pelo controlador CAN em hardware; o software vê apenas o ID, os dados e alguns sinalizadores.

3.25.4. Onde o CAN se enquadra

As escolhas de conceção do CAN definem o seu nicho:

  • Robusto. A sinalização diferencial num par entrançado, a deteção de erros integrada, a arbitragem de prioridade determinística e as tentativas automáticas fazem o CAN sobreviver em ambientes eletricamente ruidosos onde o UART e o SPI corromperiam os dados.

  • Multi-master. Qualquer nó pode falar a qualquer momento. Não é necessário nenhum controlador central e nenhum nó é um ponto único de falha.

  • Largura de banda limitada. O CAN Clássico atinge um máximo de cerca de 1 Mbit/s; o CAN FD estende isto. O CAN é a resposta certa quando a ligação é entre placas ou módulos, frequentemente ao longo de metros de cabo, com a fiabilidade como prioridade.

  • Protocolos de camada superior. O barramento CAN nu não especifica o que um ID significa nem como dividir uma mensagem longa em fragmentos. Protocolos de camada de aplicação – CANopen, J1939, ISO-TP/UDS, NMEA 2000 – adicionam essas regras por cima. Outro aspeto que vale a pena conhecer é o ficheiro DBC: um formato de texto específico do fabricante que regista quais os IDs que transportam quais os sinais ao nível de bit num determinado veículo ou sistema. Os ficheiros DBC são um formato de metadados que descreve a disposição das mensagens de um barramento, não um protocolo próprio.

O controlador em Barramento CAN em código trata da trama CAN ao nível do fio; o mapeamento de IDs para significados é responsabilidade da aplicação.