arkarash:
Puedo pedirle la información por serie al ESP todo el rato, pero me parece que la velocidad y el riesgo de perder información es más grande que si puedo cogerla directamente de la EEPROM con el Mega.
En ese caso sería implementar mecanismos de detección de errores: bit de paridad (ya implementado en los UART por hardware), suma de verificación, hashing, especificando la longitud de la carga útil, etc.
arkarash:
Supongo que el riesgo de colisión es menor ya que normalmente se usa mucho menos una EEPROM que un display
Cuando hay múltiples "maestros" utilizando el mismo bus, el riesgo de colisión siempre está presente. No recuerdo si I2C ya implementaba algún mecanismo de prevención, porque de lo contrario es necesario crear uno.
De momento solo se me ocurre que el "maestro" que deseé utilizar el bus, debe primero medir el estado digital de ambas líneas durante un lapso prudente (al menos el doble de la supuesta duración de un ciclo de reloj); si durante todo ese tiempo las líneas se mantuvieron en estado alto, se puede asumir que el bus está libre.
El único desacierto que le encuentro a esta técnica, es cuando las frecuencias de reloj utlilizadas por los distintos "maestros" (o la maxíma entre los "esclavos") no es la misma. Si un ciclo tardase más que el tiempo de espera estimado, la asunción eventualmente sería incorrecta y una colisión ocurriría.
arkarash:
pero aún así mi idea es que el ESP habilite una entrada del Mega cuando escribe o lee y a la inversa para "solicitar permiso".
En caso de ser señalamiento por una línea digital, los pines de ambas partes deben ser capaces de cambiar dinámicamente su impedancia (entrada o salida). Quien haga uso del bus I2C, debe ser la salida y poner dicha línea en el estado que se defina como "ocupado"; mientras que quien espera a que el bus sea liberado, debe ser la entrada.
Siguiendo estas reglas, eso quiere decir que cuando el bus incialmente está libre, ambas partes son entradas que verifican el estado de esa señal para ya sea utilizarlo inmediantamente, o esperar a que libere.
El desacierto de esta técnica es un problema típico de la concurrencia: ¿qué pasa si ambos "maestros" leen el estado de la señal exactamente al mismo tiempo (problema de atomicidad)? Ambos leerían que está libre y por ende se garantiza que habrá una colisión.
No hay que ahogarse en un vaso de agua, la solución es más simple de lo que crees: desfasar intencionalmente ambos eventos. Esto se puede lograr con un pequeño retraso antes de la lectura, aunque sí debe ser de duración aleatoria.
arkarash:
La pregunta es para los que estuvieron haciendo pruebas con el display o para los que se quieran sumar ¿Creeis que es viable?
Eso depende de cómo quieras resolver el problema: con detección de errores en la parte serial; o con arbitraje de bus en el I2C.