Enrutamiento de bus I2C y SPI

Al enrutar un bus I2C (SDA, SCL) o un bus SPI (SCLK, MOSI, MISO) a varios esclavos, ¿se prefiere cablear los esclavos en paralelo o en serie? A continuación hay dos diagramas con distancias etiquetadas para ayudar a responder. En todos los esquemas, veo que las personas parecen conectarse en serie, pero ¿por qué es este el caso? ¿Qué sucede si la capacitancia de la ruta (A + B + C) < capacitancia de (MNP)?

Paralelo:ingrese la descripción de la imagen aquí

Serie:ingrese la descripción de la imagen aquí

Respuestas (2)

No estoy de acuerdo con la declaración de Madmanguruman: "Tanto para I2C 'normal' como para SPI 'normal', cada esclavo necesita una conexión directa con el maestro, por lo que todos los esclavos están en paralelo, independientemente de la ubicación física de los dispositivos". Los registros de desplazamiento suelen estar conectados en serie, lo que genera un gran bucle que requiere varios desplazamientos para hacer circular los datos. Ese es solo un ejemplo de una conexión en serie válida y hay muchos más. Es probable que el paralelo sea más común, como explicaré a continuación, siempre que los dispositivos esclavos no sean registros simples o literalmente de desplazamiento. La forma en que lo haga depende completamente de los requisitos de su diseño, así como de la funcionalidad de sus dispositivos esclavos.

Más detalles:

Usar la palabra serie realmente tiene sentido. Lo que está diciendo es que el pin MOSI (salida maestra / entrada esclava) en el maestro está conectado a la entrada de datos en serie del esclavo 1. La salida de datos en serie del esclavo 1 está conectada a la entrada de datos en serie del esclavo 2 y el serial la salida de datos del esclavo 2 está conectada a la entrada de datos en serie del esclavo 3. Finalmente, para completar el bucle (suponiendo que desea una comunicación bidireccional), debe conectar la salida de datos en serie del esclavo 3 a la entrada de datos en serie del maestro. Para que esto funcione, el reloj generado por el maestro debe estar conectado a cada esclavo. Además, es probable que cada esclavo deba estar en la misma señal de selección de chip para asegurarse de que el hardware SPI responda. Para leer de los tres esclavos, tendría que enviar tres transmisiones desde el maestro.

Si conecta todo en paralelo, ahora necesita una selección de chip discreta para cada esclavo. La capacitancia de las señales de datos debe ser ligeramente mayor en esta configuración y es poco probable que la capacitancia de la señal del reloj sea drásticamente diferente.

En lo que respecta al enrutamiento, probablemente no importará siempre que se mantenga por debajo de los 100 MHz más o menos. Las frecuencias más altas comienzan a introducir otros problemas. De todos modos, hay muchas razones para ir en cualquier dirección. Ciertamente puede depender de las limitaciones de su firmware. Editar: como señaló MartinThompson, si su ruta es larga con un controlador fuerte (velocidad de borde rápido), es posible que los reflejos causen problemas. Si está realizando una ruta de múltiples puntos y espera velocidades de borde rápidas, la terminación de la señal debería ser de gran ayuda. Esta podría ser otra conversación, pero basta con decir que puede agregar terminadores en serie o referenciados a tierra para absorber la energía y evitar reflejos.

Por ejemplo, muchos microcontroladores le permitirán interactuar con dispositivos SPI mediante DMA. Si todos los esclavos están en la misma selección de chip, se necesita menos código para comunicarse con todos ellos, pero la latencia es mayor, ya que tiene que cambiar más datos para completar la transacción. Los esclavos también pueden señalar que quieren transmitir, pero dado que el maestro genera el reloj, la conexión en serie puede causar algunos dolores de cabeza aquí. Sin embargo, si no le importa ese caso de uso, el cableado en serie simplificará la configuración de DMA. Es posible utilizar DMA para comunicarse con varios periféricos incorporando la selección de chip en los datos, lo que hace que el controlador DMA se establezca en contacto con el esclavo adecuado. Puede que ni siquiera tengas DMA, pero pensé que debería explicar esto para darle un ejemplo de por qué una configuración en serie puede ser ventajosa en algunas circunstancias. DMA también trivializa las conexiones paralelas, para ser justos, y con bastante frecuencia las conexiones paralelas son mucho más deseables en este tipo de situación.

El cableado en paralelo es probablemente la forma más tradicional de hacerlo según mi experiencia si el dispositivo esclavo funciona a un nivel más alto que el simple cambio. Conecto los registros de desplazamiento en serie todo el tiempo, pero con frecuencia conecto varios microcontroladores esclavos en el bus SPI en paralelo para que cada uno obtenga su propia selección de chip y selección de esclavo (la selección de esclavo se asigna para la comunicación esclavo -> maestro, que básicamente dice "oye necesito enviar datos, dame un reloj").

Por último, no puede conectar I2C en serie a menos que desee utilizar diferentes buses I2C para dispositivos de bajada. I2C requiere que todos los dispositivos estén conectados en paralelo. Lo único que debe importarle eléctricamente es que haya elegido el valor correcto para la resistencia pull-up externa. Debido a que puede haber muchos dispositivos (con un valor de 7 bits) conectados al bus I2C, un pull-up débil podría hacer que las señales del bus sean metaestables desde la perspectiva de todo lo que está observando el bus en busca de datos entrantes. Desea asegurarse de que la línea SDA esté firmemente alta antes del próximo ciclo de reloj y lo hace dimensionando correctamente la resistencia pull-up.

Tendría cuidado con las frecuencias SCLK muy por debajo de 100MHz. Si SCLK se controla desde un controlador rápido, y la traza es lo suficientemente larga, incluso a 1 MHz, entonces se pueden obtener efectos horribles en la línea de transmisión y sincronización múltiple...
@MartinThompson Tienes razón. Gracias por señalar eso. Agregaré eso a mi respuesta.

No estoy seguro de lo que quiere decir con cableado de los buses en serie. Tanto para I2C 'normal' como para SPI 'normal', cada esclavo necesita una conexión directa con el maestro, por lo que todos los esclavos están en paralelo, independientemente de la ubicación física de los dispositivos.

Su diagrama de serie implica que el esclavo 3 de alguna manera tiene que pasar por el esclavo 2 y el esclavo 1 para llegar al maestro. El bus N y el bus P no están conectados al maestro, por lo que no se trata de un I2C o SPI normal. I2C y SPI simplemente no funcionan de esta manera, a menos que los esclavos 2 y 1 actúen como maestros y esclavos y transmitan mensajes en buses dedicados, un esquema terriblemente ineficiente y complicado.

Reconsidera lo que has visto y lo que estás preguntando.

Tiene razón en que la distinción entre paralelo y serie es falsa; en realidad, ambos casos son de los buses en paralelo. Supongo que lo que estoy preguntando es cómo deben colocarse los esclavos, de tal manera que se reduzca la longitud total del bus.
No hace mucha diferencia si la frecuencia es baja. La longitud de onda de 400 kHz es de 750 m. Incluso si está ejecutando I2C a 400 kHz, hará poca diferencia cómo se enrutan las trazas a esa frecuencia. La longitud de onda de 10 MHz es de 30 m. Entonces, para SPI de 10 MHz, probablemente tampoco hará mucha diferencia. Sin embargo, probablemente sería una buena idea minimizar la longitud de cualquier 'tallo' que cuelgue de las pistas (especialmente la pista del reloj), ya que pueden producir reflejos molestos si el reloj tiene un borde afilado. Una conexión 'serie' ayudaría significativamente con esto.