Implementando uma camada de protocolo CAN em software


12

fundo

Estou desenvolvendo um projeto que exigirá as modestas especificações do microcontrolador de:

  • 8 ADCs de 12 bits e 10kHz
  • 1kB de RAM
  • Tamanho de 48 QFN ou menor
  • Protocolo de comunicação resistente a ruído e correção de erros de 20kbps, encadeado em série

Os requisitos de processamento de sinal são bastante baixos e a maioria pode ser exportada para o processador mestre no sistema. As três primeiras especificações são fáceis de atender e podem ser feitas por menos de US $ 2 em quantidade. No entanto, a comunicação estará acontecendo em um ambiente eletricamente barulhento, de modo que redes vulneráveis ​​a ruído, como LIN e I2C, estão fora. Um argumento adicional contra o LIN é que eu gostaria de executar a coisa toda em 5V ou 3,3V, e os transceptores LIN exigem 12V e, portanto, exigiriam um regulador ou fio extra por placa de sensor. Inicialmente, escolhi o CAN para esta tarefa. No entanto, os controladores CAN adicionam um custo considerável, e estou curioso para saber se isso pode ser feito em software.

Camada física CAN

A especificação CAN define as camadas Data Link e Physical do modelo de referência de rede OSI. Existem muitos ICs baratos de 8 pinos, como o NXP TJA1040 / 50 , Maxim MAX3058 / 59 , Microchip MCP2551 e TI SN65HVD1050 para implementar a camada física. Implementar a camada física com conversores D / A ou amplificadores operacionais seria difícil, se não impossível, portanto esses ICs valem bem o valor de US $ 1 ou mais que custam.

Camada de protocolo / protocolo de dados CAN

Para a camada Data Link, alguns microcontroladores adicionam módulos de protocolo CAN às camadas básicas de comunicação UART, I2C e SPI. No entanto, estes são significativamente mais caros que os chips básicos.

Investigação do custo dos módulos do protocolo CAN

Para comprovar essa afirmação, aqui estão alguns micros populares nas versões CAN e não CAN, a partir de:

  • ATmega16 - ATMEGA16M1 (com CAN): US $ 3,87, ATMEGA168A (sem CAN): US $ 3,23
  • dsPIC - DSPIC33FJ64MC802 (com CAN): US $ 6,14, DSPIC33FJ64GP202 (sem CAN): US $ 5,48
  • PIC18 - PIC18F2480 (com CAN): $ 6,80, PIC18F24J10 (sem CAN): $ 2,10
  • Cortex-M3 - STM32F103C4T6A (com CAN): US $ 6,50, STM32F100C4T6B (sem CAN): US $ 2,73

Para ser justo, eu apenas comparei microcontroladores com tamanhos de memória equivalentes, no entanto, muitas das versões não CAN estão disponíveis com tamanhos de memória menores por menos. Controladores CAN externos, como o Microchip MCP2515 , custam quase US $ 2, portanto é obviamente mais econômico ter o CAN integrado ao microcontrolador, se você tiver a opção.

Curiosamente, a parte ATmega é de longe a parte mais barata equipada com CAN no inventário da Digikey.

Função da camada de protocolo CAN

O módulo CAN encontrado nos microcontroladores dsPIC faz o seguinte:

O módulo de barramento CAN consiste em um mecanismo de protocolo e buffer / controle de mensagem. O mecanismo do protocolo CAN gerencia todas as funções para receber e transmitir mensagens no barramento CAN. As mensagens são transmitidas carregando primeiro os registros de dados apropriados. Status e erros podem ser verificados lendo os registros apropriados. Qualquer mensagem detectada no barramento CAN é verificada quanto a erros e comparada com filtros para ver se deve ser recebida e armazenada em um dos registros de recebimento.

Isso parece bastante factível em software.

A questão

Uma camada de protocolo de software pode ser usada para implementar a especificação CAN apenas com um microcontrolador de baixo custo equipado com UART e um transceptor CAN? Em caso afirmativo, existem implementações de código aberto?

Como alternativa, os transceptores CAN podem ser usados ​​com UARTs para implementar um protocolo personalizado? Eu estou bem com uma topologia de mestre único; Entendo que a arbitragem pode ser difícil de acertar em um protocolo personalizado.


O CAN também possui 12v, pois foi desenvolvido para uso automotivo.
Kenny

