5 votos

Multiplexación de un bus I2C entre dos maestros en una FPGA Xilinx

Tengo un único bus I2C externo (pines SDA y SCL). Esto es actualmente 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 ser capaz de hablar con un dispositivo en ese bus independientemente del núcleo IP (en un momento en el que el propio núcleo IP puede mantenerse en reset para saber que no puede interferir). He tratado de crear un axi_iic maestro y conectarlo a los mismos puertos externos, pero esto no funciona ya que se molesta por los múltiples controladores de salida conectados juntos.

Así que creo que necesito un simple multiplexor I2C como lógica de cola entre los dos maestros, y creo que sé cómo hacerlo en términos de la interna _I , _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 (ellos son presente en el VHDL subyacente).

Por el momento sólo he modificado manualmente el archivo MPD para exponer estas señales, pero me preguntaba si hay una mejor manera de hacer esto (ya sea llegar a las señales sin cambiar el archivo MPD, o hacer toda la cosa I2C multi-master); mientras que la edición manual es viable, los cambios en el archivo MPD puede perderse cuando el núcleo se actualiza, por lo que es propenso a errores.

Otra solución que he considerado (pero no estoy seguro de que me guste, aunque todavía es posible ya que el pinout de la FPGA no es definitivo todavía) es hacer un doble enrutamiento del bus externo (de modo que el SDA externo va a dos pines separados de la FPGA, uno para el núcleo de terceros y otro para el nuevo núcleo). Esto parece bastante feo y derrochador, pero no soy un experto :)

1voto

xan Puntos 5035

En aras de la exhaustividad (ya que recientemente me han recordado esta cuestión), volveré a exponer la respuesta a la que finalmente me decidí:

Dado el siguiente fragmento de MPD proporcionado por el proveedor del núcleo:

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

Lo sustituyo por lo 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 (ya que las señales subyacentes fueron definidas en el VHDL de todos modos). Es un poco molesto ya que tengo que recordar hacer esto cada vez que recibo un núcleo actualizado del proveedor, pero esto es lo suficientemente infrecuente como para no ser un gran problema. (He intentado persuadir al proveedor para que lo añada él mismo, pero no he tenido mucha suerte hasta ahora).

-2voto

user13107 Puntos 313

Si no puedes resolver el problema internamente en la FPGA, utiliza puertas de transmisión externas para conectar dos maestros a un bus externo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X