¿Qué está pasando con estas transmisiones SPI?

Acabo de recibir un analizador lógico Saleae y lo estoy usando para hackear una batería de Guitar Hero . La placa principal dentro de la batería se comunica con otra placa secundaria mediante SPI. Cuando entro en la conversación, veo esto:

ingrese la descripción de la imagen aquí

El negro es MOSI, el marrón es MISO, el rojo es CLOCK y el naranja es HABILITAR/selección de esclavo.

Me doy cuenta de dos cosas extrañas que suceden aquí:

  1. El reloj no siempre "corre". Ciertamente tiene un patrón: se ejecuta cuando ENABLE es bajo (cada 100 Hz).
  2. Incluso cuando ENABLE es alto (que supongo que significa que el esclavo no está seleccionado), se produce una conversación entre el maestro y el esclavo.

¿Alguien tiene una idea de lo que está pasando aquí? ¿Los diseñadores de la placa se volvieron perezosos o hice algo mal al capturar los datos?

Detalles:

  • Capturado a 4 MHz
  • El reloj funciona a 2 MHz, cuando en realidad está funcionando

Aquí hay otra vista, ampliada:

ingrese la descripción de la imagen aquí

Obviamente, ninguna de estas imágenes proporciona mucha información sobre lo que realmente se "dice", ya que no acerqué lo suficiente. Pero creo que son suficientes para entender mi punto. Si desea una imagen diferente, solo pregunte.

EDITAR

Kris sugirió que la línea de habilitación se use para sondear la placa esclava en el muestreo. Esto tiene sentido. Mira esta captura de pantalla:

Las pequeñas burbujas negras con contornos rojos son instancias en las que el software pudo decodificar una transmisión SPI. Estos solo ocurren cuando la línea de habilitación es baja, lo cual sigue lo que sugirió Kris.

ingrese la descripción de la imagen aquí

Las líneas de habilitación no siempre se utilizan como una línea CS en el sentido tradicional. En el caso de algunos dispositivos ADC, la línea "habilitar" es para decirle al dispositivo que realice una conversión, luego, una vez que se realiza la conversión, el host simplemente registra los datos del esclavo. Estoy seguro de que esto se ha hecho muchas veces antes. Buscaría en Internet y vería lo que otras personas tienen que decir sobre el protocolo utilizado aquí.
Esto es lo único que pude encontrar en él: members.home.nl/mathijs .
He añadido otra captura de pantalla. Como sugirió, parece que los datos reales solo se transmiten cuando la línea de habilitación es baja. ¿Las otras veces supongo que son solo datos basura?
¿Has considerado la posibilidad de que haya otros esclavos en ese autobús? Usarían diferentes líneas de selección de esclavos pero el mismo MISO, MOSI y CLK, por lo que verías, bueno, casi exactamente lo que estás viendo. Sus formas de onda parecen varios esclavos siendo consultados uno tras otro, periódicamente.
@Thorn, deberías poner eso como respuesta. Personalmente creo que tienes razón.
@JonL: respuesta agregada.

Respuestas (3)

Creo que el autobús que estás viendo simplemente tiene múltiples esclavos. Comparten MISO, MOSI y CLK, pero tienen líneas de selección de esclavos dedicadas para cada uno de ellos. La señal ENABLE en sus formas de onda es una de esas selecciones esclavas. Puede buscar otras selecciones de esclavos en los pines del chip maestro si desea probar esta hipótesis.

Observe cómo las señales parecen cambiar de polaridad de un esclavo a otro (más notable en el reloj). Tal vez diferentes esclavos usen diferentes modos SPI .

Las formas de onda parecen repetirse con un período determinado, lo que indicaría que el maestro consulta a los esclavos uno tras otro en un bucle.

No creo que este sea el caso. Si echa un vistazo al enlace que publiqué ( members.home.nl/mathijs ), hay una imagen del tablero un poco hacia abajo. Solo hay un cable plano que conecta las dos placas, con 6 cables (VCC, GND y 4 líneas para SPI). Estoy bastante seguro de que solo hay un esclavo SPI.
@SimpleCoder: ¿qué pasa con la placa principal? También puede tener esclavos.
Tienes mucha razón. Me había olvidado del transmisor en la placa principal (la batería es inalámbrica). Encontré al menos un CS más que representa el resto de las transmisiones. ¡Gracias por tu ayuda!

Thorn tiene toda la razón. Lo que estás viendo es bastante normal.

En primer lugar, se pueden conectar varios periféricos a un bus SPI. Todos comparten las líneas MOSI, MISO y CLK. Pero cada uno tiene su propia línea CS. (Solo por simplicidad, aquí no he mostrado la línea MISO)

Conexiones SPI

Si la MCU quiere enviar un byte a ADC1, primero baja CS1. Luego envía 8 pulsos de reloj en la línea CLK mientras escribe los bits de datos en la línea MOSI. Mientras esto sucede, CS2 y CS3 permanecen altos.

