Zynq - Configurando el reloj SPI a ralentí alto

0

Estoy tratando de usar el componente SPI0 de un Zynq XC7Z010 para leer datos de un codificador rotatorio de 12 bits que usa un protocolo SSI.

  • Tengo un pequeño proyecto de ejemplo configurado en Vivado que permite que SPI0 use los puertos EMIO y establece los pines que quiero usar.
  • También tengo el controlador xspips funcionando y puedo recibir datos del codificador.
  • El problema al que me estoy enfrentando es que solo pude configurar una señal de reloj que está inactiva, mientras que el codificador espera un reloj alto inactivo.

    • Debido a esto, los primeros bits recibidos son inutilizables, y tuve que hacer un poco de manipulación de bits para recuperar estos bits (el codificador vuelve a repetir los mismos datos después de la transmisión de 12 bits).

Con un osciloscopio probé que la señal de reloj enviada siempre está inactiva, ya sea que la opción CLK_ACTIVE_LOW esté configurada o no para el SPI, por lo que llegué a la conclusión de que esa es solo la forma en que el Zynq interpreta la señal del reloj.

¿Cómo puedo tener una señal de reloj que sea alta de forma predeterminada? ¿Tengo que invertirlo manualmente en el envoltorio VHDL generado por Vivado o hay una solución más simple?

Señal de reloj medida para una transferencia de 2 bytes cuando ACTIVE_LOW está habilitado: ycuandoestádeshabilitado:

    
pregunta Tusike

4 respuestas

0

La primera traza de su osciloscopio (ACTIVE_LOW habilitado) parece mostrar que el reloj va alto-Z cuando está inactivo. Tenga en cuenta la lenta decadencia. Intente agregar una resistencia pull-up bastante semanal a la línea del reloj, tal vez 10K, y creo que obtendrá lo que quiere.

    
respondido por el DoxyLover
0

Si ha perdido bits debido a que su fuente de reloj está activa-alta cuando necesita una fuente de reloj activa-baja, la respuesta lógica parece ser agregar un inversor en línea entre su fuente de reloj y amp; el dispositivo temporizado que necesita la forma de onda de temporización inversa.

Intente usar algo como esto . Debería funcionar para una corrección inmediata;)

    
respondido por el Robherc KV5ROB
0

También tuve algunos problemas con el periférico Zynq SPI y, como DoxyLover señaló, tiene que ver con que la línea del reloj esté configurada en Alta-Z en Linux cuando los datos no se están transfiriendo. Resolví esto sacando los pines triples de la línea del reloj y alimentándolos manualmente en una IOBUF en mi HDL, donde, en lugar de usar la línea triestada ZYNQ SPI, la até a un nivel bajo para que el reloj siempre sea una salida (activo).

    
respondido por el ks0ze
0

Creo que la respuesta de los tres estados es clave aquí. El envío de SPI a EMIO expone muchas señales, la mayoría de las cuales no son necesarias en una aplicación determinada. Esto incluye señales de estado para casi todo. Esto es por dos razones. Primero, el SPI se puede configurar como maestro o esclavo. En segundo lugar, se puede configurar para trabajar con múltiples maestros. Ambos requieren la IP para tri-indicar algunas señales cuando no están en uso.

Para evitar que el reloj se repita, simplemente expanda las señales y no use las líneas de control de tres estados.

    
respondido por el Wilton Helm

Lea otras preguntas en las etiquetas