Aumentar las salidas GPIO

Estoy trabajando en un proyecto en el que necesito 32 salidas de una MCU que solo tiene 8 salidas libres.

Para lograr mi objetivo tengo los siguientes requisitos:

  • Debo poder alternar más de una salida al mismo tiempo

  • Los datos deben llegar lo más rápido posible.

  • No puedo perder paquetes de datos

  • Los datos deben transferirse de forma fiable.

Pensé en usar un decodificador 4-16, pero no puedo cambiar más de una salida al mismo tiempo.

Puedo usar la comunicación I2C para expandir mis pines de IO, pero no estoy seguro de si tendré problemas con los paquetes de datos y el tiempo.

Una posibilidad es utilizar multiplexación.

Estoy usando un AM3359 ARM Cortex-A8 @ 25Mhz

¿Alguna otra idea?

¿Tienes que usar algún protocolo de datos específico? Aunque tiene que alternar más de una salida al mismo tiempo, ¿necesita poder alternar TODAS las salidas al mismo tiempo (es decir, hay un número máximo de salidas sincrónicas)?
Usted dice que necesita 32 salidas pero que los datos deben "entrar" lo más rápido posible. ¿Qué significa eso? Decir "lo más rápido posible" es una tontería... ¿cuál es su requisito real?
@JoeHass Es que necesito velocidad para alternar la salida, necesito hacer todo en menos de 1 us, por ejemplo. El tiempo que configuro el GPIO en el uC en el tiempo en que la salida final alcanza ese estado.
@gbmhunterNo tengo que usar un protocolo específico. Puedo usar algo de SPI o I2C. Las salidas que puedo alternar al mismo tiempo son aleatorias, por lo que puedo alternar solo una o dos al mismo tiempo, ya que puedo alternar todas las salidas al mismo tiempo.
Hacer todo en 1us implica que está alternando los GPIO externos a 1MHz o más y, por lo tanto, la comunicación con ellos debe ser aún más rápida. ¿Qué microcontrolador y velocidad de reloj? ¿Por qué no obtener un paquete más grande?
@ pjc50: tengo que usar esta MCU, no otra opción. Es un AM3359 ARM Cortex-A8, pero solo tengo 8 salidas libres para usar en él.

Respuestas (3)

I2C opera a 100kHz, 400kHz, 1MHz y 3.4MHz estándar. Muchos expansores i2c pueden hacer lo que necesita, tanto de entrada como de salida. Y tiene bits de reconocimiento, por lo que sabe (más o menos) si un expansor recibió el paquete de datos.

Sin conocer sus requisitos exactos de velocidad de datos, no puede estar seguro, pero los expansores i2c son tan buenos como cualquier otro tipo.

Actualización: Como mencionó 1 MHz y un mcu de 25 MHz, el expansor Microchip MCP23009 3.4MHz 8bit I2C podría funcionar. Se pueden usar hasta 8 en un solo bus usando un divisor de voltaje en el pin de dirección. El MCP23018 es la versión de 16 bits, por lo que solo necesita 2 (y puede probarlos si es necesario).

Alternativamente, hay expansores SPI que pueden llegar hasta 10 MHz. El MCP23009/18 puede hacer I2C a 3,4 MHz y SPI a 10 MHz, por lo que puede probar ambos para ver cuál le conviene más.

@butzke actualizado

Un enfoque común es usar una cadena de 74HC595 o chips de registro de desplazamiento de entrada en serie y salida en paralelo similares, y controlar la cadena usando la salida de reloj y los cables MOSI de un puerto SPI, así como una E/S "ordinaria". alfiler. El pin de salida de reloj SPI debe conectarse a la entrada de reloj de turno de cada registro de turno, y el pin de E/S normal debe conectarse a la entrada de reloj de registro de cada cambiador. Una palanca de cambios debe tener su entrada de datos conectada a MOSI; una segunda palanca de cambios debe tener su entrada de datos conectada a la salida de datos de la primera. Si hay una tercera palanca de cambios, su entrada de datos debe estar conectada a la salida de datos de la segunda, etc.

Usando este enfoque, tres pines del procesador pueden conectarse a cualquier número de chips de registro de desplazamiento que controlen colectivamente cualquier número de pines. Para configurar las salidas, envíe al puerto SPI los datos que se supone que deben ir en todos los cambiadores, enviando primero los datos para el cambiador que está más alejado del procesador. Una vez que se han enviado todos los datos, pulsar el pin del reloj de registro hacia arriba y luego hacia abajo hará que todas las salidas del registro de desplazamiento cambien simultáneamente. Se pueden cambiar tantas o tan pocas salidas como se desee en cada paso; el único factor que limita el número de salidas que se pueden controlar es la necesidad de volver a especificar el estado de cada salida cada vez que se desee cambiar cualquiera de ellas.

Si solo necesita que ciertos grupos de salidas puedan cambiar simultáneamente, puede ser útil tener varias cadenas de registro de desplazamiento independientes. Todas las cadenas pueden compartir la salida de reloj y los pines MOSI (utilizando una salida de reloj de registro por cadena) si uno se asegura de que una vez que el código comience a transferir datos a una cadena, todos los datos de esa cadena se enviarán y mostrarán antes del SPI. bus se utiliza para cualquier otra cosa. Si uno tiene 240 salidas que necesitan cambiar ocasionalmente y 16 que necesitan cambiar un poco más a menudo, dar a los chips que controlan 16 salidas que cambian con frecuencia su propio pin de reloj de registro significará que cambiar esos pines solo requerirá enviar dos bytes al SPI en lugar de 32.

¿Puedes publicar un ejemplo de diseño?

Como dice @passerby, I2C es el protocolo más fácil, una línea para datos y otra para reloj, puede hacerlo por software y creo que los requisitos de tiempo son mínimos y como solo usará el expansor como salidas no habrá cualquier problema... Creo que no hay mínimo para I2C...

Otra idea que pensé es usar pestillos con un decodificador para direccionar el bus, pero con ese máximo que puede lograr es 16 salidas.