Para enviar un byte a cada ADC, uno podría ver una forma de onda como la siguiente:

Formas de onda SPI

Vea mi comentario sobre la respuesta de Thorn.

Tu mismo lo dijiste:

Detalles:

Capturado a 4 MHz El reloj funciona a 2 MHz, cuando en realidad está funcionando

También hay algo llamado Frecuencia de Nyquist , o Límite de Nyquist. Básicamente dice que la frecuencia más alta que puede ver es menos de la mitad de la frecuencia de muestreo. Entonces, si su frecuencia de muestreo es de 4 MHz, solo puede ver frecuencias de menos de 2 MHz. Hay algo importante aquí en lo que la mayoría de la gente se equivoca. Puede ver frecuencias hasta, pero sin incluir , la mitad de la frecuencia de muestreo. Entonces, a 4 MHz, no puede ver correctamente las frecuencias de 2 MHz.

El efecto secundario de esto también se llama "aliasing". Lo que esto significa en términos prácticos es que si está mirando una señal que está cerca, pero no exactamente a 2 MHz, entonces parecerá que la señal va y viene. Por un tiempo ese reloj estará ahí, luego se irá. Esto es lo que creo que está pasando en tus fotos, donde el reloj a veces no está ahí cuando creo que debería estar. Algo similar también puede suceder con sus datos.

Para obtener datos confiables para depurar esto, debe tener al menos 4x y, a veces, 16x de su frecuencia máxima. Entonces, para un reloj de 2 MHz, debe capturar datos de 8 a 32 MHz.

Nyquist se aplica a señales analógicas; si uno muestrea una señal de frecuencia F también a una tasa S y luego la emite, el resultado contendrá una mezcla de frecuencias kS+F y kS-F, para todos los enteros k; si la entrada no contiene nada fuera del rango 0..S/2, y uno elimina de la salida todo lo que está fuera del rango 0..S/2, la onda resultante coincidirá con la entrada. Las formas de onda "digitales" (de dos niveles) tienen una gran cantidad de armónicos que, en la mayoría de las aplicaciones prácticas, estarán muy por encima del límite de Nyquist, por lo que Nyquist no es realmente aplicable a las señales de dos niveles. En cambio...
...lo que importa es el sesgo de tiempo introducido por el muestreo. Si se muestrea a 4 MHz, eso significa que habrá una incertidumbre de 250 ns en cuanto a cuándo se produce un cambio de señal. Si dos bordes ocurren dentro de los 250 ns uno del otro, es posible que no sea posible determinar cuál fue primero o si hubo algún tiempo entre ellos. Un pulso de 100 ns en un solo pin puede aparecer como un pulso de 250 ns o como un pulso de 0 ns (es decir, sin pulso).
@supercat También se aplica a esto. Supongamos que tiene un reloj de ciclo de trabajo del 50 % de 2,00001 MHz y lo está muestreando a 4 MHz. Hay dos cosas que podemos decir sobre esto: 1. El período del reloj será un poco más corto que el intervalo de muestreo. 2. La fase entre el reloj y el muestreo se desviará lentamente. Cuando la fase está alineada correctamente, el reloj se muestreará como siempre bajo durante varias muestras seguidas. Posteriormente se muestreará como siempre alto durante varias muestras seguidas. Durante un tiempo prolongado, el reloj parecerá desaparecer y luego regresar. Eso es alias.
Al muestrear señales analógicas de forma asíncrona, si la señal de entrada se ajusta por completo al rango 0..S/2 (sin incluir los puntos finales), será posible reconstruirla con precisión. Nyquist dice que será suficiente muestrear a más del doble del componente de frecuencia más alto. Cuando se muestrean señales de dos niveles de forma asíncrona, es posible que se requiera un muestreo a tasas mucho más altas. La razón es que el filtrado analógico y el muestreo de una señal de dos niveles convertirán los anchos de pulso en amplitudes que luego se pueden capturar con precisión. El muestreo de dos niveles simplemente agrega incertidumbre a los anchos de pulso.
@supercat Puede verlo de esa manera si lo desea, pero el efecto neto es el mismo: si su "incertidumbre con respecto a los anchos de pulso" es mayor que su ancho de pulso real, entonces tiene problemas importantes con la forma de onda que está viendo.
En cualquier caso, volveré a muestrear los datos a 8 MHz más tarde. Gracias,
@DavidKessner: Si lo que se sabe que es una señal de entrada de dos niveles se filtrara analógicamente a algo por debajo de la tasa de Nyquist y luego se muestreara como niveles analógicos, la cantidad de información contenida en tales muestras excedería en gran medida la presente en un bi-nivel. captura de nivel. Por ejemplo, si uno estuviera muestreando a 10 KHz y quisiera medir el ancho de los pulsos que llegan a intervalos de aproximadamente 1 ms, podría determinar los anchos con una resolución mucho mejor que 100 us midiendo la energía en ellos. Pero si fueran muestreados en dos niveles, uno no podría.