Multiplexar un bus I2C entre dos maestros en un FPGA Xilinx

5

Tengo un solo bus I2C externo (pines SDA y SCL). Esto actualmente está controlado por un núcleo IP de terceros que proporcionó puertos de entrada "implícitos" en el MPD, específicamente:

PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE

Me he encontrado con una situación en la que quiero poder hablar con un dispositivo en ese bus independientemente del núcleo de IP (en un momento en que el propio IP se puede restablecer para que sepa que no puede interferir) . He intentado crear un axi_iic master por separado y conectarlo a los mismos puertos externos, pero esto no funciona porque se molesta por los múltiples controladores de salida conectados.

Así que creo que necesito un multiplexor I2C simple como lógica de cola entre los dos maestros, y creo que sé cómo hacerlo en términos de _I interno, _O , _T señales de cada maestro, pero no estoy seguro de cómo "extraer" esas señales internas para el núcleo existente dado el MPD anterior ( están presentes en el VHDL subyacente).

Por el momento, acabo de modificar manualmente el archivo MPD para exponer estas señales, pero me preguntaba si hay una mejor manera de hacerlo (ya sea llegar a las señales sin cambiar el archivo MPD o hacer todo el I2C multi -la cosa del maestro); Si bien la edición manual es viable, los cambios en el archivo MPD pueden perderse cuando se actualiza el núcleo, por lo que es propenso a errores.

Otra solución que he considerado (pero no estoy seguro de si me gusta, aunque todavía es posible porque el pinout del FPGA aún no es definitivo) es enrutar el bus externo (así que el SDA externo va a dos pines FPGA separados, uno para el núcleo de terceros y otro para el nuevo núcleo). Sin embargo, esto parece bastante feo y derrochador, pero entonces no soy un experto. :)

    
pregunta Miral

2 respuestas

1

Solo para completar (ya que recientemente se me recordó sobre esta pregunta), volveré a expresar la respuesta en la que finalmente me decidí:

Dado el siguiente fragmento de MPD proporcionado por el proveedor principal:

PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE

Lo sustituyo por el siguiente:

PORT IIC_DATA_I = "", DIR = I
PORT IIC_DATA_O = "", DIR = O
PORT IIC_DATA_T = "", DIR = O
PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE, TRI_I = IIC_DATA_I, TRI_O = IIC_DATA_O, TRI_T = IIC_DATA_T
PORT IIC_CLOCK_O = "", DIR = O
PORT IIC_CLOCK_T = "", DIR = O
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE, TRI_O = IIC_CLOCK_O, TRI_T = IIC_CLOCK_T

Esto funciona bien (como las señales subyacentes se definieron en el VHDL de todos modos). Es un poco complicado ya que tengo que acordarme de hacer esto cada vez que obtengo un núcleo actualizado del proveedor, pero esto no es lo suficientemente frecuente. (He estado tratando de persuadir al vendedor para que lo agregue ellos mismos, pero hasta ahora no he tenido mucha suerte).

    
respondido por el Miral
-2

Si no puede resolver el problema internamente en el FPGA, use las puertas de transmisión externamente para conectar dos maestros a un bus externo.

    
respondido por el placeholder

Lea otras preguntas en las etiquetas