@ Kenny - Os níveis de tensão usados ​​nos transceptores acima são de 5V.
22611 Kevin Vermeer

Se você vai considerar a série STM32F, posso sugerir essa parte do NXP também? É um núcleo Cortex-M0. search.digikey.com/scripts/DkSearch/...
Jon L

@ Jon - Eles não estavam necessariamente em consideração, e um M0 seria ideal para este caso de uso - No entanto, considere as peças que o Nuvoton M052LAN também são Cortex-M0 e aproximadamente metade do preço em quantidade (US $ 1,21 vs. US $ 2,35), mas não possui o módulo CAN. Esse tipo de diferença de preço é a minha motivação.
Kevin Vermeer

convém considerar também a classificação operacional. A maioria das peças com suporte a CAN será industrial ou automotiva versus comercial para variantes que não sejam CAN.
Mark

Respostas:


11

Eu acho que implementar o protocolo CAN apenas no firmware será difícil e levará um tempo para acertar. Não é uma boa ideia.

No entanto, seus preços são altos. Acabei de verificar e um dsPIC 33FJ64GP802 no pacote QFN é vendido por 3,68 USD no microchipdirect por 1000 peças. O preço será mais baixo para volumes de produção reais.

O periférico CAN do hardware faz algumas coisas reais para você, e o aumento de preço não é nem de longe o que você está reivindicando.

Adicionado:

Como você parece determinado a tentar a rota do firmware, aqui estão alguns dos problemas óbvios que vêm à sua mente. Provavelmente haverá outros problemas que ainda não me ocorreram.

Você quer fazer CAN a 20 kbit / s. Essa é uma taxa muito lenta para o CAN, que chega a 1Mbit / s por pelo menos 10s de metros. Para fornecer um ponto de dados, o padrão de sinalização a bordo do NMEA 2000 é aplicado no CAN a 200 kbits / s, o que significa ir de uma extremidade a outra de um navio grande.

Você pode pensar que tudo o que precisa é de uma interrupção por bit e pode fazer tudo o que precisa nessa interrupção. Isso não funcionará porque há várias coisas acontecendo a cada bit do CAN. Duas coisas em particular precisam ser feitas no nível sub-bit. O primeiro é detectar uma colisão e o segundo é ajustar a taxa de bits em tempo real.

Existem dois estados de sinalização em um barramento CAN, recessivo e dominante. Recessivo é o que acontece quando nada está dirigindo o ônibus. Ambas as linhas são unidas por um total de 60 Ω. Um barramento CAN normal, implementado por chips comuns como o MCP2551, deve ter terminadores de 120 at nas duas extremidades, portanto um total de 60 Ω unindo passivamente as duas linhas diferenciais. O estado dominante é quando as duas linhas são ativamente separadas, algo em torno de 900mV do estado recessivo, se bem me lembro. Basicamente, isso é como um barramento coletor aberto, exceto que ele é implementado com um par diferencial. O barramento está em estado recessivo se CANH-CANL <900mV e dominante quando CANH-CANL> 900mV. O estado dominante sinaliza 0 e o recessivo 1.

Sempre que um nó "grava" um 1 no barramento (solta), ele verifica se algum outro nó está gravando um 0. Quando você encontra o barramento no estado dominante (0) quando pensa que está enviando e o o bit atual que você está enviando é 1, então isso significa que outra pessoa está enviando também. As colisões só importam quando os dois remetentes discordam, e a regra é que aquele que envia o estado recessivo recua e anula sua mensagem. O nó que envia o estado dominante nem sabe que isso aconteceu. É assim que a arbitragem funciona em um barramento CAN.

As regras de arbitragem do barramento CAN significam que você deve observar o barramento no meio de cada bit enviado como 1 para garantir que alguém não esteja enviando um 0. Essa verificação geralmente é feita em cerca de 2/3 do bit , e é a limitação fundamental no comprimento do barramento CAN. Quanto mais lenta a taxa de bits, mais tempo há para a propagação do pior caso de uma extremidade do barramento para a outra e, portanto, mais longo o barramento pode ser. Essa verificação deve ser feita sempre que você achar que possui o barramento e enviar 1 bit.

