¿El protocolo SPI especifica cuántos pulsos de reloj debe enviar un dispositivo maestro al esclavo?

Estoy tratando de implementar un dispositivo SPI en Verilog. Tengo muchos problemas para coordinar el maestro y el esclavo, ya que a veces (con mi impl. actual) el dispositivo maestro SPI no envía suficientes pulsos de reloj al esclavo para que pueda terminar su procesamiento.

Por ejemplo, esto puede ocurrir si el esclavo se implementa para que su máquina de estado tenga más estados y deja de recibir pulsos de reloj antes de que termine de completar su ciclo.

Podría modificar mi implementación para hacer que estos dos dispositivos estén coordinados en términos de pulsos de reloj, sin embargo, esto significa que el implementador maestro necesita conocer la impl. detalles del esclavo (y todos los esclavos potenciales). Esto no me parece correcto en absoluto.

¿El protocolo SPI especifica exactamente cuántos pulsos debe proporcionar el maestro al esclavo cuando envía, por ejemplo, un byte? Si no, ¿cómo es que cualquier dispositivo maestro SPI es compatible con cualquier esclavo? ¿Estaría bien enviar una tonelada de pulsos (por ejemplo, 64 pulsos por 1 byte) al esclavo por si acaso?

Owe, buena pregunta! Parece dependiendo de quién llame al suyo estándar. Encontré un artículo de Wikipedia , Intel afirma que su estándar es: "Este estándar admite ciclos de memoria estándar con longitudes de 1 byte a 4 kilobytes de datos". No estoy seguro de por qué no de 4 bits a 1 M bytes.
@jay, ¿qué quieres decir con 'ciclos de memoria'? Entiendo que dicen que puede enviar desde 1 byte hasta 4 KB de datos, pero todavía no veo cuántos ciclos de reloj deben enviarse en total.
SPI registra uno cada uno para un bit de datos, por lo que un byte requiere 8 relojes. Por lo tanto, 4KB x 8 = 32K ciclos de reloj.
Debe mirar la hoja de datos del dispositivo que está tratando de conducir. Tiene todas las reglas. En general: siga el protocolo definido en la hoja de datos del dispositivo. Por lo general, la transacción SPI se "reinicia" cuando el maestro cambia la selección del esclavo de inactivo a activo, y luego se envía una cantidad específica de relojes, de acuerdo con la hoja de datos.
Algunos dispositivos esclavos necesitan una cantidad mínima de bytes o requieren que se envíe un byte "ficticio".
"esto significa que el implementador maestro necesita conocer los detalles impl. del esclavo (y todos los esclavos potenciales)" -- bueno, sí y no. Por ejemplo, el hardware SPI en un microcontrolador no necesita conocer todos los esclavos posibles, por lo general es suficiente tener una función de hardware para registrar un byte en el cable. (más el almacenamiento en búfer para la velocidad, tal vez) El software puede manejar los detalles de los esclavos específicos utilizados en el dispositivo, ya necesita un conocimiento específico del dispositivo de cuáles son los datos, por lo que saber si, por ejemplo, se necesita enviar un byte ficticio no es un enorme carga

Respuestas (4)

El maestro SPI no es responsable de asegurarse de que la máquina de estado interna del esclavo reciba "suficientes" pulsos de reloj. Todo lo que el maestro es responsable es un pulso de reloj por bit transferido hacia o desde el esclavo, eso es todo.

Si su esclavo necesita un reloj adicional, depende de usted administrar su implementación de una manera que admita esto; tal vez especifique que se debe transferir una cantidad mínima de bytes (incluso si algunos de ellos son bytes 'ficticios'), o tal vez tiene para proporcionar un reloj externo al esclavo además del reloj SPI.

Un esclavo SPI que se comporte bien debe restablecer su máquina de estado SPI cuando su entrada de selección de esclavo esté desactivada para que cualquier cosa que haga el maestro en una ronda de comunicaciones no necesariamente interrumpa la siguiente ronda debido a que algo está en un estado incompleto.

