¿Cuál es el bus serie integrado más popular? [cerrado]

Estoy diseñando un dispositivo integrado que me gustaría que sea interoperable con periféricos de terceros a través de un bus serie. ¿Debo elegir SPI, I²C o algún otro bus?

Los periféricos tendrán un ancho de banda bastante bajo (algunos sensores que se comunican a través del bus, encuestados periódicamente) y muy probablemente dentro de un metro o menos del controlador. La única tarea del controlador es recopilar los datos del sensor, empaquetarlos de alguna manera y luego enviarlos a un módulo inalámbrico a través de otro bus (aunque el bus del sensor también podría reutilizarse para esto).

Depende de con qué periféricos desee interoperar, a qué voltajes, a qué velocidades ya qué distancia.
Agregué más detalles a la pregunta.
No puedo creer que UART no haya sido mencionado en absoluto... Solo digo.
Corrígeme si me equivoco, pero no pensé que UART fuera un autobús. Pensé que era solo una comunicación en serie entre dos dispositivos.
Entonces, ¿un bus no es para la comunicación en serie entre dos dispositivos? ¿Lo estás descontando porque a veces solo se usa punto a punto? PCIe, SATA, HT son generalmente punto a punto. Independientemente, la mayoría de los periféricos UART se pueden usar para RS-422, RS-485 o LIN, que son multipunto.

Respuestas (5)

Si no está seguro y sus requisitos son bastante vagos, elegiría I²C.

La principal diferencia entre SPI e I²C es que SPI requiere una línea de selección de chip para cada periférico. I²C transmite una dirección periférica al comienzo de la comunicación, por lo que no necesita líneas de selección de chip. Las líneas de selección de chips se vuelven engorrosas después de las primeras.

Por otro lado, SPI es probablemente más fácil de implementar y depurar. Podría ser el ganador si solo desea conectarse a un par de dispositivos.

Descartaría el USB a menos que necesite altas velocidades de datos en distancias relativamente largas (m en lugar de cm). También descartaría RS-232 a menos que todavía sea 1976 y sus periféricos necesiten una señal masiva para distinguir un poco del ruido.

Puede considerar Dallas de 1 cable, pero sospecho que no es tan común como I²C, y un bus de "1 cable" que necesita 2 cables para funcionar siempre me ha parecido un poco sospechoso.

Creo que si tiene un controlador muy simple y necesita usar bit-banging (básicamente operar manualmente el reloj) es mucho más fácil implementar SPI en 4 puertos GPIO sobrantes.
Creo que tienes razón acerca de que es más fácil bitbang SPI que I2C. Sin embargo, espero que no se reduzca a golpes.
+1 por el aspecto sospechoso del sistema de 2 cables comercializado como "1 cable".
Y para empeorar las cosas, muchos chips que implementan el sistema de 1 cable (+tierra) requieren un tercer pin, Vcc, ¡porque no pueden operar con energía parásita! Cuando pienso en un bus de 1 cable, me imagino una configuración acoplada capacitivamente, con un puente rectificador de corriente limitada y algún código de línea de sincronización automática; no 2 o 3 cables.
"1 cable" debería haberse llamado "1 cable de datos", ya que eso es más de lo que es. Los cables adicionales son GND y (a veces) una línea de alimentación estable.

Como dijiste que sería un ancho de banda bajo, asignaría suficiente IO para manejar tanto SPI como I2C. También, si es posible, tendría líneas CS adicionales para que pueda ejecutar múltiples dispositivos SPI. Además, no olvides mirar cómo vas a alimentar el periférico. Si se está quedando sin batería para obtener la vida útil máxima, debe poner el dispositivo en modo de bajo consumo o desconectar la alimentación cuando no esté en uso. También use su módulo de controlador serial de controladores si es posible, muchos controladores mux SPI, I2C y serial. Si puede y separa la conexión inalámbrica del sensor, esto hace que sea más fácil apagar los dispositivos cuando no están en uso. Además, algunos sensores tienen una línea que le indicará al controlador cuándo deben recibir servicio, por lo que también desea tener un IO adicional en un pin, idealmente uno desde el que pueda generar una interrupción.

La pregunta es un poco problemática debido a problemas de definición.

La comunicación serializada es básicamente lo que necesita si desea comunicarse con algún periférico externo sin usar innumerables puertos en su controlador. Básicamente, cada método de comunicación en serie necesita un reloj y una configuración sobre cómo manejar las conexiones de datos.

SPI es un bus de 4 hilos. I2C es un bus de 2 hilos.

Cada uno tiene características diferentes. Lo que debe responder es qué tan rápida debe ser su comunicación, qué tan confiable debe ser, qué opciones ofrece su microcontrolador, etc.

Este artículo de wikipedia y este sitio de referencia explican mucho más claramente de lo que yo puedo, ¡también siga las referencias para aprender aún más!

Básicamente, debe elegir entre I2C y SPI.

Independientemente del bus que utilice, debe considerar el nivel de voltaje de sus sensores y periféricos de terceros. Puede hacer esto haciendo su propio convertidor con dos MOSFET (solo va en una dirección: recoger/sin cambios o bajar/sin cambios; solo es un problema si necesita ejecutar sus sensores en 3.3 e interactuar con maestros de 1.8 y 5V). Consulte AN10441 de NXP [PDF]. Esto también funcionará para SPI (simplemente elimine los pullups). Deberá agregar una línea a su conector para establecer un voltaje de referencia (si aún no lo está haciendo).

Una desventaja de I2C es que está limitado al reloj más lento del autobús. Si un sensor solo es capaz de 100 kHz y desea hablar con su memoria a 400 kHz o 1 MHz (ambas velocidades válidas), el comportamiento de su sensor más lento no está especificado. Si usa SPI, la línea de selección de chip significa que el sensor más lento ni siquiera escuchará lo que hay en el bus, y puede ejecutar diferentes velocidades para diferentes sensores.

Yo usaría I2C. Solo asegúrese de que puede obtener un módulo inalámbrico que pueda comunicarse a través de I2C si desea tenerlo en el mismo bus que sus sensores. La mayoría de los periféricos de comunicaciones que he visto usan SPI, no I2C.