Outro problema é o ajuste da taxa de bits. Todos os nós em um barramento devem concordar com a taxa de bits, mais próximo do que com o RS-232. Para evitar que pequenas diferenças de relógio se acumulem em erros significativos, cada nó deve poder fazer um pouco um pouco mais ou menos que o valor nominal. No hardware, isso é implementado executando um relógio em torno de 9x a 20x mais rápido que a taxa de bits. Os ciclos desse relógio rápido são chamados de quanta de tempo. Existem maneiras de detectar que o início de novos bits está vagando em relação a onde você acha que eles deveriam estar. As implementações de hardware adicionam ou pulam quanta de uma vez um pouco para sincronizar novamente. Existem outras maneiras de implementar isso, desde que você possa ajustar pequenas diferenças de fase entre os tempos de bits esperados e os tempos de bit medidos reais.

De qualquer maneira, esses mecanismos exigem que várias coisas sejam feitas em vários momentos dentro de um pouco. Esse tipo de tempo será muito complicado no firmware ou exigirá que o barramento seja executado muito lentamente. Digamos que você implemente um sistema de quanta de tempo no firmware a 20 kbits / s. No mínimo 9 quanta de tempo por bit, isso exigiria interrupção de 180 kHz. Isso certamente é possível com algo como um dsPIC 33F, mas consumirá uma fração significativa do processador. Na taxa máxima de instruções de 40 MHz, você obtém 222 ciclos de instruções por interrupção. Não deve demorar muito para fazer todas as verificações, mas provavelmente 50-100 ciclos, o que significa que 25-50% do processador será usado para CAN e que será necessário antecipar tudo o que estiver em execução. Isso evita muitos aplicativos que esses processadores geralmente executam, como pulso por controle de pulso de uma fonte de alimentação chaveada ou de um driver de motor. A latência de 50 a 100 ciclos em todas as outras interrupções seria uma parada completa para muitas das coisas que eu fiz com chips como este.

Então você vai gastar o dinheiro para fazer de alguma forma. Se não estiver no periférico de hardware dedicado para esse fim, obtenha um processador maior para lidar com a sobrecarga significativa do firmware e lide com a latência de interrupção grande e imprevisível e possível para todo o resto.

Depois, há a engenharia inicial. O periférico CAN simplesmente funciona. Pelo seu comentário, parece que o custo incremental desse periférico é de US $ 0,56. Isso parece uma pechincha para mim. A menos que você tenha um produto de volume muito alto, não há como recuperar o tempo e as despesas consideráveis ​​necessários para implementar o CAN apenas no firmware. Se o seu volume for tão alto, os preços que mencionamos não são realistas, e o diferencial de adicionar o hardware CAN será menor.

Realmente não vejo isso fazendo sentido.


Valorizo ​​sua opinião, mas estou curioso para saber por que ninguém tentou solucionar as dificuldades - Todo projeto terá esses problemas! Eu vou deixar você saber como vai acabar se eu tentar.
Kevin Vermeer

Em quantidades de 1000, encontro um preço de US $ 3,12 para o dsPIC33FJ64GP202 do microchipdirect - Uma diferença de valor total de US $ 560! Vale a pena tentar pelo menos. Eu estava citando os preços por cada simplesmente porque era mais fácil obter números para peças individuais sem ter que se preocupar com dobar, quantidade pacote padrão etc.
Kevin Vermeer

2
@ Kevin, preços baixos em quantidade nem sempre são proporcionais a preços altos em quantidade. Não sei quantas dessas coisas você planeja fazer, mas US $ 560 não começarão a pagar pela engenharia para fazer o CAN no firmware. Acrescentarei a pode responder a algumas das dificuldades que você encontrará.
Olin Lathrop

WTF !? Acabei de adicionar algumas coisas à minha resposta e a maior parte da quebra de parágrafo foi embora. Havia definitivamente linhas em branco na janela de edição que eu estava digitando no.
Olin Lathrop

1
A resposta é sim, você pode, mas eu concordo totalmente com o Olin aqui. Na verdade, trabalho em período integral nesse campo. Eu uso o chip dsPIC33FJ256. O tempo gasto para escrever, seguindo a abordagem bit-bang, acaba com a vantagem de ter hardware fazendo isso por você e você reinventar a roda. Sem mencionar que tudo o que você está fazendo no hardware precisaria ser cuidadosamente planejado. Além disso, gostaria de saber se você está procurando outros protocolos de nível superior, como o ISO14229 ou o OSEK / Autosar NetworkManagement.
6134 Eric M #

2

