SPI esclavo no confiable en PIC18LF2550

3

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?

    
pregunta Chris Johnson

2 respuestas

2

Como señala Sphero Pefhany, la lista de erratas de silicona para el PIC18F2455 / 2550/4455 / 4550 familia es extensa. En particular, se lee errata 37 (aplicable a tres revisiones, incluidos mis chips de revisión B5)

  

Si está configurado en el modo esclavo SPI, el MSSP puede no ser exitoso   Reconocer paquetes de datos generados por un procesador maestro externo. Esta   se aplica a todos los modos esclavos SPI (CKE / CKP = 1 o 0), ya sea o no   la selección de esclavos está habilitada (SSPM < 3: 0 > = 010x).

     

Solución: : inserte un   Resistencia en serie entre el SPI master Serial Data Out (SDO) y el   Línea de entrada correspondiente de datos de serie (SDI) del esclavo SPI de la   microcontrolador El valor requerido para la resistencia varía con el   Características del sistema de aplicación y las variaciones del proceso.   Entre los microcontroladores. La experimentación y la prueba a fondo son   animado.

Supongo que el propósito de esta resistencia es ralentizar la transición de datos, hacer que el muestreo al final del período de reloj (más) sea confiable.

Este error se ha corregido en la última revisión (B7).

    
respondido por el Chris Johnson
0
  

Supongo que el propósito de esta resistencia es ralentizar la transición de datos, hacer que el muestreo al final del período de reloj (más) sea confiable.

El resistor en serie reduce el timbre y el exceso / subestimación. No afecta significativamente la colocación del borde.

Eléctricamente, está creando un filtro RC de paso bajo, con la capacitancia suministrada principalmente por la entrada, y en menor medida por cualquier diseño disperso y capacitancia de pin a pin.

A medida que filtre las frecuencias más altas, los bordes serán menos nítidos y más redondeados. La clave es no agregar demasiada resistencia para que el borde sea demasiado lento / redondeado.

Por lo general, se usa una resistencia de bajo valor, desde 22 ohmios hasta 470 ohmios. Tiendo a usar 100 ohmios o 220 ohmios, pero el valor utilizado depende de la frecuencia de operación.

    
respondido por el Dave Null

Lea otras preguntas en las etiquetas