Tengo un solo bus I2C externo (pines SDA y SCL). Actualmente, esto está controlado por un núcleo de IP de terceros que proporcionó puertos de entrada y salida "implícitos" en el MPD, específicamente:
PORT IIC_DATA = "", DIR = IO, THREE_STATE=TRUE
PORT IIC_CLOCK = "", DIR = O, THREE_STATE=TRUE
Encontré 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 núcleo de IP en sí se puede restablecer para saber que no puede interferir). Intenté crear un axi_iic
maestro separado y conectarlo a los mismos puertos externos, pero esto no funciona porque se enfada con los múltiples controladores de salida conectados entre sí.
Entonces, creo que necesito un multiplexor I2C simple como lógica de unión entre los dos maestros, y creo que sé cómo hacerlo en términos de las señales internas _I
de cada maestro _O
, _T
pero no estoy seguro de cómo "extraer" esos 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 (obteniendo las señales sin cambiar el archivo MPD, o haciendo todo el asunto multimaestro I2C). ); Si bien la edición manual es factible, 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 si me gusta, aunque todavía es posible ya que el pinout de FPGA aún no es definitivo) es enrutar dos veces el bus externo (para que el SDA externo vaya a dos FPGA separados). pines, uno para el núcleo de terceros y otro para el nuevo núcleo). Sin embargo, esto parece bastante feo y derrochador, pero no soy un experto. :)
Solo en aras de la exhaustividad (ya que recientemente me recordaron esta pregunta), repetiré la respuesta que finalmente 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 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 se definieron en el VHDL de todos modos). Es un poco complicado ya que tengo que recordar hacer esto cada vez que obtengo un núcleo actualizado del proveedor, pero esto es lo suficientemente infrecuente como para no ser un gran problema. (He estado tratando de persuadir al proveedor para que lo agregue, pero hasta ahora no he tenido mucha suerte).
Si no puede resolver el problema internamente en el FPGA, use puertas de transmisión externamente para enviar dos maestros a un bus externo.
marcador de posición
Miral
Miral
marcador de posición
Wouter van Ooijen
Miral