Microcontroladores: desconecte las líneas I2C y serie después de cargar desde EEPROM

1

Estoy usando un microcontrolador P8X32A (Parallax "Propeller") en muchos de mis proyectos de hobby. No tiene NV RAM interna en el chip, por lo que carga su código de programa desde los pines TX / RX del puerto serie o desde una EEPROM I2C (24LC256) en los pines SDA / SCL. Esta carga es totalmente manejada por el silicio en el micro y no puede ser alterada.

No toma más de aproximadamente 2 segundos para que se complete el proceso de carga de código, ¡luego de lo cual esos cuatro pines se convierten en IO de propósito general en los 4 MSB de un puerto GPIO de 32 bits! Esa es una gran característica, pero significa que debo tratar esos 4 pines como un caso especial, lo cual no es ideal.

  • Del P8X32A Manual v1.2 (página 17). La línea roja irregular indica las 4 señales que deseo redireccionar después de que se haya completado el arranque.

Paraunproyectofuturo,estoyplaneando.Megustaríausarlos32pinesdeestepuertoGPIOparaE/Sdealtavelocidad,peronoquierotenerlos4pinessuperioresconectadosalpuertoserieoalbusI2C.

Mipregunta:

¿CuálseríaunmétododeconteoparcialsólidoysólidoparacortarautomáticamentelaslíneasdepuertoserieyI2CdelmicrocontroladoruntiempofijodespuésdesalirdelestadoRESET?

Alprincipiopuedopensarenalgunasmaneras,perotienendesventajas...

  1. TengaunICdeinterruptordigitalde4polosy2poloscontroladoporI2Cquecompartaunalíneadereinicioconelmicrocontrolador.Alinicio,las4señalesestánconectadasdemanerapredeterminadaalbusI2Cylaserie,yluegoloprimeroquehaceelcódigodelprogramaesenviaruncomandoI2CaeseinterruptorparaquesalgadelbusI2C.

  2. Useunaseñalgeneradaexternamente(básicamenteuntemporizadortontoounmicrocontroladorsecundariobaratoquepuedaresponderalimpulsoderestablecimiento)paraalternaruninterruptor"normal" de nivel lógico activado.

  3. Coloque un segundo microcontrolador pequeño (por ejemplo, ATTiny2313 o similar) entre la hélice y la EEPROM, luego haga que cuente la cantidad de bytes que la atraviesan y luego la apague. poseer IO completamente hasta el pulso de restablecimiento.

No me gusta (1) porque necesitaría implementar la pequeña parte de I2C en mi código de programa, lo cual es molesto pero factible, pero el problema principal es encontrar un conmutador I2C adecuado en un paquete SOIC / SOP .

No me gusta (2) porque agrega cierto potencial para que surjan problemas de glitchiness o de sincronización. O si voy con un segundo microcontrolador (ATTiny5 por ejemplo) tendría que tener un encabezado de programación en el Tablero o tener las fichas preprogramadas fuera de tablero. Una molestia de cualquier manera.

No me gusta (3) porque es mucho trabajo y agrega un segundo conjunto de firmware bastante complicado al proyecto, que prefiero evitar.

Sospecho que estoy pensando demasiado en esto, ¿hay una mejor manera de desconectar completamente un bus I2C después de que termine de usarlo?

El "IO de alta velocidad" con el que quiero que participen los 32 pines GPIO será una lógica digital 3v3 que se ejecutará en cualquier lugar entre 1MHz y 40MHz.

    
pregunta Wossname

1 respuesta

2

Aquí está mi sugerencia (espero que tenga sentido):

Tenemos un multiplexor quad 2-a-1 para alternar las señales, como usted sugirió. Se utiliza un pestillo RS para decidir el enrutamiento de los multiplexores. En el reinicio de la MCU , la salida de retención encamina las señales al destino de "inicio" (conector / EEPROM). Ahora, el truco sería usar un quinto puerto de la MCU para cambiar del estado de inicio al estado normal, tan pronto como se inicie el programa.

simular este circuito : esquema creado usando CircuitLab

Por supuesto, dirá: "pero entonces uno de mis puertos está dedicado a esta tarea, ¡así que no puedo usarlo más! Quiero poder usar todos my ports! " (sí, dirás eso, incluso puedo escucharte desde donde estoy).

Bueno, la cosa es que, una vez que estás en el estado normal, esta señal ya no tiene efecto en el pestillo (hasta que se reinicia, por supuesto). Así que puedes usarlo para cualquier otra cosa en este punto. El único inconveniente es que esta señal se cambiará de alta a baja al inicio (puede volver a cambiarla a alta). Estoy seguro de que puede encontrar una señal en su aplicación que pueda tolerar este comportamiento (una salida de LED, o algo que no sea crítico).

    
respondido por el dim

Lea otras preguntas en las etiquetas