¿Comunicación entre dos microcontroladores usando SPI, I2C y algún tipo de búfer?

Tengo dos microcontroladores que están bastante maximizados en sus capacidades. MC1 necesita hacer que un resultado de medición de 14 bits esté disponible para MC2. MC1 puede comunicarse con SPI y MC2 puede comunicarse con I2c, pero funcionan de forma asíncrona.

¿Hay algún tipo de IC simple disponible de modo que MC1 pueda guardar un valor en el IC usando SPI, y luego MC2 pueda leer ese valor usando I2c, en el tiempo libre de cada uno?

La RAM de doble puerto a menudo se ve como una solución para el intercambio de bajo nivel, si el tipo de cambio no es muy frecuente, la FRAM i2c de doble puerto (EEPROM) podría incluso darle a su interfaz
Vea CAT24C208 de ON como un ejemplo de eeprom serial i2c de doble puerto, ¿funcionaría algo así? Si es así, puedo escribir como respuesta.
El puerto dual también se puede hacer con otra MCU como sugiere @MarcusMüller en su respuesta, consulte, por ejemplo, esta placa de desarrollo: ti.com/tool/TIDA-00230
Parece como hacerlo de la manera difícil. Qué recursos quedan en cada uno. ¿Y qué tasa de bits necesitas?
Bueno, hay MCU ultra baratas que pueden hacer el puente/almacenamiento en búfer. Me viene a la mente el MSP430 más pequeño, ya que hay una nota de aplicación exactamente para eso, pero probablemente un TinyAVR o algún M0 podría hacer el trabajo.
¿Por qué I2C o SPI son las únicas dos opciones? ¿Sería UART una opción, incluso un UART de software bit-bang?

Respuestas (4)

Estoy de acuerdo con @Voltage Spike, probablemente, actualizar cualquiera de los MCU es la solución más fácil.

Sin embargo, si realmente se trata solo de ordenar la entrada y salida de datos, bueno, ese sería un trabajo para otra MCU. Puedo entender que vaciles en traer aún más software a una placa. Pero, sinceramente, configurar el periférico SPI en ese tercer MCU a DMA en un búfer grande y un controlador I²C para brindar los datos más recientes a pedido a MC2 sin duda parecería lo más fácil.

Tenga en cuenta que creo que esto en realidad justifica que la tercera MCU se haga cargo del trabajo de MC1: si el volumen de datos es lo suficientemente bajo como para que se pueda consultar a través de I²C, entonces no estaría presionando un Cortex-M0 + algo moderno a la interfaz con cualquier ADC que tenga, o hacerse cargo de una parte significativa del cálculo de ese valor de 14 bits.

Sería mucho más fácil encontrar una MCU en un paquete diferente con mejores capacidades y actualizar una MCU existente que agregar algo intermedio.

Otra cosa que puede considerar es buscar periféricos SPI o I2C de hardware si no los está utilizando actualmente (casi todas las MCU modernas tienen algo como esto). Un SPI de hardware recibe información, luego la almacena en la memoria sin sondear el SPI y luego alterna una interrupción para que pueda recuperar la información. Lo mismo ocurre con el hardware I2C.

Si eso no se ajusta a sus necesidades, supongo que se podría usar un FPGA (como en la parte de celosía) para la interfaz que describe, pero mucho más difícil y lento de implementar.

Hay puentes I2C/SPI con búferes integrados, como el SC18IS602B, que podrían ser adecuados para este propósito.

¿Puede implementar un maestro I2C en software en MC1? Solo necesitarías 2 GPIO. Por supuesto, tomaría algo de tiempo, pero si su transmisión es lo suficientemente corta y rara, podría ser factible.

Dado que I2C es síncrono y está implementando el lado maestro, no tiene requisitos de tiempo estrictos. Puede continuar con su ciclo de programa principal después de configurar cada bit. En este caso, los requisitos de tiempo de ejecución serían mínimos, solo una sola instrucción de almacenamiento para cada bit y una instrucción de bifurcación. Alternativamente, puede configurar una interrupción de temporizador para que se dispare a, por ejemplo, una frecuencia de 100 kHz y transmita cada bit en la interrupción. En este caso, tendría más gastos generales porque tiene que entrar y salir de la interrupción.

Si también lo implementa en el software en MC2 (por ejemplo, con una interrupción GPIO para la entrada de la línea de reloj), ni siquiera tiene que ser I2C con su sobrecarga para la condición de inicio, la dirección, etc. Simplemente podría transmitir los 14 bits en serie, sincrónicamente. Si tiene más de 2 GPIO disponibles, incluso podría transmitir varios bits en paralelo.