3.25. Fundamentos do barramento CAN¶
O CAN (Controller Area Network) foi originalmente projetado pela Bosch nos anos 1980 para conectar todas as unidades de controle eletrônico de um carro em um único barramento compartilhado e curto. Ele ainda domina o chicote elétrico automotivo, mas essa mesma robustez, comportamento em tempo real e arquitetura multimestre fazem dele o barramento de campo padrão em automação, robótica, equipamentos agrícolas e industriais de todo tipo.
O CAN não possui um único “controlador” e um conjunto de “periféricos” como o SPI e o I2C. Todo nó no barramento é um par, e qualquer nó pode transmitir sempre que o barramento estiver ocioso. O que permite essa escalabilidade é a arquitetura de difusão com arbitragem do barramento.
3.25.1. Difusão com arbitragem por prioridade¶
Toda mensagem em um barramento CAN carrega um identificador – 11 bits para o quadro padrão clássico, 29 bits para a variante estendida. O identificador não é um endereço; ele rotula sobre o que a mensagem trata (RPM do motor, posição do pedal de freio, tensão da bateria, etc.). Quando um nó quer enviar um valor, ele o difunde marcado com o identificador apropriado, e todo nó no barramento vê a difusão. Cada receptor filtra o barramento em hardware para selecionar apenas os IDs que lhe interessam.
Se dois nós tentam transmitir ao mesmo tempo, o projeto elétrico do barramento permite que a mensagem com o identificador numérico menor 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 em nível alto (recessivo) pelos resistores de terminação quando nenhum nó está falando; qualquer nó pode puxar os fios para baixo (dominante) fornecendo corrente através de seu transceptor. O resultado é um AND-cabeado: se qualquer nó isolado conduz o barramento para dominante, a linha lê dominante, e ela lê recessivo apenas quando todos os nós a liberaram. O dominante sempre vence. (Algumas referências chamam esse mesmo arranjo de OR-cabeado, tratando “dominante” como o sinal afirmado em vez do AND dos bits recessivos – o comportamento físico é idêntico de qualquer forma.)
O AND-cabeado em forma conceitual. O CAN real executa a mesma lógica sobre um par diferencial (CAN_H / CAN_L) com os transceptores e os resistores de terminação distribuídos entre ambos os fios, mas a regra no barramento é a mesma: qualquer nó pode puxar para dominante, e somente quando todos os nós liberaram é que ele lê recessivo.¶
A arbitragem usa essa assimetria diretamente. Todo nó transmissor envia seu ID um bit por vez, do 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 menor está transmitindo no mesmo momento e venceu aquela posição de bit. Ele para de conduzir o barramento imediatamente e escuta. O nó vencedor, por sua vez, vê seus próprios bits saírem inalterados – do seu ponto de vista nada de incomum aconteceu. O ID de número menor vence porque seus bits dominantes sobrescrevem os bits recessivos que os IDs de número maior teriam enviado nas mesmas posições.
O perdedor então espera o barramento ficar ocioso e tenta novamente de forma automática. Não há colisões, não há mensagens perdidas – apenas ordenação determinística por prioridade.
Este é o estilo publish/subscribe que faz o CAN funcionar em escala: qualquer um pode falar, qualquer um pode escutar, 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. Ele expõe apenas dois pinos CMOS de 3,3 V – TX (o bit que ele quer enviar) e RX (o bit que ele vê no barramento) – e esses pinos vão para um chip separado chamado transceptor CAN ou PHY. O transceptor fica entre o controlador e os fios CAN reais; é ele que sabe como conversar 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 transceptor puxa CAN_H para cima até cerca de 3,5 V e CAN_L para baixo até cerca de 1,5 V, produzindo um diferencial de cerca de 2 V no par. Os receptores amostram a diferença entre os dois fios, o que torna o sinal imune a ruído de modo comum captado ao longo de cabos longos.
A tarefa de mão dupla do transceptor:
No lado do TX, ele lê o pino TX single-ended de 3,3 V do controlador e ou afasta CAN_H e CAN_L para o estado dominante ou libera ambos para o estado recessivo.
No lado do RX, ele lê o par diferencial CAN_H / CAN_L e reporta um nível single-ended de 3,3 V em seu pino RX de volta ao controlador.
Dois resistores de terminação de 120 ohms, um em cada extremidade física do cabo, mantêm o barramento no ponto médio recessivo quando nenhum nó está conduzindo e amortecem reflexões que, de outra forma, corromperiam o sinal diferencial em cabos longos.
3.25.3. O quadro de dados¶
Um quadro de dados CAN padrão tem esta aparência no fio:
Um quadro de dados CAN padrão: campos SOF, ID, RTR, controle, dados, CRC, ACK e EOF.¶
Cada campo tem uma função específica:
SOF (start of frame). Um bit dominante que diz que um novo quadro está começando e sincroniza o relógio de bit de cada nó.
ID (identificador). O identificador de 11 bits sobre o qual o barramento arbitra. Número menor = prioridade maior.
RTR (remote transmission request). Ativado em uma solicitação de dados em vez de uma entrega de dados; os receptores com um ID correspondente respondem enviando os dados eles mesmos.
Controle. Um campo de 6 bits que codifica o comprimento dos dados (
DLC) e alguns bits de controle interno.Dados. 0 a 8 bytes de payload (CAN Classic; o CAN FD estende isso 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 de ACK – o transmissor libera a linha e qualquer nó que recebeu o quadro corretamente a puxa para baixo; o segundo bit é um delimitador recessivo. A ausência de um ACK informa ao transmissor que nenhum nó ouviu o quadro e que ele deve tentar novamente.
EOF (end of frame). Sete bits recessivos que encerram o quadro.
Tudo isso é gerado e decodificado pelo controlador CAN em hardware; o software vê apenas o ID, os dados e algumas flags.
3.25.4. Onde o CAN se encaixa¶
As escolhas de projeto do CAN definem seu nicho:
Robusto. A sinalização diferencial em par trançado, a detecção de erros embutida, a arbitragem determinística por prioridade e as retransmissões automáticas fazem o CAN sobreviver em ambientes eletricamente ruidosos onde a UART e o SPI corromperiam dados.
Multimestre. Qualquer nó pode falar a qualquer momento. Nenhum controlador central é necessário e nenhum nó é um ponto único de falha.
Largura de banda limitada. O CAN clássico atinge no máximo cerca de
1 Mbit/s; o CAN FD estende isso. O CAN é a resposta certa quando o enlace é entre placas ou módulos, frequentemente ao longo de metros de cabo, com a confiabilidade como prioridade.Protocolos de camada superior. O barramento CAN puro não diz 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. Um item à parte que vale conhecer é o arquivo DBC: um formato de texto específico de fabricante que registra quais IDs carregam quais sinais em nível de bit em um veículo ou sistema específico. Os arquivos DBC são um formato de metadados que descreve o layout de mensagens de um barramento, não um protocolo próprio.
O driver em CAN bus no código cuida do quadro CAN em nível de fio; mapear IDs para significados é trabalho da aplicação.