Si un borde de reloj coincide con el borde de salida de datos, ¿qué debería leer SPI?

Tengo un convertidor de analógico a digital que lee y envía datos en flancos descendentes. También tengo dos MCU, FEZ Hydra y FEZ Cobra. Al usar el osciloscopio, noté que los datos que ingresan al ADC y los datos que salen del ADC son exactamente iguales, sin embargo, cuando leo los datos en la computadora que han almacenado las MCU, obtengo valores diferentes.

Dado que el ADC solo envía salidas en los flancos descendentes del reloj, cada vez que los bits de salida de datos cambian de 0 a 1, Hydra lee un 1 mientras que Cobra todavía lee un 0; y cada vez que los bits de salida de datos cambian de 1 a 0, Hydra lee un 0 y Cobra todavía lee un 1. Parece que Cobra no da suficiente tiempo entre el borde negativo del reloj y la lectura de la entrada para permitir para que suceda la actualización.

Estoy usando la biblioteca spi de microsoft. Mi pregunta es: ¿hay alguna forma de retrasar la función de lectura SPI? ¿Cuál es el resultado razonable en esta situación que se supone para mí?

Nota: Hay un retraso de 60 ns en el tiempo de acceso a datos en el ADC.

ingrese la descripción de la imagen aquí

Respuestas (2)

Los periféricos SPI tienen la capacidad de seleccionar la polaridad y la fase del reloj con respecto a los datos, por lo que debe asegurarse de que los datos se lean en el borde correcto. Parece como si los dos uC tuvieran una fase diferente. La página SPI Wiki (y cualquier otro tutorial SPI medio decente) tiene detalles:

SPI

No estoy seguro de cómo configura las cosas con su hardware, pero las configuraciones relevantes no deberían ser demasiado difíciles de encontrar.

El ADC lee Y envía datos en cada flanco descendente. ¿Cómo puedo usar cualquiera de estos esquemas ya que los datos se capturan y propagan en el mismo borde? Actualmente utilizo un estado inactivo de reloj alto CPOL = 1 y mi diagrama de tiempo coincide con la línea roja de CPHA 1 aunque la línea roja pertenece a CPHA 0.
@ user1084113 Puede que esté siendo estúpido, pero ¿por qué no agregar un inversor a la señal del reloj que va al ADC? La cobra y la hidra aún se leerán de manera diferente (ahora al revés), pero sin entrar en los entresijos de la cobra y la hidra para averiguar por qué uno u otro lee los datos en el borde "opuesto", es posible que no tenga otra opción.

Estoy de acuerdo con la respuesta anterior. Los periféricos SPI generalmente tienen dos bits en algún lugar de los registros de control. Estos se llaman fase de reloj (como ya se mencionó) y polaridad de reloj . La fase del reloj determina si los datos se muestrean en el flanco ascendente o descendente de SCK. La polaridad del reloj solo determina el estado de SCK entre transferencias de bytes (a algunos dispositivos no les importa esta opción).

Según su explicación, no estoy muy seguro de si configura O muestra sus datos en el borde descendente o ascendente . Al ver que ha dibujado una imagen con líneas en los bordes descendentes de la señal, supongo que desea que sus dispositivos muestreen (lean) el valor en ese mismo borde. Eso es bastante poco convencional. Además, está en contradicción con tu imagen.

El autobús funciona así.

  • configurar el valor en un borde de SCK
  • muestralo en el otro

Por lo general, la configuración se realiza al caer y la muestra al subir.


Al final, es muy probable que arreglar la polaridad y/o la fase del reloj resuelva el problema.

Por lo general, la configuración se realiza al caer y la muestra al subir, este es el problema que este ADC configura al caer y también envía datos en el borde descendente