Continuando con una pregunta que hice hace algún tiempo: Implementación simple de la interfaz BiSS C para un codificador de posición . He implementado un maestro BiSS simple (punto a punto) para comunicarse con un codificador. A frecuencias inferiores a 2 MHz y longitudes de cable cortas, el software funciona perfectamente utilizando el módulo SPI en el microcontrolador PIC.
Sin embargo, probé alta velocidad (3 a 10 MHz) y un cable de 10 m, que debería funcionar. Me encontré con un problema de retraso de propagación. Parece que el protocolo necesita una implementación de compensación de retraso ciclo por ciclo.
Probé un enfoque en el que dependo de la secuencia de inicio (ACK y bit de inicio) y cambio el resultado en 1 o 2 o 3 bits dependiendo de cuántos relojes se retrasó el bit de inicio. Pero no funciona todo el tiempo, el problema parece ser que los datos pueden cambiar en cualquier fracción del reloj (por ejemplo: 1/8, 1/4, 1, 1.5), por lo que MISO no está decodificando a la derecha. tiempo todo el tiempo.
¿Alguien tiene ideas sobre la forma correcta de implementar dicha función en el microcontrolador? (Puedo agregar un par de componentes discretos y puertas lógicas si es necesario) pero no un FPGA.
*EDITAR (Captura de pantalla del osciloscopio) usando funciones SPI estándar *
Captura de pantalla del osciloscopio al colocar datos directamente en el búfer SPI sin esperar ni ninguna función en absoluto
Captura de pantalla cuando se usa el modo Buffered, 2 spi escribe. Tenga en cuenta que la señal está limpia, pero la sonda del osciloscopio y el pin de tierra no estaban inactivos al tomar la foto.
Supongo que el retraso es de alguna manera constante o con un pequeño jitter y la señal llega a SPI en buena forma.
Actualizado después de las observaciones de OP de que la comunicación SPI no es consecutiva como supuse, por lo que se pierden algunos bits entre fotogramas.
Actualice después de la sugerencia de Andy, la solución correcta es usar el sensor BISS y PIC SPI en modo esclavo y generar dos relojes, ya sea externamente controlados por una salida PIC o internamente usando la comparación de salida del temporizador, o de otra manera
Con ambos relojes inactivos en "1", inicie DMA para recibir SPI, inicie el reloj de la interfaz BISS, agrupe el bit ACK y luego inicie el reloj PIC SPI. El muestreo en el medio asegurará suficiente margen de riesgo. Los datos se alinearán en palabras, no es necesario cambiarlos. El segundo DMA para transmisión ficticia ya no es necesario.
Puede encontrar en el documento de Microchip sobre el módulo de comparación de salida, página 9, cómo usar el módulo de comparación de salida para generar un reloj a partir de un nivel alto. La velocidad puede ser de hasta 1/8 del reloj del sistema.
Dependiendo de las capacidades de PIC, podría ser posible que el pin del reloj SPI (entrada porque usamos SPI en modo esclavo) se controle mediante el uso de PPS sin usar otro pin y una conexión cableada externa.
En este caso, usando el cambio de software como se muestra a continuación, la placa se puede usar sin ninguna modificación de hardware.
Usando la solución de OP para cambiar los datos retrasados:
Para obtener lecturas confiables, lo primero que debe hacer es cambiar el bit SMPx de la fase de muestra de entrada de datos para muestrear los datos al final en lugar del medio como supongo que es. O en el medio si es al final ahora
(La imagen tiene un error, el primer borde de la "muestra al final" no es un borde de lectura activo).
Sería mejor saber por software qué borde de muestra es mejor usar.
La descripción se hace para datos de cambio de esclavo SPI en el primer flanco descendente, para la interfaz BISS que cambia ACK en el segundo flanco ascendente, puede hacer las correcciones necesarias agregando 0.5 Tckh o 1.5 Tckh al retraso.
Ponga su reloj SPI en el valor utilizable más alto Ckh (período Tckh), cuente los bits hasta que llegue ACK, cambie el bit de fase de muestra de entrada de datos SMPx, envíe otro mensaje y cuente los bits nuevamente.
Eso le dará una aproximación de medio período de reloj de la demora. Úselo para elegir el punto de muestreo para el reloj que realmente usa Ck (período Tck). Si la velocidad que usas es como mucho la mitad entonces es suficiente.
Si las lecturas tienen el mismo número de "1" hasta ACK, entonces el retraso es entre (N_ones) x Tckh y (N_ones + 1/2) x Tckk
Si la lectura final tiene un "1" más que el retardo está entre (N_unos + 1/2) x Tck y N_unos+1 x Tck
Volvamos al reloj que realmente usará. Si un multiplicador del período de reloj Tck toca el área de retardo, use la muestra en el medio, si no, use la muestra al final. Si usó Ckh más del doble, entonces use el tiempo de muestreo más alejado del área de retardo.
Actualice, corrigió la representación invertida de la señal en el texto y agregue algún gráfico para una mejor comprensión
Mismo número de uno usando reloj rápido, retraso entre 5 y 5.5 Tckh:
El muestreo en el medio usando un reloj rápido lee un "1" adicional. Retardo entre 5,5 y 6 Tckh. ( 6 "1" para muestrear en el medio, no 5 como está en la imagen )
Usando el reloj SPI, use el borde de muestreo más alejado del área de retardo.
Los diagramas se realizaron utilizando el editor en línea WaveDorm
BeB00
electrones
BeB00
electrones
BeB00
dorio
electrones
dorio
dorio
Andy alias
electrones
Andy alias
dorio
electrones
dorio
dorio