Estoy intentando configurar las comunicaciones SPI en una placa de pruebas entre dos microcontroladores PIC18LF2550. Estoy usando un reloj bastante lento de ~ 750kHz, esperando ~ 300us entre bytes, y la integridad de la señal en el alcance se ve bien.
Estoy usando el modo SPI 0,1 (es decir, con bits de configuración en los PIC maestro y esclavo configurados en CKP = 0, CKE = 0), con una línea de selección de esclavo. He borrado el bit SMP tanto en el maestro como en el esclavo (esto es necesario para el esclavo), lo que significa que SDI se muestrea en medio del tiempo de salida de datos.
Cuando desconecto el esclavo por completo y devuelvo el SDO maestro al SDI maestro, la comunicación funciona de manera confiable. Además, si agrego un retraso de aproximadamente 100 ns (5% del período de reloj) al reloj o a las líneas de datos, la conexión sigue siendo confiable; esto es de esperar, ya que el muestreo está en el medio del tiempo de salida de los datos. Esto, y el hecho de que todas las líneas (SDO / SDI / SCK / SS) coinciden con la figura 19-3 de hoja de datos (pág. 203) (con CKE = CKP = SMP = 0) me hace pensar que el maestro está funcionando correctamente.
Cuando la MCU esclava está conectada, los datos enviados desde el esclavo al maestro siempre se reciben de forma confiable, pero solo alrededor del 50% de los bits enviados desde el maestro se reciben correctamente en el esclavo. Los datos incorrectos recibidos generalmente se desplazan un bit "antes", como si el esclavo estuviera sincronizando los datos al final del período de reloj, y en su lugar a menudo los datos se leen del siguiente bit. Esta hipótesis se apoya en el hecho de que si la línea SDO maestra (SDI esclava) se retrasa unos nanosegundos, los datos son 100% correctos, mientras que si la línea SCK se retrasa unas pocas ns, los datos recibidos son 100% incorrecto.
El muestreo de entrada en el esclavo, por lo tanto, parece estar ocurriendo al final del bit de datos, pero me gustaría que ocurriera en el medio del bit de datos. Sin embargo, la hoja de datos implica que, en modo esclavo, ¡el muestreo solo puede ocurrir en medio de un bit de datos! (SMP debe ser borrado, como está en mi código). Si hubiera configurado CKP o CKE incorrectamente, esto podría llevar a muestrear en el momento incorrecto, pero ambos están configurados a 0 tanto en el maestro como en el esclavo según sea necesario, y los bits en las líneas SDI / SDO no están a la mitad de un bit de sincronización, como podría esperarse si la polaridad del reloj se configuró incorrectamente en un PIC.
¿Alguien puede sugerir lo que está pasando?