Tratar con la comunicación bidireccional a través de 1 pin

3

Estoy escribiendo un controlador Verilog para un sensor de temperatura simple conectado a un FPGA. (La hoja de datos del sensor de temperatura está disponible aquí .) Las comunicaciones ocurren a través de un pin, el sda Pin, donde el esclavo o maestro envía un byte, que luego es "reconocido" por el otro al final del byte (entre los ciclos de reloj 9 y 1).

Me imagino que la mejor forma de modelar esto es hacer sda un inout wire , donde tanto la unidad maestra como la unidad secundaria sda usan una instrucción assign . No me queda claro cómo se pueden evitar las colisiones.

¿Qué sucede cuando el mismo inout wire es controlado tanto por la fuente como por el maestro? ¿Cuál es la mejor manera de modelar los ciclos de reconocimiento de envío en un pin en Verilog?

    
pregunta Randomblue

2 respuestas

5

En I2C, cuando es su turno de hablar, tanto el maestro como el esclavo manejarán la línea de datos baja para un 0 lógico o se convertirán en una entrada de alta impedancia para un 1 lógico.

Cuando se convierte en alta impedancia, esencialmente hace flotar la línea y permite que la resistencia de pull-up tire de la línea hacia arriba (lógica). Cuando se trata de una entrada de alta impedancia, puede detectar si la línea se está conduciendo a un nivel bajo; si intentó "escribir" un 1 lógico en este ciclo de reloj, entonces sabemos que ocurrió algún tipo de contención. Tenga en cuenta que este es el único caso que nos importa. Si se produce una contención pero no se modifica el flujo de bits resultante, en realidad nos ocupamos de nuestro negocio sin dar ningún error. Si se produce una contención, la parte que concede al bus es la que detectó un 0 lógico cuando intentaba poner un 1 lógico.

No sé Verilog, pero en VHDL, si estamos usando el tipo STD_LOGIC, podemos asignarlo como "inout" y, en un proceso, asignarle el valor 'Z' (alta impedancia) y luego muestra el pin para un alto o un bajo.

Si está escribiendo un maestro I2C, es su responsabilidad detectar si la línea I2C está en uso, específicamente, en busca de condiciones de inicio y parada para indicar el inicio y el final del uso por otro posible maestro.

NOTA: dice una interfaz de dos hilos en la hoja de datos, estoy bastante seguro de que esto significa I2C, por lo que lo anterior debería ser relevante.

    
respondido por el Jon L
2

Su sensor de temperatura no usa solo 1 cable para comunicarse, usa 2. El cable del reloj es igual de importante que el cable de datos para comunicarse correctamente.

El bus I2C es bastante complejo, especialmente si se implementan todas sus campanas y silbidos. Afortunadamente, la mayoría de los chips no implementan todas las capacidades, y es por eso que la documentación a nivel de la hoja de datos a menudo es inconsistente. Para obtener información completa y definitiva, puede obtener la especificación completa de NXP.

  

No me queda claro cómo se pueden evitar las colisiones.

Si el sensor de temperatura es el único otro dispositivo en el bus, su FPGA siempre será el maestro en el protocolo de comunicación. Eso significa que usted controla la señal del reloj y siempre sabrá si el esclavo tiene permiso para conducir el bus en un momento dado.

Por lo general, escribiría una máquina de estado en su FPGA que administra los datos dentro y fuera del dispositivo esclavo, y sabe cuándo enviarlos y cuándo recibirlos.

Tenga en cuenta que algunos dispositivos esclavos también ejercerán el control de la señal del reloj en ciertos momentos específicos de la transacción, como lo describe la norma. Harán esto para "estirar" los períodos bajos del reloj y se darán tiempo para completar una medición o cálculo antes de que el maestro comience a registrar los datos reales. Si su diseño maestro no tiene en cuenta esto, podría causar una "colisión".

  

¿Qué sucede cuando el mismo cable de entrada es accionado tanto por la fuente como por el maestro?

Dado que los dispositivos I2C solo pueden funcionar en baja, generalmente no dañará ninguno de los chips si hay un conflicto. Cuando desea enviar un '1' lógico, no maneja la línea a un nivel alto, lo pone en un estado alto-Z y deja que una resistencia externa lo levante. Si el esclavo maneja un '0' al mismo tiempo, no habrá ningún daño en ninguno de los dispositivos.

  

¿Cuál es la mejor manera de modelar los ciclos de reconocimiento de envío en un pin en Verilog?

Su Verilog no "modelará" un ciclo de reconocimiento de envío. Describirá la lógica que genera las señales correctas desde el dispositivo maestro.

Si desea simular el protocolo antes de comprometerse con el hardware, debe escribir un segundo módulo que tenga otra máquina de estados que responda a las señales del maestro y produzca las señales correctas para el dispositivo esclavo.

    
respondido por el The Photon

Lea otras preguntas en las etiquetas