Eu li muitas coisas sobre arbitragem de barramento CAN, mas isso não respondeu às minhas perguntas.
Se um nó já está transmitindo os dados no barramento e entre outro nó deseja iniciar a transferência de dados, como esse "outro nó" saberá que o barramento está ocupado?
Todos os documentos (que eu li) têm a condição de que ambos os nós estejam iniciando a transmissão simultaneamente e, em seguida, um com o primeiro bit dominante obterá o barramento, mas ninguém explicou a condição que eu quero saber.
Respostas:
A resposta curta é que o nó deve monitorar as linhas CAN para ficar ocioso por um certo tempo antes de tentar transmitir. Portanto, se outro nó estiver transmitindo, ele deverá permanecer quieto até que o outro nó esteja pronto.
Um barramento CAN é baseado em sinalização diferencial. As duas linhas, CAN-Alta (CAN +) e CAN-Baixa (CAN-), têm o mesmo potencial quando o barramento está ocioso. Para enviar bits, um transmissor CAN coloca uma tensão diferencial nas linhas de cerca de 2 volts.
Um transmissor CAN primeiro vê se o barramento está ocioso e, se estiver, começa a transmitir. Como a arbitragem funciona é que um transmissor monitora o barramento enquanto está transmitindo. A transmissão é feita como acima, mantendo as duas linhas no mesmo potencial ou em um potencial diferencial. Portanto, se o transmissor transmite um pouco mantendo as linhas no mesmo potencial (sic), mas vê que as duas linhas de transmissão têm um potencial diferencial, isso significa que algum outro nó está transmitindo e o primeiro transmissor perdeu a arbitragem. Deve então parar de transmitir.
Quando um nó começa a transmitir, os bits transmitidos são os mesmos até o endereço do nó transmissor que é obviamente diferente. Se dois nós começarem a transmitir juntos, eles transmitirão juntos em sincronia até que a parte do endereço seja alcançada. Quando o endereço é diferente, um nó notará uma diferença potencial nas linhas, mesmo quando não estiver colocando um nas linhas. Então ele sabe que perdeu e precisa tentar novamente. O nó vencedor continua transmitindo sem saber que algum outro nó estava tentando também. Obviamente, essa lógica se estende a mais de dois nós também.
Eu espero que isso ajude.
fonte
Conheço duas maneiras de resolvê-lo:
Primeiro, o controlador CAN sempre monitorava o barramento; quando detecta uma mensagem no barramento, inicia o processo de recebimento. Agora que está no estado de recebimento, ele sabe que o barramento está em uso quando uma transmissão é solicitada.
Segundo, pelo preenchimento de bits, o transceptor CAN não terá o mesmo bit por mais de cinco ciclos (a menos que um erro de barramento seja detectado; nesse caso, você verá até 12 bits dominantes seguidos). A exceção é quando nada está sendo transmitido no barramento, quando um bit passivo é sempre lido. Um controlador que estava começando pode ouvir o barramento por cinco ciclos antes de declarar 'provavelmente livre'.
Não garanto que esses sejam os processos reais, mas com base no meu conhecimento (limitado) do CAN, eles funcionariam.
fonte
Como o CoderTao diz - o controlador CAN está monitorando continuamente o barramento, para saber quando uma transmissão já está em andamento. Portanto, o único momento em que uma colisão pode ocorrer é quando os dois nós começam a transmitir "simultaneamente" - dentro de um bit de tempo um do outro (+ uma pequena quantidade de tempo adicional para a propagação do barramento). Portanto, esses são os únicos casos que você encontrou nos documentos :)
fonte
O endereço do nó determina a prioridade, os endereços inferiores sendo de alta prioridade. A transmissão começa com o nó transmitindo seu endereço. Ao mesmo tempo em que transmite, ouve. Digamos que o nó três e o dois transmitam ao mesmo tempo. Como o último bit do endereço, o nó três transmite um 1 e o nó dois transmite um 0. Por causa do 0, a linha de dados é puxada para o estado 0. O nó três vê que, em vez do 1 transmitido, a linha é 0 e para de transmitir.
O CAN foi usado pela primeira vez em carros e caminhões. Alguns sensores precisavam ter uma prioridade muito maior que outros. Por exemplo, a frenagem antiderrapagem precisava ter uma prioridade mais alta do que o líquido lavador de pára-brisa baixo.
fonte
Existem quatro elementos principais na especificação CAN que permitem aos controladores CAN detectar o estado do barramento inativo:
A sinalização AND com fio possibilita que o bit dominante transmitido por um dos nós seja detectado por todos os outros nós que transmitem o bit recessivo ao mesmo tempo. Portanto, se algum nó que estiver transmitindo bits recessivos vê o estado dominante do barramento, ele sabe que o barramento está ocupado .
O preenchimento de bits garante que não haja mais que 5 bits consecutivos idênticos. Por si só, o preenchimento de bits é usado para manter a sincronização. No entanto, um efeito colateral disso é que não podem ocorrer mais do que 5 bits recessivos consecutivos dentro dos bits do quadro até o delimitador CRC.
Fim do quadro é uma série de 7 bits recessivos no final de um quadro. Eles não são cheios de bits, portanto podem ser facilmente detectados pelos controladores. Observe que o barramento ainda não está ocioso durante esse tempo, pois o EOF é considerado parte do quadro.
O espaço entre quadros é uma série de 3 bits de intervalo recessivos entre os quadros, seguidos pelo estado ocioso do barramento. Nenhum nó tem permissão para iniciar uma transmissão durante o intervalo, a menos que deseje enviar quadros de erro ou sobrecarga . Além disso, o nó que transmitiu o último quadro também deve enviar 8 bits de transmissão suspensa recessiva após o intervalo antes de iniciar outra transmissão. Esse último requisito permite que outros nós comecem a enviar mensagens pendentes, portanto, nenhum nó pode "monopolizar o barramento" indefinidamente.
De todas as opções acima, eis como os nós detectam o estado do barramento inativo:
Nós de recebimento simplesmente esperam 10 bits recessivos consecutivos , que incluem EOF e intervalo. Após esse período, eles consideram o ônibus inativo e podem tentar iniciar a transmissão por conta própria.
O nó de transmissão envia 11 bits recessivos consecutivos após o EOF do último quadro que ele transmitiu. Se nenhum outro nó inicia a transmissão durante esse período, ele considera o barramento inativo e pode tentar iniciar outra transmissão. Se um bit dominante for detectado durante esse período, o nó se tornará um receptor.
As informações acima, além de informações adicionais sobre o tempo de bits, podem ser encontradas na especificação CAN desenvolvida pela BOSCH.
fonte
Um nó específico inicia sua transmissão somente após o período INTERMISSION (essa duração também é chamada de duração SUSPENDED); nesse período, 3 bits recessivos são transmitidos ao barramento após a transmissão do quadro DATA / REMOTE ao barramento. Isso indica que o barramento está no estado IDLE), porque, durante esse período, nenhum dos nós inicia a transmissão. Após o barramento estar no estado inativo, o nó que deseja o barramento para transmissão entra na ARBITRAGEM.
Após a transmissão do espaço entre os quadros para o barramento, os nós presentes na rede CAN tentarão iniciar a transmissão. Portanto, um nó específico sabe se o barramento está ocupado ou não.
fonte