Полученное значение SPI Loopback составляет половину переданного значения

Я тестирую SPI своего микроконтроллера PIC24E512GU814. Для проверки я подключил MOSI к MISO.

Я написал следующий код для инициализации SPI:

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

Затем для передачи/получения следующего кода:

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;

Я всегда получаю половину переданного значения. Например, если я передаю 54, я читаю 27 в приемном буфере. В чем может быть проблема?

Изменил код на следующий не помогло

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 в двоичном коде — это 110110, 27 — это 11011, кажется, что последний бит потерян. Вы видели формы сигналов MOSI и MISO на осциллографе или логическом анализаторе? Попробуйте включить CS перед вызовом debugOutput и попробуйте отключить delayUs в начале и понаблюдайте за осциллограммами данных.
Я обновил код после внесения изменений. Все равно никакой помощи. Полученное значение равно половине. Надо попробовать Logic Analyzer. У меня буспират. Но это не сработает, так как не поддерживает ведомый режим.
Такого рода проблемы обычно возникают из-за неправильного режима или границы захвата; какая у вас настройка порта?
Конфигурация контактов правильная. SDO3 выводится, SDI3 вводится, SCK3 выводится и SS3 выводится
@md.jamal Вы установили PPRE и SPRE на 1: 1. Это из справочного руководства: не устанавливайте первичный и вторичный предварительные делители на значение 1: 1 одновременно. Страница 9 ww1.microchip.com/downloads/en/DeviceDoc/70005185a.pdf
Комментирование строки, в которой установлен SPRE, сделало свое дело. Теперь я получаю то же значение, которое я передаю в петле. Спасибо. Я могу принять это как ответ, если вы опубликуете.

Ответы (1)

Вы установили биты PPRE и биты SPRE в регистре SSPI3CON1 на 1:1, это со страницы 9 справочного руководства .

Не устанавливайте первичный и вторичный предварительные делители на значение 1:1 одновременно.