Una tarjeta SD en modo SPI utiliza bytes de trama. Obtiene un cierto byte repetido, luego el byte de marco, luego los bytes de datos. No es un modelo tan terrible.
Me pregunto por qué relativamente pocos dispositivos SPI proporcionan un medio para restablecer la máquina de estado de "marco" mientras se mantiene CS bajo, por ejemplo, enviando tres flancos ascendentes consecutivos en MOSI mientras CLK se encuentra bajo. Para aplicaciones que solo necesitan un único periférico SPI, eso ahorraría un pin de E/S en la MCU de control.
@supercat, ¿es más barato vincular CS a las líneas de reinicio de algunos componentes que implementar un contador?
@supercat, posiblemente porque eso impondría requisitos de procesamiento adicionales en esclavos simples de estilo de registro de desplazamiento.
En general, ¿los dispositivos SPI reciben dos señales de reloj, una para el procesamiento de bytes y otra más rápida para el procesamiento de la máquina de estado? ¿Sería esto una mala práctica? ¿Se consideraría un mejor diseño enviar bytes de trama como se explicó anteriormente, para ahorrar energía?
@Martel En mi experiencia, el reloj esclavo SPI depende de cuántos relojes adicionales (si corresponde) necesita el dispositivo para hacer su trabajo internamente. Si solo necesita unos pocos relojes adicionales además de los que se necesitan para transferir datos, a menudo se usa el método de 'bytes ficticios' donde se transfieren un par de bytes adicionales con datos sin sentido solo para proporcionar esos relojes. Si el esclavo necesita muchos relojes adicionales (o reloj continuo), tendrá su propio reloj interno o un pin de reloj adicional.

La respuesta a cualquier pregunta sobre el protocolo SPI es: ¡no hay protocolo SPI! Es la forma más simple posible de transferir datos en serie, esencialmente solo un registro de desplazamiento. Eche un vistazo a un módulo SPI típico en una MCU y verá los problemas asociados con el hecho de que no hay un estándar (por ejemplo, qué borde capturar).

Necesita un método para mantener el receptor SPI recibiendo un reloj local y no confiar en que la fuente SPI proporcione un reloj para hacer algo más que registrar datos en serie. Puede usar el reloj SPI compartido para transferir datos, pero use un reloj local para mantener su máquina de estado.

SPI no es un protocolo en ese sentido al que te refieres.

Es solo una interfaz para transferir bits automáticamente en serie, más comúnmente en múltiplos de ocho para transferir bytes entre dispositivos.

Claro, es un protocolo en el sentido de que todas las partes deben acordar cómo enviar datos, incluidas cosas como la fase del reloj para saber en qué borde se cargan los datos y cuál es la polaridad del reloj inactivo.

Y encima depende de los dispositivos usar un protocolo de bits o bytes, para saber qué significan los bits y bytes.

Básicamente, si su receptor SPI necesita cierta cantidad de bits, entonces el transmisor SPI debe transferir esa cantidad de bits, ni más ni menos. Depende de usted qué contienen esos bits y cómo funciona su receptor SPI si no se transmite la cantidad correcta de bits.

La reacción del esclavo a una transferencia MOSI depende completamente de usted, ya que está diseñando el comportamiento del esclavo.

Si la transferencia es la única vez (cuando el marco está activo), para que el esclavo responda, tiene que ajustar su comportamiento para terminar durante el marco O tiene que implementar y describir ese comportamiento para que un maestro que usa esa capacidad esté registrando Datos MOSI lo suficientemente largos (datos de relleno) para permitir que el esclavo se complete.

Ese es el quid de la cuestión.

Un ejemplo de donde he visto esto es en la parte de Microsemi SmartFusion 2 (MS2090):

No es tan extraño o inusual en realidad. El Microsemi M2S090 tiene una condición similar cuando sondea HW_STATUS. El MOSI envía 0xFF, y mientras registra el comando, los datos MISO contienen la respuesta. En el mismo marco, mientras se registra el comando MOSI no después, 0xFFse registra como esclavo.

Compare el contraste con otros comandos en los que después de que la carga útil se sincroniza con MOSI, el maestro mantiene la trama activa, sincroniza más datos con MOSI para que el esclavo pueda responder según algún requisito. El maestro es lo que mantiene activo el marco y mientras está activo mantiene el reloj en marcha.

Es su diseño y por lo tanto sus requisitos.

Lo que hice para investigar para una comparación fue ejecutar algunas placas Arduino M/S y evaluar el comportamiento. Usé este escenario para validar una expectativa de que el Esclavo reaccionara a lo que era el comando/datos MOSI.

EDITAR: Pensándolo bien, esto no depende completamente de ti. De hecho, existen estándares alrededor de los cuales se basan los proveedores externos. Si está completamente seguro de que su jardín amurallado de uso de FPGA y SPI está aislado, haga lo que quiera. Pero si cualquier dispositivo de terceros está destinado a conectarse y realizar transacciones con su maestro , entonces se debe tener cuidado con la conducta del maestro durante un marco de transferencia SPI. (Estoy pensando aquí en Modo, y hay artículos en wikipedia, etc. sobre esto, así como su hoja de datos de su silicio sería un lugar aún mejor para buscar).