FPGA funciona como puente I2C dentro, fuera de problema [cerrado]

1

Me gustaría usar señales I2C en el FPGA desde el módulo cypress 2.0 con pines i2c como se muestra a continuación. Pero no funciona bien. ingrese la descripción de la imagen aquí

XilinxFPGA<-------------------->MóduloMCU(I2c)

.UCFNETin_sclLOC="A1";
NET in_sda LOC = "A2";

NET out_scl LOC = "C1";
NET out_sda LOC = "C2";

y en verilog como se muestra a continuación, estoy implementado.

module top();

inout wire in_sda;
inout wire in_scl;

inout wire out_sda;
inout wire out_scl;


assign out_sda = in_sda;
assign out_scl = in_scl;



endmodule

¿Puedes ayudarme en lo que me estoy perdiendo?

    
pregunta JoJI

2 respuestas

6

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.

    
respondido por el Neil_UK
0

I2C usa salidas de colector / drenaje abierto. Por esta razón, no puede utilizar una salida FPGA típica con una estructura de inserción / extracción.

No sé si el FPGA que está utilizando ofrece salidas de drenaje abierto.

De todos modos, debería ser posible imitarlos usando la siguiente estructura (tomado de aquí ): que se puede inferir usando este código:

always @(ENABLE)
if (ENABLE)
DOUT = 1'bZ;
else
DOUT = 1'b0;

Por supuesto, esta solución solo funciona en una dirección, pero supongo que es consciente de ello.

    
respondido por el Mario

Lea otras preguntas en las etiquetas