¿Cuáles son los pros y los contras de la interfaz I2C versus SPI?

I2C pros / SPI contras

  • I2C necesita menos conexiones: solo se necesitan 2 cables de señal, frente a 3 + n para SPI donde n es el número de dispositivos esclavos que necesitan líneas SSEL o CS (es decir, en SPI, si tiene cinco dispositivos, necesita 3 + 5 líneas).
  • I2C usa direccionamiento de chip, lo que significa que no hay necesidad de líneas SSEL / CS (igual que arriba), y los dispositivos I2C se pueden agregar fácilmente al bus. Para agregar un dispositivo a un bus SPI, necesitaría agregar una línea SSEL / CS adicional, y necesitaría saber exactamente qué líneas SSEL / CS están conectadas a qué dispositivos.
  • I2C utiliza un bus de colector abierto, que permite cierta flexibilidad en el voltaje del bus (en muchos casos, pero no en todos los casos, se pueden mezclar dispositivos lógicos de 3.3V y 5V). En SPI, el voltaje del bus debe ser el que sea compatible con todos los dispositivos.
  • I2C es multimaestro. Es posible que múltiples dispositivos en el bus sean el dispositivo maestro, y también cambiar un dispositivo entre dispositivo maestro y esclavo (si es compatible), sin necesidad de cambiar el cableado. En SPI, las relaciones maestro / esclavo se fijan mediante el cableado.

Pros de SPI / Contras de I2C

  • SPI tiene un protocolo más simple, y en la mayoría de los microcontroladores tiene menos gastos generales de procesamiento. I2C en la mayoría de los microcontroladores requiere una pila controlada por software para controlar el protocolo.
  • SPI tiene velocidades más rápidas y rangos más largos. SPI puede usar push-pull y, por lo tanto, puede conducir líneas más rápido que I2C, cuyo diseño de colector abierto significa que las velocidades de rotación son limitadas y se ven afectadas por la capacitancia de línea.
  • SPI ejecuta full-duplex ya que tiene líneas separadas para transmitir y recibir. I2C es solo half-duplex.
  • SPI utiliza líneas SSEL / CS, lo que permite conectar múltiples chips del mismo tipo. En I2C, generalmente hay un número limitado de combinaciones de direcciones seleccionables por el usuario para un chip (y requiere que la dirección se seleccione en la etapa de diseño del circuito), y los conflictos de direcciones son posibles entre dos chips diferentes.

Resumen: I2C es más flexible. SPI es más rápido.

I2C pros: direccionamiento simple, solo dos líneas por bus, un reloj y un dato para todos los dispositivos conectados.

Contras I2C: velocidades de comunicación lentas de 100 kHz y 400 kHz para el modo rápido. Sin embargo, he visto 1,2 MHz.

Pros de SPI: No hay límite superior en la velocidad de comunicación en el protocolo en sí. Solo está limitado por su interfaz eléctrica y dispositivos conectados. 50 MHz y más se utilizan con tarjetas SD en modo SPI. Tenga en cuenta que la mayoría de las PC usan MMC con tarjetas SD a velocidades mucho más altas.

Contras de SPI: se requiere una selección de chip por separado para abordar cada dispositivo utilizando así los preciosos pines gpio. Esto se puede mitigar con un multiplexor IO.

Se deben considerar niveles más bajos de la interfaz, como el byte más significativo frente al byte menos significativo, la fase de reloj y la polaridad. Sin embargo, esto también le da versatilidad para comunicarse con los dispositivos del cliente.

1. I2C requiere solo 2 pines para hasta 128 dispositivos (teóricamente hablando) porque usa direccionamiento en software. SPI requiere 3 + N pines para donde N es el número de dispositivos conectados (selecciones de chip).
2. I2C se puede utilizar para la comunicación entre placas, así como a distancias más largas en comparación con SPI.
3. El ancho de banda de I2C es limitado en comparación con el mayor ancho de banda de SPI.

Con estas diferencias importantes normalmente en cualquier implementación, el factor decisivo es el # 1 mencionado anteriormente.

I2C solo requiere dos cables, y puede colgar bastantes dispositivos en paralelo. Solo necesita asegurarse de que sus dos resistencias pullup requeridas sean lo suficientemente fuertes como para manejar la carga. Sin embargo, todos los dispositivos deben tener una dirección esclava única, lo que generalmente no es un problema, ya que la mayoría de los dispositivos i2c tienen una o más líneas de dirección que puede configurar para cambiar su dirección esclava. Es más lento que SPI, y la mayoría de los dispositivos pueden ejecutarse a 100kbits / so 400kbits / s. Hay algunos dispositivos que pueden ir a 1mbit / so 3.2mbit / s.

SPI, por otro lado, generalmente requiere un mínimo de cuatro cables, reloj (SCK), salida de datos (MOSI), entrada de datos (MISO) y selección de esclavos (SS) y puede ejecutar hasta 10mbit / s. Ahora es posible conectarlos en cadena conectando los datos del primer dispositivo a los datos del segundo dispositivo y así sucesivamente. Los datos del último dispositivo se vinculan a MISO en el maestro. También puede conectarlos todos en paralelo, excepto las líneas de selección esclavo. Cada uno debe tener su propio control por separado. Esta es la forma más común de conectar varios dispositivos SPI juntos desde un solo bus.

Ya hay muchas respuestas, así que solo agregaré:

  • SPI se puede encadenar (debe prestar atención al tamaño de la palabra), en este modo, el recuento de cables no aumenta linealmente con la cantidad de esclavos.
  • Puede implementar un método de direccionamiento como I2C en SPI si lo desea. Nuevamente, el recuento de cables no necesita explotar linealmente. Solo puede hacer esto si puede controlar cómo el esclavo SPI trata el paquete entrante.

La respuesta de Yuan Gao está bien escrita, precisa y pensada y completa.

Concuerdo completamente.

información detallada completa disponible aquí:
¿Cuál es la diferencia entre I2C y SPI?
Protocolo serial síncrono I2C vs SPI