Escolar Documentos
Profissional Documentos
Cultura Documentos
BARRAMENTO CONTROLLER AREA NETWORK
“CONCEITUAÇÃO”
INTRODUÇÃO
HISTÓRICO
CONCEITUAÇÃO BÁSICA
Figura 1
Considerando-se fios elétricos como o meio de transmissão dos
dados, existem três formas de se constituir um barramento CAN,
dependentes diretamente da quantidade de fios utilizada. Existem
redes baseadas em 1, 2 e 4 fios. As redes com 2 e 4 fios trabalham
com os sinais de dados CAN_H (CAN High) e CAN_L (CAN Low). No
caso dos barramentos com 4 fios, além dos sinais de dados, um fio
com o VCC (alimentação) e outro com o GND (referência) fazem parte
do barramento, levando a alimentação às duas terminações ativas da
rede. As redes com apenas 1 fio têm este, o fio de dados, chamado
exclusivamente de linha CAN.
Figura 2
Figura 3
Figura 4
PADRÕES EXISTENTES
DETECÇÃO DE FALHAS
Figura 5
Figura 6
CAN BUS
BARRAMENTO CONTROLLER AREA NETWORK
“IMPLEMENTAÇÃO”
INTRODUÇÃO
Vamos lá !
DETERMINAÇÃO DA ARQUITETURA
Estas normas trazem informações específicas de cada classe de
aplicações, como o tipo de cabeamento e conectores necessários e os
tipos de mensagens requeridas, entre outras.
Matriz TX - RX Bytes do Bytes de dados
Nome da Mensagem Identificador (ID)
ECU #1 ECU #2 D #1 D #2 D #3 D #4 D #5 D #6 D #7 D #8
1 Estado das Entradas da ECU #1 TX RX 12 34 56 78 XX 00 00 00 00 00 00 00
2 Estado das Saídas da ECU #1 TX RX 11 22 33 44 00 00 XX 00 00 00 00 00
3 Estado das Entradas da ECU #2 RX TX 87 65 43 21 XX 00 00 00 00 00 00 00
4 Estado das Saídas da ECU #2 RX TX 55 66 77 88 00 00 00 00 00 XX 00 00
Tabela 1
Analisando a Tabela 1 percebemos que, no nosso Dicionário de
Dados:
“XX” será “31 hex” caso uma determinada entrada digital seja
igual a “1”
“XX” será “30 hex” caso esta determinada entrada digital seja
igual a “0”
Tabela 2
Controladores CAN
Fabricante Componente
Infineon 81C90
Intel 82527
Microchip MCP2510
Philips SJA1000
Tabela 3
Transceivers CAN
Fabricante Componente
Bosch CF151
Infineon TLE6252G
PCA82C250
Philips
TJA1050
Tabela 4
Nosso projeto do hardware considerará o Transceiver PCA82C250
(Philips).
Figura 2
Através de dois fios conseguimos conector o Micro-Controlador
ao Transceiver. Além disso, a ECU é conectada à rede CAN por
outros dois fios, CAN_H e CAN_L, já mencionados na segunda parte
desta matéria. Perceba também, na Figura 2, os dois Terminadores de
124 Ohms. Eles podem estar conectados diretamente ao chicote ou,
no nosso caso, onde a aplicação possui somente duas ECUs, um em
cada ECU.
Figura 3
Início do Programa em C:
#include "87C591.h"
#define BYTE unsigned char
#define WORD unsigned int
#define IN P1_2
#define OUT P3_2
Definição da estrutura da mensagem CAN:
typedef struct {
BYTE INFO; /* Byte com informações relacionadas a mensagem CAN
*/
BYTE ID[4]; /* 4 bytes de Identificador */
BYTE BUF[8]; /* 8 bytes de dados */
}
PDU;
Inicialização da Porta RS232:
void init_serial() {
PCON = 0x80; /* SMOD1=1 e SMOD0=0 => Baud Rate dobrado
*/
TMOD = 0x20; /* Timer 1 autoload */
TCON = 0x40; /* Inicia o Timer 1 */
TH1 = 0x0FD; /* Taxa de transmissão: 19200*2=38400 */
SCON = 0x52; /* SM0=0 e SM1=1 => Modo 1 */
}
Inicialização do CAN Bus:
void init_can (void) /* Baud Rate de 125kbps e XTAL de 11,0592 */
/* Assumindo CAN2.0B (ID de 29bits) e DLC = 8 bytes */
{
BYTE i;
CANMOD = 0x01; /* Força o Modo Reset para inicialização */
P1M2 = P1M2 | 0x02; /* TXDC Port (P1.1) Configuração: */
/* Pin TXDC para push-pull */
/* P1M2.1='1', P1M1.1 = '0' (default) */
CANSTA = 0x03; /* Interrupções de Recepção e Transmissão habilitadas
*/
/* BTR0 e BTR1 determinam o Baud Rate e o Sample Point Position */
CANADR = BTR0;
CANDAT = 0x85;
CANADR = BTR1;
CANDAT = 0x2A;
/* Limpa as Máscaras e Filtros */
CANADR = ACR0;
for (i=1;i<=32;i++)
CANDAT = 0;
/* Configura os filtros para Extended Frame e Single Acceptance Filter */
CANADR = ACFMODE;
CANDAT = 0xFF; /* EFF e Single Long Filter */
CANADR = ACFENA;
CANDAT = 0xFF; /* Todos os Bancos e Filtros habilitados */
CANADR = ACFPRIO;
CANDAT = 0xFF; /* Mensagem aceita pelo filtro gera Interrupção */
CANADR = ACR0; /* ECU#1 - Receber somente o ID = 87654321 */
CANDAT = 0x87; /* Este valor vale p/ o programa Principal da
ECU#1 */
CANDAT = 0x65; /* Para a ECU#2, alterar valores para 12345678
*/
CANDAT = 0x43;
CANDAT = 0x21;
CANADR = AMR0; /* Todos os bits são verificados */
CANDAT = 0x00;
CANDAT = 0x00;
CANDAT = 0x00;
CANDAT = 0x00;
CANMOD = 0x00; /* Sai do Modo Reset */
while (CANSTA & 0x80); /* Monitora o Status do Barramento */
}
Transmissão via CAN Bus:
void TX_CAN (PDU *ptxb) {
BYTE length; /* CAN Data Length Code */
BYTE i; /* index */
length = ptxb->INFO;
while (!(CANSTA & 0x04));
CANADR = 0x70; /* Aponta para o TX Frame Information */
CANDAT = length; /* Coloca o DLC no CANDAT */
for (i=0;i<4;i++)
CANDAT = ptxb->ID[i]; /* Coloca os 4 bytes do ID no CANDAT */
for (i=0;i<length;i++)
CANDAT = ptxb->BUF[i]; /* Coloca os 8 bytes de Dados no
CANDAT */
CANCON = 0x01; /* Solicita transmissão */
}
Recepção via CAN Bus:
int RX_CAN (PDU *prxb) {
BYTE length; /* CAN Data Length Code */
BYTE i; /* index */
if (CANSTA & 0x01) /* Analisa o RBS - Receive Buffer Status
*/
{
CANADR = 0x60; /* Aponta para o RX Frame Information */
length = CANDAT & 0x0F; /* Coloca o DLC na variável length */
prxb->INFO = length; /* Coloca o DLC no prxb */
for (i=0;i<4;i++)
prxb->ID[i] = CANDAT; /* Coloca os 4 bytes do ID no prxb
*/
for (i=0;i<length;i++)
prxb->BUF[i] = CANDAT; /* Coloca os 8 bytes de Dados no
prxb */
CANCON = 0x0C; /* CDO-Clr Data Overrun, AT-Abort Tx, TR-Tx
Rqst */
return (1);
} else
return (0);
}
Para que você tenha uma idéia da aparência de uma ECU montada a
partir do projeto aqui apresentado, veja sua foto na Figura 5.
Figura 5
CONSIDERAÇÕES FINAIS
Espero que este artigo possa auxiliar de alguma forma suas atividades
profissionais ou que, simplesmente, possibilite a disseminação de
alguns conhecimentos que temos sobre um dos Protocolos de
Comunicação mais utilizados atualmente – o CAN Bus.