Estou usando um MCU de 16 bits, PIC24HJ64GP504 , para escrever um aplicativo baseado em CAN. Basicamente, é a comunicação entre minha placa e um outro nó que continua continuamente enviando dados para minha placa usando CAN a 1 Mbit / s. Estou configurando o módulo ECAN no meu PIC24 para funcionar a 1 Mbit / s. Escrevi o código de maneira que, nos primeiros 10 ms, o módulo ECAN aceite todas as mensagens vindas do outro lado e depois reconfigurei o módulo ECAN para aceitar apenas as mensagens com a mensagem ID 0x13.
Agora, aqui vem a questão. O outro nó e minha placa são ligados no mesmo instante. O outro nó começa a transmitir mensagens após aproximadamente 40 ms após a inicialização. Mas não consigo receber nenhuma mensagem dele no meu quadro. Agora, se eu ligar minha placa primeiro, reserve algum tempo para reconfigurar o módulo ECAN com novos filtros, instalar-se e depois ligar o outro nó, tudo funcionará perfeitamente.
Agora, a parte mais estranha .. Se eu tiver um analisador de barramento CAN conectado entre minha placa e o outro nó e mesmo se eu ligar os dois nós ao mesmo tempo, tudo funciona bem ... não há necessidade de ligar minha placa primeiro. Eu tentei isso com três analisadores de barramento diferentes de fabricantes diferentes e obtive os mesmos resultados.
Para mim, parece que durante a reconfiguração do módulo ECAN, leva algum tempo para se acalmar. E com a introdução do analisador de barramento no barramento, esse tempo é de alguma forma interrompido para que tudo funcione perfeitamente. Mas não tenho certeza de qual seja exatamente o problema.
Eu tenho lutado com esse problema nos últimos sete dias.
PS: Hoje verifiquei com um escopo e descobri que se o outro nó começar a transmitir após 170 ms após a inicialização, tudo funcionará bem. Antes disso, meu dispositivo não receberá nenhuma mensagem a menos que o analisador de barramento esteja conectado. A pior parte é que não posso atrasar a transmissão do outro nó, o firmware desse nó é proprietário.
Também li em um fórum hoje que o CAN precisa do resistor de 120 at no nó para fazê-lo funcionar (mesmo que meu nó não tenha um e funcione bem, desde que haja algum tempo para se estabelecer após a reconfiguração). Suspeito que a introdução do analisador de barramento altere de alguma forma os parâmetros elétricos de algumas redes, de modo que o tempo gasto pelo meu nó para se estabelecer após a reconfiguração seja reduzido. Mas eu não tenho certeza.. :(
fonte
Respostas:
Você "lê em um fórum" em algum lugar em que o barramento CAN precisa de resistores? A sério!!?
Esta é parte integrante do seu design. Se você vai usar o CAN, é necessário entendê-lo, o que significa ler a documentação relevante.
Spearson está certo, mas pelo motivo errado. Um barramento CAN diferencial como você provavelmente possui (você não disse qual chip de interface está usando, mas provavelmente possui um barramento CAN diferencial padrão, acionado por algo como um MCP2551 em cada nó) requer uma resistência entre as linhas. Isso ocorre porque o estado recessivo é sinalizado pelas duas linhas reunidas passivamente, e o estado dominante por elas serem ativamente separadas. Os resistores entre as linhas nesse sentido são equivalentes a um resistor de pullup em uma linha de coletor aberta. Sem algo puxando as linhas quando nada está dirigindo o ônibus, o ônibus não funciona.
Os resistores também funcionam como terminadores, como Spearson apontou. Você geralmente usa par trançado para as duas linhas de ônibus. Isso tem uma impedância de cerca de 120 Ω. Este tipo de barramento CAN diferencial é definido para ter 60 Ω entre as linhas como um conjunto, de modo que possa ser implementado com 120 Ω em cada um para terminar o barramento e evitar reflexos.
fonte
Em operação CAN normal, um nó repetirá sua transmissão até ser ACK ou a contagem de erros ter sido excedida. Quando você tiver o analisador CAN conectado à rede, ele emitirá o bit ACK quando detectar o quadro do seu primeiro nó, tornando a transmissão bem-sucedida. Se você estiver usando o Microchip CAN BUS Analyzer, poderá configurá-lo para o modo 'apenas para ouvir', o que significa que ele não emitirá nenhum bit ACK, portanto, não afetará a rede. Portanto, você poderá ver o quadro CAN repetido no visor do analisador até o segundo nó emitir um ACK ou o primeiro nó parar de transmitir devido à contagem de erros.
O bit ACK será definido por um nó de recebimento (se o quadro estiver completo e correto), independentemente de qualquer filtro de endereço.
Provavelmente, seu primeiro nó está atingindo um estado de erro devido ao quadro não receber confirmação. Você deve detectar isso no software usando o registro CiINTF. Você também pode configurar o PIC para emitir interrupções para condições de erro usando o registro CiINTE.
Se o seu osciloscópio não decodificar os quadros CAN, tente o analisador Saleae Logic . Ele decodificará o quadro CAN e exibirá o bit ACK / Error. Tem sido muito mais confiável que o analisador Microchip CAN.
fonte
Há um slot ACK (dois bits) em um quadro CAN. Se um nó A estiver transmitindo os dados e houver outros cinco no barramento, após a transmissão, o nó que receber o quadro colocará o bit dominante no slot ACK. Isso indica que a mensagem foi transmitida com sucesso. Caso contrário, os controladores CAN consideram isso um erro no barramento.
Quando você adiciona um analisador CAN, ele envia ACK ao transmissor. O transmissor acha que o barramento é bom e continua transmitindo. Na ausência de um analisador CAN, quando você reconfigura seu controlador CAN, o transmissor não recebe um ACK e acha que há um erro no barramento, portanto, para de transmitir.
Espero que você entenda o ponto.
Verifique se o ACK está recebendo corretamente. Tente também não desligar completamente o seu receptor CAN enquanto faz a reconfiguração.
Outro truque (não tenho certeza se funcionará sempre) é enviar um DLC zero e um quadro de ID zero após a reconfiguração. Isso informará ao nó do transmissor que o barramento está ativo e começará a transmitir.
Nota: um resistor de 120 is é DEVE !!! . Uma resistência de terminação é a coisa mais importante em QUALQUER barramento.
fonte