Nós usamos o PIC18F25K80 . Embora não tenha um DSP, é de aproximadamente $ 2 em quantidade. É quase um substituto direto para o PIC18F2480 que você mencionou. Usamos o compilador CCS e sua pilha de software para CAN, que provavelmente é portada do Microchip. Funciona bem para tudo que eu precisava e tentei.


Não procurou por ECAN. Nome bobo do Microchip, mas terei que ler mais de perto na próxima vez! Como eu disse, minhas necessidades de processamento de sinal são baixas, então não acho que precise de um DSP real.
Kevin Vermeer

2

Se estou lendo isso corretamente, parece que você deseja basear a funcionalidade CAN usando apenas um UART e algum firmware inteligente. Confie em mim, isso nunca funcionará - sugiro ler um bom texto sobre os meandros do CAN ou CANopen. Você erradicou todas as economias que procurava ao seguir esse caminho.

Eu usaria um microcontrolador com um módulo CAN e repassaria os US $ 2 extras ou já pensou em um protocolo diferente que seja compatível com um UART, como o Modbus sobre RS-485 ?


Você está lendo certo. Eu li completamente o livreto de treinamento em vetor no CAN. Parece que todas as mensagens precisarão de algum pré-processamento para o CRC, mas o restante do pacote deve ser o mesmo e só preciso verificar a linha de recebimento para verificar se há um conflito. Realmente não parece tão difícil quanto as pessoas imaginam, mas definitivamente considerarei seu conselho.
9138 Kevin Vermeer

Mas eu gosto da idéia do Modbus sobre RS485. Parece que a maioria desses transceptores também é de 5V; Fiquei com a impressão de que era necessária uma tensão de entrada +/- como RS232. Terá que investigar isso.
22611 Kevin Vermeer

bater um pouco vai certamente funcionar! Não é trivial como Olin, acima, menciona, mas pode ser feito. Eu pessoalmente fiz isso tanto na série PIC18F quanto na micro dsPIC33. Posso carregar a fonte PIC18F se você realmente quiser vê-la. No entanto, não posso fornecer a fonte dsPIC, pois faz parte de um projeto comercial em que trabalho. Nos dois casos, usamos o MCP2551 e também tenho o código LIN. LIN é um pouco mais simples na camada de protocolo, mas a implementação horários Lin é um pouco mais difícil ...
Eric M

1
@ EricM - Qual foi a taxa de bits e você conseguiu implementar a especificação CAN completa no software? Eu adoraria ver o código PIC18F para isso.
Rocketmagnet

Sim, implementou a especificação CAN completa, a fim de não duplicar o módulo ECAN no dsPIC, que cuida de muitos aspectos. Na implementação do PIC18, eu bati o barramento com as especificações completas e mais tarde, e esse código funcionará em um dsPIC usando linhas GPIO. Vou atualizar em alguns dias com o link para o código.
Eric M

0

Também estou pensando em trocar o protocolo CAN em um PIC µC, então, por favor, EricM, se você realmente fez isso, responda e diga pelo menos qual taxa de bits em que frequência de núcleo do PIC18F ou DSPic você obteve. Valeu!

Em geral: o RS 485 seria a solução para o problema principal solicitado, mas também seria possível usar os transmissores CAN- (ou mesmo FlexRay) com comunicações UART não full-duplex (ponto 2 ponto) como todos os protocolos use a codificação NRZ.

Mas, no UART / V24 / RS232, o full duplex é usado principalmente sem pensar em detalhes; talvez seja necessário colocar um pouco de cérebro no superloop ou na máquina de estado do seu aplicativo ...

Mas voltando ao CAN-bitbanging: estou trabalhando com o CAN por muitos anos e nunca vi uma implementação de bitbanging, mas tanto quanto posso pensar, isso deve funcionar para tempos de bits de até 100kBit tp até 100kBit com µC moderno como DSPic ou ARM etc. (tendo núcleos a 80 MHz ou superior ...)

Pelo menos se apenas a leitura for considerada ... O envio significaria alguma sobrecarga na preparação das estruturas de bits para que não fosse possível alcançar 100% de carga de barramento, mas no CAN mais de 65% é raro ...


2
Bem-vindo ao StackExchange de Engenharia Elétrica. A primeira parte da sua resposta não é realmente uma resposta, então você faz uma nova pergunta se é isso que deseja. O OP perguntou especificamente sobre a implementação de software do protocolo CAN e sua resposta parece vagar sem abordar essa questão; tente permanecer no tópico da pergunta.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.