En la comunicación I2C, se utilizan controladores de colector abierto. El protocolo depende de que el nivel de la línea sea el "cable-O" de todos los controladores.
Esto significa que, en una interfaz local, un pin puede estar bajo porque se está bajando por un controlador remoto, o se está bajando por sí solo.
Obviamente, cualquier búfer que se encuentre entre esta interfaz y los remotos debe poder distinguir por qué la línea es baja. Si está bajo porque un control remoto lo está bajando, entonces también debe bajar para transmitir eso. Si es bajo porque el controlador local lo está agotando, no debe hacerlo, de lo contrario la línea se atascaría y nada más pasaría.
Los vendedores de aisladores ópticos diseñados para I2C utilizan diversas estrategias. Su salida baja a un nivel diferente al de la interfaz local típica, y los sensores de voltaje pueden distinguir qué impulsor está bajando. Pero todo es bastante inestable y depende de que el controlador local tenga un buen rendimiento "típico".
Como un bus I2C está diseñado para conectarse al bus, la mejor manera de conectar el FPGA al bus es implementar una entrada y un controlador O / C para cada uno de los dos pines. , y conectar a los dos cables del bus I2C. Esto conserva la conexión directa de todos los elementos que ya están en el bus. La programación mínima para que el FPGA no interrumpa el tráfico del bus es no conducir las salidas de o / c. Para participar en el tráfico de bus se requerirá una pila de protocolos I2C en el FPGA.
Una forma robusta de romper el camino a través del FPGA es implementar dos pilas I2C en el FPGA, una en cada sentido, para retransmitir mensajes. Si bien esto puede parecer una opción bastante pesada, las interfaces I2C están disponibles como IP preescritas para los FPGA, y eliminan la descamación de tratar de implementar un paso directo.