Qual é o protocolo geral para enviar informações de um sistema para outro? Por exemplo, digamos que temos algumas informações coletadas do microcontrolador por um período de tempo que queremos enviar para outro microcontrolador. Ouvi falar de interfaces SPI e I2C, mas não estou claro quando você usa um método sobre outro e como implementá-lo. Existem outros métodos além do SPI e I2C que são comuns? O processo de implementação é semelhante para diferentes microcontroladores? É basicamente analisando bytes de dados que estou fazendo no microcontrolador receptor?
18
Respostas:
O SPI e o I2C são semelhantes, pois são realmente mais usados para conectar dispositivos periféricos a um controlador ou CPU, do que para transferir dados entre sistemas. USB é outra interface que as pessoas parecem querer tratar como um sistema de comunicação, que na verdade é um barramento de conexão periférica.
A comunicação entre sistemas não é exatamente como conectar um dispositivo a um barramento. A conexão de barramento permite que o processador bata diretamente nos registros de um dispositivo, enquanto uma interface de comunicação permite enviar / receber fluxos de dados. Um dispositivo conectado a um barramento geralmente precisa de um driver de dispositivo, enquanto que nas comunicações realmente não importa o que está conectado na outra extremidade, no que diz respeito ao computador host.
Obviamente, isso está se tornando um limite mais perigoso o tempo todo. Coisas como PCI e ISA são ônibus indisputavelmente; I2C, SPI, USB são sem dúvida barramentos; enquanto RS232, RS485 e ethernet são definitivamente interfaces de comunicação. Mas existem coisas como o barramento CAN e o 1553, que são definitivamente sobre a movimentação de dados, mas de uma maneira muito envolvente.
fonte
Não há uma maneira de enviar dados, há muitas maneiras diferentes de se comunicar, dependendo da distância, taxa de dados, ambiente, aplicativo ...
A camada mais baixa é a camada física , que realmente move os bits.
SPI e I²C são para pequenas distâncias dentro de um dispositivo, onde não há muito ruído que possa atrapalhar a transmissão.
Para uma comunicação não muito rápida em distâncias de até algumas dezenas de metros, a comunicação serial via RS-232 é uma boa opção.
Se houver mais ruído ou sinais diferenciais de distância maior forem usados, por exemplo, no RS-485. Para uma transmissão de dados mais rápida, há a Ethernet, que está se tornando cada vez mais popular.
Depois, há também vários padrões sem fio.
No topo da camada física, há mais camadas organizando como os dados são enviados, para detectar e corrigir erros na transmissão, roteamento em uma rede e muitas outras coisas. Por exemplo, o protocolo da Internet é uma pilha bastante complexa de várias camadas, geralmente em cima do protocolo Ethernet.
fonte
Um UART serial simples pode ser usado (uma linha Tx e uma linha Rx sem relógio discreto) e pode ser facilmente adaptado para cruzar entre diferentes potenciais (mesmo circuitos primários e secundários) com optoisoladores ou isoladores magnéticos .
No que diz respeito aos protocolos, qualquer coisa com bytes de comando definidos e algum tipo de esquema de soma de verificação funcionará bem. Realmente não existe um protocolo padrão abrangente que se adapte a todos os tipos de comunicação. O I2C possui padrões de sinalização (definição de endereçamento, paradas, partidas etc.), mas o protocolo do que está sendo realmente comunicado depende apenas do desenvolvedor.
O PMBus , por exemplo, é um protocolo de comunicação da fonte de alimentação que usa o I2C como meio físico.
fonte
Realmente não existe um protocolo "geral", o que você acaba usando depende muito do aplicativo. Para que possamos lhe dar uma resposta melhor, precisamos entender um pouco melhor suas necessidades. Você mencionou que gostaria de ter microcontroladores separados conversando entre si como subsistemas.
Algumas perguntas sobre este aplicativo:
Se você respondeu NÃO à pergunta 1:
Se houver apenas 2 microcontroladores neste projeto, você pode definitivamente usar o UART entre eles. Se os dois precisarem iniciar a comunicação, use o controle de fluxo; caso contrário, será trivial enviar dados em uma direção. Na maior parte, deve ser "rápido o suficiente", pois você seleciona uma das taxas de transmissão mais altas. I2C e SPI normalmente são bons apenas para arquitetura mestre / escravo.
Se você respondeu SIM (mais de 2 controladores) à pergunta 1:
Portanto, agora você precisa de algo mais escalável, onde possa colocar dispositivos endereçáveis em um barramento comum. A resposta para essas perguntas de acompanhamento o ajudará a decidir entre I2C e SPI (mestre-escravo) ou algo como CAN (multi-mestre).
Seu microcontrolador provavelmente possui um periférico UART, os outros (especialmente o CAN) podem estar disponíveis apenas em chips mais avançados. Em qualquer um dos casos, deve haver muita documentação sobre como usar esses periféricos para mover bytes.
fonte
Como observou @Jon, um problema na seleção de uma interface de comunicação é se uma entidade sempre será responsável por iniciar as comunicações ou se mais de uma entidade pode ser responsável. Uma questão relacionada é se uma entidade estará sempre pronta para receber comunicações não solicitadas. O SPI é freqüentemente usado em aplicativos em que um lado estará sempre pronto para receber comunicação. Algo como um registro de turno 74HC595, por exemplo, nunca está "ocupado". Embora o SPI seja bom para a comunicação entre um microcontrolador e o hardware que o micro deve controlar, ele não é realmente bom para a comunicação entre dois microcontroladores. Quando dois processadores com hardware I2C o estão usando para se comunicar, o software pode levar o tempo que quiser (com restrições muito generosas) para lidar com o que está acontecendo, sem causar perda de dados. Se um processador levasse 100 microssegundos para processar cada byte recebido, isso limitaria severamente a taxa de transferência, mas o remetente diminuiria a velocidade o suficiente para o receptor acompanhar. A única maneira que geralmente pode acontecer com o SPI é se houver um fio separado para o aperto de mão.
O I2C é realmente um protocolo maravilhoso. As maiores limitações que o impedem de ser o protocolo mais perfeito que se possa imaginar são:
Pessoalmente, gostaria que os fornecedores de controladores suportassem uma variante de SPI de três fios, que incluía handshake. No entanto, não conheço nenhum controlador que faça isso.
fonte
Em nenhuma ordem específica, as instâncias da camada física mais populares para 2 CPUs na mesma caixa parecem ser:
Essas instâncias da camada física (assim como outras instâncias da camada física para 2 CPUs em caixas separadas) geralmente fornecem um fluxo de bytes ao software que implementa os níveis mais altos do sistema de comunicação.
Programadores inteligentes escrevem o software de tal maneira que, quando o técnico decide separar uma instância da camada física e substituí-la por uma instância da camada física completamente diferente, eles precisam apenas reescrever algumas funções para alimentar o fluxo de bytes de saída para o hardware e leia de volta um fluxo de bytes do hardware, e todo o protocolo de nível superior continua funcionando inalterado.
O protocolo para enviar informações de uma CPU para outra CPU quase sempre envolve a interpretação do fluxo de bytes como uma série de pacotes:
Algumas pessoas parecem gostar de criar protocolos totalmente novos, personalizados e incompatíveis misturando e combinando (2) um dos muitos tipos de estrutura de cabeçalho com (3a) um de muitos tipos de serialização de dados com (3b) um dos muitos tipos de escapando desses dados serializados com (4) um dos muitos tipos de trailer.
Alguns dos protocolos mais simples para encapsular dados em um pacote incluem:
Protocolos ligeiramente mais complicados para encapsular dados em um pacote incluem:
Há uma longa lista de protocolos em
Você pode ler "Folclore de Design de Protocolo", de Radia Perlman, que descreve como o design de protocolo pode dar errado.
fonte
Nenhum protocolo 'geral' único. A escolha pode (por exemplo) depender de:
Em muitos casos, você deve desitar a camada física (níveis de sinal) da camada de enlace de dados (+/- a maneira como os dados são codificados) (verifique o modelo OSI, abaixe 2 ..4 camadas). Possíveis camadas phyiscal são, por exemplo:
Você pode usar uma linha para transportar dados e informações do relógio ou dividi-las em várias linhas. Este último costumava ser popular, mas hoje em dia a maioria dos protocolos novos / rápidos tendem a usar uma linha (ou um par de linhas atuando como uma).
Existem várias maneiras de codificar dados e relógio em uma linha. Tradicionalmente, o RS232 usa NRZ, existe a codificação Machester e os vários formatos usados em discos rígidos com nomes curiosos na linha 2.7 RLL.
Resumindo: há um milhão de maneiras de se comunicar entre sistemas. E eu nem mencionei conectores ou aspectos de nível superior, como detecção e recuperação de erros, codificação de dados, compactação e criptografia ...
fonte