Decodificación de un protocolo serie SPI de dos hilos

1

Estoy trabajando en un proyecto que involucra el sensor óptico de un mouse. Tengo el PCB de control original (todavía lleno, a excepción del sensor óptico en sí mismo), y tengo el sensor óptico en mi PCB personalizado, que se supone que está controlado por un nrf51822. He conectado los pines de reloj + datos (es una interfaz de dos hilos) a ambas placas, controlados por el tablero de control original (puse el reloj y los pines de datos como entradas sin resistencias de tracción).

Estoy intentando capturar el tráfico para determinar qué señales se están enviando, pero no estoy teniendo mucha suerte. Sospecho que mi velocidad de reloj es demasiado baja. Tan rápido como sea posible (justo dentro de un bucle while true ), estoy escaneando mi pin de reloj y mi pin de datos, luego los imprimo a la salida de mi consola sobre UART a 1M baudios. La ejecución de este bucle en blanco durante 5 segundos da como resultado ~ 4000 ciclos, lo que significa que obtengo > 1 ms de tiempo de ejecución para cada bucle, lo que creo que es mi principal problema.

Tal como está, capturo (en aproximadamente 700 exploraciones) 100 grupos de "reloj 1 y datos 1" y "reloj 0 y datos 0" alternos: cada grupo tiene 4-9 elementos (es decir, 4-9 " 1s "en ambos, seguido de 4-9" 0s "en ambos). Luego, alrededor de 400 exploraciones más tarde (~ 0.5 segundos) obtengo lo mismo, pero 54 grupos. En ese momento dejé de escanear.

¿Hay alguna manera de: A) ¿Acelerar mi ciclo de exploración para que pueda capturar el tráfico con mayor precisión? o B) ¿Decodificar lo que ya tengo (dudoso)?

¿Debo considerar una ruta alternativa? No he encontrado ningún acceso a un osciloscopio, lo cual es ... desafortunado.

Apreciaría cualquier consejo. Gracias.

    
pregunta Helpful

2 respuestas

2

Como Chris Stratton indicó en sus comentarios a la otra respuesta, necesita cambiar la forma en que funciona su software.

Hay dos opciones:

Opción 1:
Ejecutar en un bucle cerrado sondeando los pines y grabando una marca de tiempo en un búfer cuando cambian de estado. Si el valor no ha cambiado, no hagas nada.
Una vez que el búfer está completo, los tiempos registrados en el enlace serial.

Opción 2:
Utilice las entradas de línea serie y reloj como interrupciones. Cuando los pines cambian el registro a un búfer, una marca de tiempo para la transición y el nuevo estado del pin.
Haga que un bucle de fondo envíe los datos registrados en el puerto serie para mantenerse al día con los datos lo mejor que pueda e indicar si el búfer se ha desbordado.

Ambos resuelven el gran problema que tiene, que está intentando generar datos en serie desde un código crítico en el tiempo, Printf es lento y los puertos en serie funcionan a un ritmo glacial, nunca los haga en una sección del código. que necesitas para correr rápido. La opción 1 es más sencilla y probablemente se ocupará de frecuencias ligeramente más altas, pero solo se registrará durante el tiempo que tenga espacio para almacenar en búfer y posiblemente podría informar que dos bordes muy juntos están en el orden incorrecto. La opción 2 da salida mientras se está ejecutando y, por lo tanto, debería poder ejecutarse durante más tiempo (ya sea 1 borde más o se mantenga y se ejecute indefinidamente, depende de las velocidades de los bordes y del puerto serie), pero debido a la sobrecarga de interrupciones, tendrá una parte superior inferior. Velocidad y es más complejo de codificar.

La otra solución obvia es pedir prestado / alquilar un osciloscopio o analizador lógico de alguien.

    
respondido por el Andrew
1

El NRF51822 utiliza un ARM Cortex M0, que parece singularmente inadecuado para su tarea de captura. El Cortex M0 usa cualquier cosa de 1 a 4 ciclos para las instrucciones básicas y mucho más tiempo si usa cosas como multiplicar. El procesador no puede ser interrumpido dentro de una instrucción básica de decodificación.

Si desea capturar datos, sería mucho mejor con un pequeño ciclo de 8 bits por procesador de instrucciones, como el ATMega328. Debería poder conectar un Arduino Nano de $ 3 para serializar los datos y la salida a través del puerto serie.

Como el protocolo es síncrono, debería poder usar el SPI en modo esclavo para recibir los datos. Debe comenzar a leer la excelente cobertura de SPI de Nick Gammons para comenzar.

Si usas un esclavo SPI, entonces efectivamente debes rellenar 8 bits en la cola de UART cada 8 ciclos del reloj de tu dispositivo. Solo recuerde que este método de captura no capturará huecos (sin relojes), por lo que obtendrá un volcado denso (sin espacios en blanco) de los datos.

Para comprender por qué el ARM Cortex M0 es deficiente en la velocidad de interrupción o en los puertos de captura de bits, lea this y this .

    
respondido por el Jack Creasey

Lea otras preguntas en las etiquetas