SPI Loopback valor recibido es la mitad del valor transmitido

3

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?

Modificó el código de la siguiente manera 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);
    
pregunta md.jamal

1 respuesta

4

Ha establecido los bits PPRE y SPRE en el registro SSPI3CON1 en 1: 1, esto es de la página 9 de manual de referencia

  

No establezca los precalificadores primarios y secundarios en el valor de 1: 1   al mismo tiempo.

    
respondido por el Abel Tom

Lea otras preguntas en las etiquetas