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.
- 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
- 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.
- 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.
- 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);
- 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);
- 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.
- 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.
- 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);
}
- 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.