Aumentar salidas GPIO

3

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 manera confiable

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

Puedo usar la comunicación I2C para expandir mis pines de E / S, pero no estoy seguro de tener problemas con la sincronización y los paquetes de datos.

Una posibilidad es usar multiplexación.

Estoy usando un AM3359 ARM Cortex-A8 a 25Mhz

¿Alguna otra idea?

    
pregunta Butzke

3 respuestas

4

I2C funciona a 100kHz, 400kHz, 1MHz y 3.4MHz estándar. Muchos expansores i2c pueden hacer lo que necesite, tanto de entrada como de salida. Y tiene bits de acuse de recibo, por lo que sabe (un poco) si un expansor recibió el paquete de datos.

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

Actualización: Ya que ha mencionado 1MHz y un mcu de 25MHz, el Microchip MCP23009 3.4MHz 8bit I2C Expander 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 10MHz. El MCP23009 / 18 puede hacer tanto I2C a 3.4MHz como SPI a 10MHz, por lo que puede probar ambos para ver cuál se adapta mejor a sus necesidades.

    
respondido por el Passerby
6

Un enfoque común es usar una cadena de chips de registro de desplazamiento de salida en paralelo o de salida en paralelo de 74HC595, y conducir la cadena usando los cables de salida de reloj y MOSI de un puerto SPI, así como uno "común" Pin de E / S. El pin de salida de reloj SPI debe conectarse a la entrada de cambio de reloj de cada registro de desplazamiento, y el pin de E / S ordinario debe conectarse a la entrada de registro de reloj de cada desplazador. Un desplazador debe tener su entrada de datos conectada a MOSI; un segundo desplazador debe tener su entrada de datos conectada a la salida de datos del primero. Si hay un tercer desplazador, su entrada de datos debe estar conectada a la salida de datos desde el segundo, etc.

Usando este enfoque, tres pines del procesador pueden conectarse a cualquier número de chips de registro de desplazamiento que controlan colectivamente cualquier cantidad de pines. Para configurar las salidas, envíe al puerto SPI los datos que se supone que deben ir en todos los desplazadores, enviando los datos para el desplazador que está más lejos lejos del procesador. Una vez que se han enviado todos los datos, pulsar el pin de registro del reloj alto y luego bajo hará que todas las salidas del registro de cambios cambien simultáneamente. Uno puede cambiar tantas o tan pocas salidas como se desee en cada paso; El único factor que limita el número de salidas que uno puede controlar es la necesidad de volver a especificar el estado de cada salida en cualquier momento que desee cambiar cualquiera de ellas.

Si solo necesita ciertos grupos de salidas para poder cambiar simultáneamente, puede ser útil tener múltiples cadenas de registro de desplazamiento independientes. Todas las cadenas pueden compartir los pines de salida de reloj y MOSI (usando una salida de registro de reloj por cadena) si uno asegura que una vez que el código comience a cambiar los datos a una cadena, todos los datos de esa cadena se enviarán y se enviarán de forma intermitente antes del SPI. El autobús 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 registro de reloj significará que cambiar esos pines solo requerirá enviar dos bytes desde el SPI en lugar de 32.

    
respondido por el supercat
2

Como dice @passerby, I2C es el protocolo más sencillo, 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 salida allí, ganará No hay ningún problema ... Creo que no hay mínimo para I2C ...

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

    
respondido por el paido

Lea otras preguntas en las etiquetas