Quiero que un RPi actúe como maestro SPI y pueda comunicarse con 24 esclavos SPI. La conexión SPI es full-duplex. Los esclavos SPI están a unos 50 cm del maestro (SPI se ejecuta en cables a otra placa PCB que no se considera aquí). Los 24 esclavos serán placas Blue Pill STM32 , tengo que usar DMA en el esclavo SPI (la CPU está muy ocupada).
Me he comunicado con éxito mediante SPI con cables sin blindaje de 50 cm con una velocidad de transmisión lo suficientemente razonable para mi aplicación (9 MHz).
Estoy bastante seguro (aunque no lo he probado) de que tendré problemas debido a los múltiples esclavos SPI y los cables largos, así que diseñé un esquema y me gustaría que me dijera qué puede funcionar y qué no. Probablemente también haya espacio para simplificaciones.
74HC595
registros de desplazamiento conectados en cadena para generar 24 salidas que determinarán a qué esclavo SPI se conectará el RPi.CD54HC125
búferes cuádruples de tres estados para aislar los otros esclavos SPI cuando esté conectado a uno, estos serían impulsados por las salidas de los registros de desplazamiento.SER
, SRCLK
y RCLK
conducir los registros de desplazamientoSPI_CS
, SPI_MISO
y controlar la comunicación SPI (RPi es el maestro SPI_MOSI
)SPI_SCLK
SER
, SRCLK
e RCLK
impulsado por el RPiSPI_x
salida impulsará un búfer de tres estadosSPI_x
cambios01x04
conector macho conduce a un esclavo SPISPI_0
)SPI_MISO
está invertida porque es un pin de salida del esclavo¡Este es mi primer diseño de KiCAD, la revisión y los comentarios serían muy apreciados antes de comprar componentes e intentar probarlos en una placa de prueba! Después de eso, planeo diseñar la PCB y fabricarla.
Acabo de probar la comunicación entre una Raspberry Pi (maestra) y 6 placas blue pill (STM32), full-duplex.
Sin ningún dispositivo adicional ya pesar del mal cableado, la comunicación funciona a 10 MHz de forma fiable; 99,6% sobre 12 000 mensajes (comprobado con una suma Flechter)
Si esto escala hasta 24 dispositivos o no, sigue siendo una pregunta :)
¿Por qué "aislaría a los otros esclavos SPI cuando se conecta a uno"? El objetivo de usar SPI es que la línea CS activa solo un esclavo a la vez.
¿Es para lidiar con la carga de distribución en las líneas SCK y MOSI? Una simple señal de conducción de búfer "autobús" sería suficiente para esto.
¿O también es para multiplexar la señal SCK? No creo que necesites hacer esto. En lugar de usar registros de desplazamiento para multiplexar señales, puede usarlos para controlar directamente los pines CS de los esclavos. Si su software no emite una señal de reloj hasta que se selecciona el esclavo correcto, no hay absolutamente ningún daño en "activarlos" uno por uno sin transmisión real.
Creo que el factor limitante en su diseño es la capacitancia de línea, que crecerá independientemente de lo que conecte a las salidas, búferes o esclavos de RPi.
Por lo tanto, use registros de desplazamiento para activar los pines CS en los esclavos y use búferes de línea simples en SCK y MOSI.
ACTUALIZAR:
Estaba buscando otras cosas y encontré este chip que creo que encaja perfectamente en su aplicación. ADG731 es un multiplexor/demultiplexor controlado por SPI de 32 canales. Por lo tanto, puede colocarlo en el mismo canal SPI que sus esclavos para cambiar la línea CS entre ellos (el mux CS estará separado, por supuesto).
Esto funcionaría incluso mejor que cambiar CS con registros de desplazamiento como sugerí anteriormente, ya que
a) no estaría activando esclavos de inmediato mientras cambia,
b) puede apuntar a cualquier esclavo en cualquier orden, y
c) liberará 2 de los Líneas de E/S utilizadas para controlar los registros de desplazamiento
Agregue un pequeño búfer dual para SCK y MOSI y tendrá una solución de 2 chips más rápida y direccionable directamente en lugar de 27 chips con cambio de dirección.
Pham largo
Pham largo
brahans
Víctor Lamoine