El valor de SPI Loopback recibido es la mitad del valor transmitido

Estoy probando SPI de mi microcontrolador PIC24E512GU814. Para probar, conecté MOSI a MISO.

Escribí el siguiente código para la inicialización de SPI:

SPI3CON1 = 0; 
SPI3CON1bits.CKE = 1;
SPI3CON1bits.SPRE = 7;
SPI3CON1bits.PPRE = 3;
SPI3CON1bits.MSTEN = 1;
SPI3STATbits.SPIEN = 1; 

Luego para transmitir/recibir el siguiente código:

SPI3_ENABLE = 0;  //chip select
delayUs(1);
while (SPI3STATbits.SPITBF);
SPI3BUF = test;
while (!SPI3STATbits.SPIRBF)
{
      if (--timeout == 0)
      {
          debugOutput(0, "\r\nTimeout SPI 3\r\n");
      }
}
temp = SPI3BUF;
debugOutput(0, "\r\nValue read on SPI 3 Port:%d\r\n", temp);
SPI3_ENABLE = 1;

Siempre obtengo la mitad del valor transmitido. Por ejemplo, si transmito 54, estoy leyendo 27 en el búfer de recepción. ¿Cuál puede ser el problema?

Modificado el código a lo siguiente no ayudó

delayUs(1);
//writeSPI(eSpiPort3, &test, sizeof(byte));
debugOutput(0, "\r\nWriting on SPI 3 Port:%d\r\n", test);
SPI3_ENABLE = 0;
while (SPI3STATbits.SPITBF);
SPI3BUF = test;
while (!SPI3STATbits.SPIRBF)
{
    if (--timeout == 0)
    {
        debugOutput(0, "\r\nTimeout SPI 3\r\n");
    }
}
temp = SPI3BUF;
SPI3_ENABLE = 1;
delayUs(1);   
debugOutput(0, "\r\nValue read on SPI 3 Port:%d\r\n", temp);
54 en binario es 110110, 27 es 11011, el último bit parece perderse. ¿Ha visto las formas de onda de MOSI y MISO en un osciloscopio o un analizador lógico? Intente habilitar CS antes de la llamada debugOutput e intente deshabilitar delayUs al principio y observe las formas de onda de datos.
He actualizado el código después de hacer modificaciones. Todavía no hay ayuda. El valor recibido es la mitad. Tengo que probar Logic Analyzer. Tengo buspirate. Pero no funcionará ya que no es compatible con el modo esclavo.
Este tipo de problema suele ocurrir porque el modo o el borde de captura es incorrecto; ¿Cuál es la configuración de su puerto?
La configuración de pines es correcta. SDO3 es salida, SDI3 es entrada, SCK3 es salida y SS3 es salida
@md.jamal Ha configurado PPRE y SPRE en 1: 1. Esto es del manual de referencia: no configure los preescaladores primario y secundario en el valor de 1: 1 al mismo tiempo. Página 9 ww1.microchip.com/downloads/en/DeviceDoc/70005185a.pdf
Comentar la línea que configuró SPRE hizo el trabajo. Ahora obtengo el mismo valor que estoy transmitiendo en loopback... Gracias. Puedo aceptarlo como respuesta si publicas.

Respuestas (1)

Ha configurado los bits PPRE y SPRE en el registro SSPI3CON1 a 1:1. Esto es de la página 9 del manual de referencia .

No configure los preescaladores primario y secundario al valor de 1:1 al mismo tiempo.