Estou projetando um dispositivo incorporado que gostaria de tornar interoperável com periféricos de terceiros por meio de um barramento serial. Devo escolher SPI, I²C ou algum outro barramento?
Os periféricos terão uma largura de banda bastante baixa (alguns sensores que se comunicam pelo barramento, sondados periodicamente) e provavelmente dentro de um metro ou menos do controlador. A única tarefa do controlador é coletar os dados do sensor, empacotá-los de alguma forma e enviá-los para um módulo sem fio por outro barramento (embora o barramento do sensor possa ser potencialmente reutilizado para isso também).
Respostas:
Se você não tiver certeza e seus requisitos forem bastante vagos, eu escolheria I²C.
A principal diferença entre SPI e I²C é que o SPI requer uma linha de seleção de chip para todos os periféricos. O I²C transmite um endereço periférico no início da comunicação, para que não precise de linhas de seleção de chip. As linhas de seleção de chips ficam complicadas depois dos primeiros.
Por outro lado, o SPI é provavelmente mais fácil de implementar e depurar. Pode ser o vencedor se você quiser apenas se conectar a alguns dispositivos.
Eu excluiria o USB, a menos que você precise de altas taxas de dados em distâncias relativamente longas (m em vez de cm). Eu também descartaria o RS-232, a menos que ainda seja 1976 e seus periféricos precisem de um sinal massivo para distinguir um pouco do ruído.
Você pode considerar Dallas 1-wire, mas suspeito que não seja tão comum quanto o I²C, e um ônibus "1-wire" que precisa de 2 fios para operar sempre me pareceu um pouco suspeito.
fonte
Como você disse que a largura de banda seria baixa, alocaria IO suficiente para lidar com o SPI e o I2C. Eu também teria, se possível, linhas CS adicionais para que você possa executar vários dispositivos SPI. Também não se esqueça de ver como você vai alimentar o periférico. Se você estiver usando a bateria para obter vida útil máxima, é necessário colocar o dispositivo no modo de baixa energia ou remover a energia quando não estiver em uso. Use também o módulo de controle serial dos controladores, se possível, muitos controladores usarão o SPI, I2C e serial. Se você puder dividir a conexão sem fio do sensor, será mais fácil desligar os dispositivos quando não estiverem em uso. Além disso, alguns sensores possuem uma linha que informa ao controlador quando eles precisam ser reparados, para que você também deseje ter um IO extra entrando em um pino, idealmente do qual você possa gerar uma interrupção.
fonte
A questão é um pouco problemática por causa de problemas de definição.
Comunicação serializada é basicamente o que você precisa se quiser se comunicar com algum periférico externo sem usar várias portas no seu controlador. Basicamente, todo método de comunicação serial precisa de um relógio e uma configuração sobre como lidar com conexões de dados.
O SPI é um barramento de 4 fios. I2C é um barramento de 2 fios.
Cada um tem características diferentes. O que você precisa responder é a rapidez com que sua comunicação precisa ser, a confiabilidade que precisa ser, que opções seu microcontrolador oferece etc.
Este artigo da Wikipedia e este site de referência explica muito mais claramente do que eu posso, também siga as referências para aprender ainda mais!
fonte
Basicamente, você deve escolher entre I2C e SPI.
Independentemente de qual barramento você usar, considere o nível de tensão de seus sensores e periféricos de terceiros. Você pode fazer isso criando seu próprio conversor com dois MOSFETS (só funciona de uma maneira - pegar / sem alteração ou abaixar / sem alteração; apenas um problema se você precisar executar seus sensores em 3.3 e fazer interface com mestres de 1,8 e 5V). Veja o AN10441 da NXP [PDF]. Isso também funcionará para o SPI (basta remover os pullups). Você precisará adicionar uma linha ao seu conector para estabelecer uma tensão de referência (se ainda não estiver fazendo isso).
Uma desvantagem do I2C é que você está limitado ao relógio mais lento do ônibus. Se um sensor é capaz apenas de 100kHz e você deseja conversar com sua memória a 400kHz ou 1MHz (ambas as velocidades válidas), o comportamento do seu sensor mais lento não é especificado. Se você usa SPI, a linha de seleção de chips significa que o sensor mais lento nem ouvirá o que está no barramento, e você poderá executar velocidades diferentes para sensores diferentes.
fonte
Eu usaria I2C. Apenas certifique-se de obter um módulo sem fio que possa se comunicar via I2C, se você quiser tê-lo no mesmo barramento que seus sensores. A maioria dos periféricos de comunicação que vi usam SPI e não I2C.
fonte