SPI internals _ falta el reloj MISO durante la operación de lectura

0

Actualmente estoy escribiendo código C ++ para utilizar el protocolo SPI. Estoy usando la biblioteca popular como una guía. Me encontré con pocas áreas cuestionables y después de una discusión en el foro del tablero de la biblioteca me dijeron "es un problema interno" (del hardware). Para ser específico: utilizando el "puerto" MOSI, puedo "escribir" en el hardware y monitorear el resultado a través del software. Ninguno de los puertos MOSI o CLK están conectados a ningún dispositivo esclavo SPI. No tengo problemas allí. Cuando "leo" el puerto MISO, nuevamente no estoy conectado al dispositivo esclavo, no espero datos válidos, no hay una señal MISO real. Eso está bien.

Sin embargo

¡El maestro NO envía CLK en absoluto! El dispositivo maestro / dispositivo vacía el / los búfer (es) que se llenan DURANTE los ciclos de "escritura" DURANTE la "lectura" de la operación del esclavo.

Mi pregunta general real que me gustaría que me respondieran es

¿El SPI maestro requiere una conexión física con el esclavo para enviar CLK al esclavo durante las operaciones de lectura del esclavo?

Según la documentación de SPI: el maestro envía CLK durante la "escritura" al esclavo y envía CLK durante la "lectura" desde la salve. Master SPI es la fuente de CLK. Solo la parte de "escritura" de SPI funciona como se espera.

    
pregunta July Jim

4 respuestas

0

Su referencia a la documentación de SPI ya proporciona una respuesta. Sí, la línea SCLK es esencial para la comunicación, tanto hacia como desde el dispositivo esclavo.

Le recomiendo encarecidamente que vuelva a leer esa documentación, parece que no entendió cómo funciona SPI. Para empezar, no puede referirse a MOSI / MISO / SCLK individuales como "puertos". Son líneas de comunicación que juntas forman el bus SPI, conectadas al puerto SPI. Aunque en algunos casos se puede excluir MISO, y SC puede estar conectado de manera permanente, necesita al menos MOSI y SCLK para enviar comandos al esclavo.

    
respondido por el Maple
0

En SPI hay un maestro y un esclavo, varios esclavos pueden conectarse a un maestro. El maestro suministra el reloj, la línea CS selecciona qué esclavo (o si hay un esclavo lo activa para la comunicación). La línea SCK es manejada solo por el maestro.

Lo primero que debe hacer en SPI es establecer la comunicación y una de las mejores maneras de hacerlo es leer un registro desde un dispositivo spi (si tiene uno, algunos pueden escribir solo como un DAC). Si no puede leer o escribir, verifique el tiempo en las hojas de datos. Lo segundo que debe hacer es obtener un analizador lógico y verificar las señales reales (de lo contrario, no se sabrá si está ordenando algo), también debe verificar los voltajes y asegurarse de que sean apropiados. Verifique también el poder de ambos circuitos integrados.

    
respondido por el laptop2d
0

Esto es lo que tiene SPI: en lo que respecta al hardware, no hay diferencia entre lectura y escritura. Para cada ciclo de reloj, un bit se transfiere del maestro al esclavo en MOSI y también se transfiere un bit del esclavo al maestro en MISO. Depende del software / firmware maestro y esclavo determinar qué bit (o ambos) es significativo.

No puedo hablar con su hardware y biblioteca maestras específicos, pero la mayoría de los módulos SPI en el microcontrolador requieren escribir bytes para poder completar el ciclo de la línea del reloj. Leer datos del esclavo es un efecto secundario de la escritura.

Por ejemplo, para escribir un byte en el esclavo seguido de la lectura de un byte, debe alimentar dos bytes al transmisor, un byte de datos seguido de un byte ficticio. Al mismo tiempo, debe sondear (o utilizar interrupciones) los datos del receptor y leer dos bytes, un dummy que se descartará seguido del byte de datos.

Nuevamente, no sé cómo funciona su biblioteca, pero puede requerir hacer una llamada de escritura para que haya suficiente byte para leer y escribir, y luego hacer una llamada de lectura para la misma cantidad de bytes. Tendría que escribir los bytes de salida seguidos por suficientes bytes ficticios para los datos de lectura. Mirando los datos recibidos, deberías descartar los bytes correspondientes a los datos transmitidos para obtener los datos de recepción reales.

    
respondido por el DoxyLover
0

No hay diferencia entre una lectura y una escritura, vienen en pares.
Ambos casos requieren que el registro de desplazamiento se registre y se registre.

La única diferencia es si un dispositivo es maestro o esclavo, lo que determina de dónde proviene el SCLK y si CS (selección de chip) es funcional.

Podrías incluir MOSI en MISO y tener un modo de prueba de bucle invertido.

    
respondido por el Jeroen3

Lea otras preguntas en las etiquetas