Guia Completo de Desenvolvimento de Comunicação CAN: Do Hardware à Verificação

No desenvolvimento de eletrónica automóvel, a comunicação CAN é uma funcionalidade central. Este guia detalha o ciclo de vida completo do desenvolvimento, cobrindo desde a configuração do hardware até aos testes de validação, incluindo exemplos de configuração de registos, abordagens de design de máquinas de estado e fragmentos de código úteis.

  1. Confirmação do Hardware

  • Confirmar com os responsáveis de eletrónica e de projeto o modelo do MCU e do transceiver CAN.
  • Verificar a atribuição dos pinos CAN_TX, CAN_RX, CAN_STB e a capacidade de suportar funções de "wake-up".
  • Consultar o manual do chip para validar a configuração dos registos e a compatibilidade com os pinos de wake-up.

Exemplo: Configuração de Pinos CAN (Código Ilustrativo)

// Configurar a função alternativa para os pinos GPIO como interface CAN
configurar_pino(GPIO_PORT_B, PINO_2, FUNCAO_ALTERNATIVA_2); // CAN_TX
configurar_pino(GPIO_PORT_B, PINO_3, FUNCAO_ALTERNATIVA_2); // CAN_RX
  1. Análise do Documento de Requisitos

  • Configuração de Canais: Verificar a existência de uma base de dados CAN (arquivo DBC) que defina as mensagens, IDs e sinais.
  • Gestão de Sono: Definir a estratégia de adormecimanto e despertar entre o MCU e o transceiver CAN.
  • Diagnóstico UDS: Especificar os serviços de diagnóstico necessários, planeando a gestão de sessões, acesso por segurança e respostas a erros.
  1. Base de Dados e Ficheiros de Diagnóstico

  • Base de Dados CAN: O cliente pode fornecer um ficheiro DBC ou uma tabela de sinais; caso contrário, é necessário criá-la.
  • Base de Dados de Diagnóstico (ficheiro CDD): Geralmente desenvolvida internamente, define os serviços UDS, os DIDs, IDs de rotinas e os mecanismos de segurança.
  1. Desenvolvimento do Driver CAN

  • Origem do Driver: Utilizar um pacote configurável (como AUTOSAR MCAL) ou desenvolver um driver baseado em registos.
  • Configurações Críticas: Taxa de baud, modo de wake-up, filtros e máscaras, gestão de interrupções e tratamento de erros.

Exemplo: Configuração da Taxa de Baud (exemplo para 500 kbps)

typedef struct {
    uint32_t taxa_baud;
    uint8_t ponto_amostragem;
} ConfiguracaoCAN;

ConfiguracaoCAN config_inicial = {
    .taxa_baud = 500000, // 500 kbps
    .ponto_amostragem = 75
};
inicializar_CAN(&config_inicial);
  1. Preparação para Funcionalidade de Atualização

  • Base de Dados de Diagnóstico de Upgrade: Criar um ficheiro CDD que suporte o protocolo UDS para atualização (ex: 0x34 Download Request, 0x36 Transfer Data).
  • Código do Driver: Implementar as funções de apagamento e escrita na memória Flash, e a lógica de alternância entre Bootloader e aplicação.

Exemplo: Interfaces para Manipulação de Flash

bool apagar_bloco_flash(uint32_t endereco, uint32_t tamanho);
bool escrever_dados_flash(uint32_t endereco, const uint8_t *dados, uint32_t comprimento);
  1. Documento de Design de Alto Nível

  • Design de Interfaces: Definir interfaces para gestão de energia, envio/receção unificado de mensagens CAN e serviços de diagnóstico.
  • Dados Persistidos: Projetar a estrutura de armazenamento e o mecanismo de preservação durante quedas de energia para dados como DTCs.
  1. Documento de Design Detalhado

  • Utilização de Recursos: Mapear a ocupação de memória, a utilização de interupções e os mecanismos de proteção.

  • Divisão de Módulos: Definir submódulos para Inicialização, Transmissão, Recepção, Tratamento de Erros e Diagnóstico.

  • Diagrama de Transição de Estados:

  • Inicialização -> Comunicação Normal -> Modo Sono -> Despertar -> Recuperação de Erro.

  • Mecanismo de Failsafe: Definir estados seguros para entrada em caso de erros de comunicação e lógica de reversão de versão em caso de falha na atualização.

  1. Implementação do Código

Utilizar um template como ponto de partida ou desenvolver do zero, mantendo uma estrutura modular, limpa e portável. O código deve seguir estritamente as especificações do documento de design detalhado.

Exemplo: Função de Envio de Mensagem CAN (conceito)

bool enviar_mensagem_can(uint32_t identificador, const uint8_t *carga, uint8_t comprimento) {
    QuadroCAN quadro;
    quadro.identificador = identificador;
    quadro.comprimento = comprimento;
    copiar_memoria(quadro.dados, carga, comprimento);
    return transmitir_quadro_CAN(&quadro);
}
  1. Testes e Validação

  • Testes a Nível de Código: Análise estática (conformidade MISRA-C), testes dinâmicos (testes unitários).
  • Testes de Interface: Verificar a interação entre módulos, o fluxo de inicialização e as transições de estado.
  • Testes Funcionais: Num ambiente de bancada, validar o envio/receção de mensagens, os ciclos de wake-up/sleep, o tratamento de erros e os serviços de diagnóstico.
  • Testes de Entegração e Veículo: Validar a gestão de energia, as interfaces de diagnóstico e a funcionalidade global de comunicação no sistema integrado.

Tags: CAN UDS AUTOSAR EmbeddedC StateMachine

Publicado em 6-9 16:03 por Thomas